新しいレイアウトのポリシーの設計
LayoutManagerインターフェイスと、
新しいレイアウトのポリシーの設計法について解説します。
JDKの java.awtパッケージに用意されたレイアウトのクラス以外に、
独自のポリシーを提供するクラスを作ることも可能です。
java.awtパッケージには、それらの新しいクラスを設計するための基本の機能を
提供する LayoutManager インターフェイスが用意されています。
また、Container(およびそのサブクラス)がレイアウトのポリシーとして
受け付けるのは、LayoutManager をインプリメントしたオブジェクトに限られます。
たとえば、
TopdownLayout
という新しいレイアウトのクラス
を設計するとしましょう。
そのクラス定義の最初の部分は次のようになります。
import java.awt.*;
/** 新しく設計されたレイアウトのポリシーのクラス TopdownLayout */
public class TopdownLayout implements LayoutManager {
protected int vgap;
protected int hgap;
/** コンストラクタ(コンポーネント間の間隔を指定) */
public TopdownLayout( int hgap, int vgap ) {
this.hgap = hgap;
this.vgap = vgap;
}
:
LayoutMangerインターフェイスは次の 5個のメソッドを提供します。
新しいクラスは、それらの内容を(たとえ形式的であっても)
定義する必要があります。
- addLayoutComponent()
- removeLayoutComponent()
- preferredLayoutSize()
- minimumLayoutSize()
- layoutContainer()
これらのうち一番重要なのは実際にレイアウトを実行する layoutContainer()
メソッドです。このメソッドの内容によってポリシーがほとんど決定されます。
/** LayoutManeger インターフェイスで予約されたメソッド
特に新しい処理は追加しない */
public void addLayoutComponent( String name, Component comp ) {
}
/** LayoutManeger インターフェイスで予約されたメソッド
特に新しい処理は追加しない */
public void removeLayoutComponent( Component comp ) {
}
/** 適切なサイズを計算して返すメソッド
ここでは手を抜いて現在のサイズをそのまま返す */
public Dimension preferredLayoutSize( Container cont ) {
return new Dimension( cont.size().width, cont.size().height );
}
/** 許される最小のサイズを計算して返すメソッド
ここでは手を抜いて常に 1x1 のサイズを返す */
public Dimension minimumLayoutSize( Container cont ) {
return new Dimension( 1, 1 );
}
/** 内部のレイアウトを決定するメソッド */
public void layoutContainer( Container cont ) {
int maxwidth = cont.size().width - hgap*2;
int maxheight = cont.size().height - vgap*2;
int x = hgap, y = vgap;
int colw = 0;
for (int i = 0 ; i < cont.countComponents() ; i++) {
: