新しいレイアウトのポリシーの設計

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個のメソッドを提供します。 新しいクラスは、それらの内容を(たとえ形式的であっても) 定義する必要があります。

これらのうち一番重要なのは実際にレイアウトを実行する 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++) {
                                :