17-2:レイアウトの方針と LayoutManager

java.awtにはコンテナ内のレイアウトを自動的に行うための専用のクラスである LayoutManagerという概念が導入されています。

・ コンテナのレイアウトの方針は、そのための専用のクラスを通じて設定されます。 それらは LayoutManagerというインターフェイスを実装します。 (正確には JDK1.1から LayoutManagerをさらに拡張した LayoutManager2 と いうインターフェイスも導入されていますが、大きな違いはありません。) コンテナ内のレイアウトは、その方針に従って自動的に実行されます。 プログラマーが細かい数値をいちいち指定する必要はありません。 (JDK1.1以前のコンポーネントの場合は、 システムによって表示されるコンポーネントのサイズが微妙に異なるため、 直接数値で指定するのを避けるという意味もありました。)
JDK1.1では、 java.awtパッケージには、FlowLayout, BorderLayout,GridLayoutなど 5種類の基本的なレイアウトのクラスが用意されています。 Swing では BoxLayoutなどの汎用のレイアウトのクラスが追加されている他、 個々のコンポーネントの内部で使用する特殊化されたレイアウトのクラスが いくつか定義されています。 また、独自のレイアウトの方針に基づくクラスを設計することも可能です。

java.awtのレイアウトのクラスとその機能
クラス名ポリシーの概要
FlowLayout左から右へ、あふれたら下へ
BorderLayout "North","South","West","East", "Center" で Container内の位置を指定
CardLayout 複数のコンポーネントのうちの1つを選んで順番に表示する
GridLayout縦横の列に格子状に配置
GridBagLayout格子を単位に、 各コンポーネントのサイズや広がりをコントロール可能

・ コンテナは生成される時に自動的にレイアウトのオブジェクトも生成するのが普通です。 JPanelなどでは FlowLayoutがデフォルトです。 デフォルト以外のレイアウトのポリシーを採用したい場合には、 そのオブジェクトをコンストラクタによって生成します。

レイアウトのポリシーのコンストラクタの形式
コンストラクタ引数の働き
FlowLayout() 各行をセンタリング、コンポーネント間の間隔は縦横とも 5 ピクセル
FlowLayout( int ) 定数 CENTER, LEFT, RIGHT でセンタリング、右寄せ、左寄せを指定
FlowLayout( int, int, int ) 定数 CENTER, LEFT, RIGHT でセンタリング、右寄せ、左寄せを指定
コンポーネント間の間隔を横、縦の順でピクセル単位で指定
CardLayout() コンポーネント間の間隔は縦横とも 5 ピクセル
CardLayout( int, int ) コンポーネント間の間隔を横、縦の順でピクセル単位で指定
BorderLayout() コンポーネント間の間隔は縦横とも 5 ピクセル
BorderLayout( int, int ) コンポーネント間の間隔を横、縦の順でピクセル単位で指定
GridLayout( int, int )行数と列数を指定。
GridLayout( int, int, int, int ) 行数と列数を指定。 コンポーネント間の間隔を横、縦の順でピクセル単位で指定
GridBagLayout() GridBagLayoutは引数からの情報は特に利用しない。
細かい指定をGridBagConstraintクラスで操作する。

・ レイアウトの方針によって、Containerのadd()メソッドの引数が異なる場合があります。たとえば BorderLayoutを使用している場合には、


add( button, "West" );
 
のように、第2引数に配置すべき位置を与えなくてはいけません。 一般に add( Component, Object )の形式が Containerには用意されており、 第2引数に与えられたオブジェクトを手がかりの情報として使用されます。
注意しなければならないのは、 BorderLayoutを使用している時でも add( button ); の記述は文法的に正しいという点です。 コンパイル時にはエラーと見なされませんが、実行しても本来レイアウトされる べきコンポーネントが表示されないという結果になってしまいます。


FlowLayoutの例


GridLayoutの例


BorderLayoutの例


CardLayoutの例


GridBagLayoutの例