JAvaグラフィックインタフェースのレイアウト設計

9115 ワード

インタフェース設計では、1つのコンテナに多くのコンポーネントを配置し、美しくするために、コンポーネントのコンテナ内の位置を配置します.これがレイアウト設計です.java.awtには複数のレイアウトクラスが定義されており、各レイアウトクラスはレイアウトのポリシーに対応しています.一般的に使用されるレイアウトクラスは次のとおりです.
•FlowLayout、コンポーネントを順番に配置します.•BoarderLayout、コンポーネントを境界に配置します.•CardLayoutは、コンポーネントをトランプのように重ねて、毎回1つのコンポーネントしか表示できません.•GridLayoutは、表示領域を行、列ごとに等間隔の格子に分割し、これらの格子にコンポーネントを順次入れる.•GridBagLayoutは、表示領域を多くの矩形の小さなセルに分割し、各コンポーネントが1つ以上の小さなセルを占有することができる.
その中でもGridBagLayoutは細かい位置制御が可能で、最も複雑で、このチュートリアルではこのようなレイアウト戦略については議論せず、特集記事で詳しく説明します.
各コンテナには、コンテナ内に配置されたコンポーネントの配置方法を決定するレイアウトマネージャがあります.レイアウトマネージャは、LayoutManagerインタフェースを実装するクラスです.
一.FlowLayoutレイアウト(JApplet,JPanel,JscrollPaneデフォルトレイアウト)
FlowLayoutレイアウトは、コンポーネントを追加した順に左から右に並べ、1行がいっぱいになったら1行に移動して左から右に並べ、各行のコンポーネントが中央に並べられます.これは最も簡便なレイアウト戦略であり、一般的にコンポーネントが多くない場合に用いられ、コンポーネントが多い場合、コンテナ内のコンポーネントは高低が異なり、各行の長さが異なる.
FlowLayoutは小さなアプリケーションとパネルのデフォルトレイアウトです.FlowLayoutレイアウトの構築方法は次のとおりです.
1.FlowLayout()は、デフォルトのFlowLayoutレイアウトを生成します.既定では、コンポーネントは中央で、ギャップは5ピクセルです.2.FlowLayout(int aligment)ホーニング毎のセットの位置合わせを設定します.alignmentの値はFlowLayout.LEFT,FlowLayout.CENTER,FlowLayout.RIGHT. 3.FlowLayout(int aligment,int horz,int vert)、整列方式を設定し、コンポーネントの水平ピッチhorzと垂直ピッチvertを設定し、スーパークラスContainerの方法setLayout()でコンテナにレイアウトを設定します.たとえば、コードsetLayout(new FlowLayout()はコンテナにFlowLayoutレイアウトを設定します.コンポーネントをコンテナに追加する方法はadd(コンポーネント名)です.
二.BorderLayoutレイアウト(JWindow、JFrame、JDialogのデフォルトレイアウト)
BorderLayoutレイアウト戦略は、容器内の空間を単純に東「East」、西「West」、南「South」、北「North」、中「Center」の5つのエリアに分けることです.コンポーネントを追加する場合は、コンポーネントをどの領域に配置するかを指定します.1つの位置にコンポーネントを配置します.複数のコンポーネントを1つの場所に追加する場合は、その場所に追加するコンポーネントを別のコンテナに配置してから、このコンテナをこの場所に追加します.
BorderLayoutレイアウトの構造方法は,(1)BorderLayout()であり,デフォルトのBorderLayoutレイアウトを生成する.既定では、ギャップはありません.(2)BorderLayout(int horz,int vert)は,コンポーネント間の水平ピッチと垂直ピッチを設定する.
BorderLayoutレイアウトポリシーの設定方法はsetLayout(new BorderLayout()です.コンテナにコンポーネントを追加する方法はadd(コンポーネント名、位置)で、コンポーネントを追加するときに位置が指定されていない場合はデフォルトで「中」位置です.
BorderLayoutレイアウトは、JWindow、JFrame、JDialogのデフォルトレイアウトです.【例11−5】アプリケーションには、ウィンドウの東、西、南、北、中の5つの領域にそれぞれ5つのラベルが設けられている.

 import javax.swing.*;import java.awt.*;
 public class J505{
   public static void main(String[]args){
     JLabel label1,label2,label3,label4,label5;
     JFrame mw=new JFrame("      ");//          
     mw.setSize(250,200);
     Container con=mw.getContentPane();
     con.setLayout(new BorderLayout());
     label1=new JLabel("   ");//     
     label2=new JLabel("   ",JLabel.CENTER);
     label3=new JLabel("   ");
     label4=new JLabel("   ",JLabel.CENTER);
     label5=new JLabel("   ",JLabel.CENTER);
     con.add(label1,"East");
     con.add(label2,"South");
     con.add(label3,"West");
     con.add(label4,"North");
     con.add(label5,"Center");
     mw.setVisible(true);
   }
 }

三.GridLayoutレイアウト
GridLayoutレイアウトは、コンテナをいくつかの行と列に分割するメッシュ状で、行数と列数はプログラムによって制御され、コンポーネントはメッシュの小さな格子の中に置かれます.GridLayoutレイアウトの特徴は、コンポーネントの位置付けが正確であることです.GridLayoutレイアウトでは、各メッシュが同じ形状とサイズを持つため、コンテナに入れるコンポーネントも同じサイズに保つ必要があります.
GridLayoutレイアウトの構造方法として,(1)GridLayout()があり,1列のGridLayoutレイアウトを生成する.既定では、ギャップはありません.(2)GridLayout(int row,int col)は,行rowと列colのあるGridLayoutレイアウトを設定する.(3)GridLayout(int row,int col,int horz,int vert)は、レイアウトの行数と列数、コンポーネントの水平ピッチと垂直ピッチを設定します.
GridLayoutレイアウトは動作基準で、配置されたコンポーネントの個数が超過した場合、自動的に列を追加します.逆に、コンポーネントが少なすぎると自動的に列が減少し、行数は変わらず、コンポーネントは行優先順に並べられます(コンポーネントによって列が自動的に増減します).GridLayoutレイアウトの各グリッドには、コンポーネントを入力する必要があります.グリッドが空白である場合は、空白ラベル(add(new Label()))で置き換えることができます.
【例11-6】スモールアプリケーションは、まずいくつかのボタンといくつかのラベルをJPanelに入れ、その後JPanelをJscrollPaneに入れ、最後にJscrollPaneをスモールプログラムのウィンドウに入れ、プログラムによって作成されたJscrollPaneは常に水平と垂直スクロールバーを持ち、スクロールパネルの視認範囲はパネルの実際の要求より小さい.スクロールバーのスライダ表示パネルが表示されていない領域を移動できます.

import java.applet.*;
import javax.swing.*;
import java.awt.*;
class MyWindow extends JFrame{
  public MyWindow(int w,int h){
    setTitle("      ");
    Container con=getContentPane();
    con.setPreferredSize(new Dimension(w,h));
    con.setLayout(new BorderLayout());
    JPanel p=new JPanel();
    p.setLayout(new GridLayout(6,6));
    for (int i=0;i<6;i++){
      p.add(new JLabel());
      for(int j=1;j<=2;j++){
        p.add(new JButton("  "+(2*i+j)));
        p.add(new JLabel("  "+(2*i+j)));
      }
      p.add(new JLabel());
    }
    p.setBackground(Color.blue);
    p.setPreferredSize(new Dimension(w+60,h+60));
    JScrollPane ScrollPane=new JScrollPane(p);
    ScrollPane.setPreferredSize(new Dimension(w-60,h-60));
    add(ScrollPane,BorderLayout.CENTER);//         
    setVisible(true); pack();
  }
}
class ScrollPane extends JScrollPane{
  public ScrollPane(Component p){
    super(p);
    setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
  }
}
public class J506 extends Applet{
  MyWindow myWindow;
  public void init(){
    myWindow=new MyWindow(400,350);
  }
}


GridLayoutレイアウトでは、すべてのコンポーネントのサイズを一致させる必要があります.これは、インタフェースの外観が美しくない可能性があります.1つの救済策は、いくつかの小さなコンポーネントを1つのコンテナに統合し、このコンテナをコンポーネントとしてGridLayoutレイアウトに入れることです.これが前述のコンテナネストです.例えば、コンテナAはGridLayoutレイアウトを用いて、コンテナをメッシュに均等に分割する.また、容器BとCはそれぞれいくつかの組立体を入れた後、BとCをそれぞれ組立体として容器Aに添加する.コンテナBとCはGridLayoutレイアウトに設定したり、自分をいくつかのグリッドに分けたり、他のレイアウトに設定したりすることもできます.このように,外観から見ると,各コンポーネントの大きさに差がある.
四.CardLayoutレイアウト
CardLayoutレイアウトを採用したコンテナは、複数のコンポーネントを収容できますが、複数のコンポーネントは同じ表示空間を持ち、ある時点で1つのコンポーネントしか表示できません.トランプを重ねるたびに一番上の1枚しか表示できないように、この表示されたコンポーネントは容器のすべての空間を占めます.CardLayoutレイアウトの設計手順は、まずCardLayoutレイアウトオブジェクトを作成します.次に、setLayout()メソッドを使用してコンテナのレイアウトを設定します.最も、コンテナを呼び出すadd()メソッドは、コンポーネントをコンテナに追加します.CardLayoutレイアウトポリシーをコンポーネントに追加する方法は、add(コンポーネント番号、コンポーネント);コンポーネント名に関係なく、コンポーネント番号は文字列であり、追加されます.
たとえば、次のコードは、JPanelコンテナのCardLayoutレイアウトを設定します.

  CardLayout myCard = new CardLayout();//  CardLayout    
  JPanel p = new JPanel();//  Panel  
  p.setLayout(myCard);

CardLayoutクラスで提供されるメソッドでコンポーネントを表示する方法は、(1)show(コンテナ名、コンポーネント番号)形式のコードを使用して、コンテナ内のコンポーネントの表示を指定する2つあります.例えば、以下のコードは、コンテナpのコンポーネント番号kを指定し、このコンポーネントを表示する:myCard.show(p,k); (2)コンポーネントをコンテナに入れる順番で表示する.
first(コンテナ):コードmyCard.first(p); Last(コンテナ):たとえばmyCard.last(p); next(容器):例えばmyCard.next(p); previous(容器):myCard.previous(p);
【例11−7】スモールアプリケーションはCardLayoutレイアウトを使用し、パネルコンテナpはCardLayoutレイアウトポリシーを使用して10個のラベルコンポーネントを設定する.ウィンドウには、pの最初のコンポーネント、最後のコンポーネント、現在のコンポーネントの前のコンポーネント、および現在のコンポーネントの最後のコンポーネントを表示する4つのボタンが設けられている.

import java.applet.*;import java.awt.*;
import java.awt.event.*;import javax.swing.*;
class MyPanel extends JPanel{
  int x;JLabel label1;
  MyPanel(int a){
    x=a;getSize();
    label1=new JLabel("   "+x+"   ");add(label1);
  }
  public Dimension getPreferredSize(){
    return new Dimension(200,50);
  }
}
public class J507 extends Applet implements ActionListener{
  CardLayout mycard;MyPanel myPanel[];JPanel p;
  private void addButton(JPanel pan,String butName,ActionListener listener){
    JButton aButton=new JButton(butName);
    aButton.addActionListener(listener);
    pan.add(aButton);
  }
  public void init(){
    setLayout(new BorderLayout());//           
    mycard=new CardLayout();
    this.setSize(400,150);
    p=new JPanel();p.setLayout(mycard);//p           
    myPanel=new MyPanel[10];
    for(int i=0;i<10;i++){
      myPanel[i]=new MyPanel(i+1);
      p.add("A"+i,myPanel[i]);
    }
    JPanel p2=new JPanel();
    addButton(p2,"   ",this);
    addButton(p2,"    ",this);
    addButton(p2,"   ",this);
    addButton(p2,"   ",this);
    add(p,"Center"); add(p2,"South");
  }
  public void actionPerformed(ActionEvent e){
    if (e.getActionCommand().equals("   "))mycard.first(p);
    else if(e.getActionCommand().equals("    "))mycard.last(p);
    else if(e.getActionCommand().equals("   "))mycard.previous(p);
    else if(e.getActionCommand().equals("   "))mycard.next(p);
  }
}


五.nullレイアウトとsetBoundsメソッド
空のレイアウトは、コンテナのレイアウトをnullレイアウトに設定します.空のレイアウトはsetBounds()メソッドを使用してコンポーネント自体のサイズとコンテナ内の位置を設定します.setBounds(int x,int y,int width,int height)コンポーネントが占める領域は矩形で、パラメータx,yはコンポーネントの左上隅のコンテナ内の位置座標です.パラメータweight,heightはコンポーネントの幅と高さです.空のレイアウトでコンポーネントを配置する方法は、add()メソッドボディコンテナを使用してコンポーネントを追加する2つのステップに分けられます.次にsetBounds()メソッドを呼び出して、コンテナ内のコンポーネントの位置とコンポーネント自体のサイズを設定します.コンポーネントに関連する他の方法:
1.getSize().width, 2.getSize().height 3.setVgap(ing vgap) 4.setHgap(int hgap);