TopdownLayout.java



/** 新しく設計されたレイアウトのポリシーのクラス TopdownLayout
    コンポーネントを上から下へ順に配置する */
import java.awt.*;
public class TopdownLayout implements LayoutManager {

    /** コンポーネント間の隙間のサイズ */
    int hgap;
    int vgap;

    /** コンストラクタ */
    public TopdownLayout() {
        this(5, 5);
    }

    /** コンストラクタ(コンポーネント間の間隔を指定) */
    public TopdownLayout( int hgap, int vgap ) {
        this.hgap = hgap;
        this.vgap = vgap;
    }

    /** LayoutManeger インターフェイスで予約されたメソッド 
        特に新しい処理は追加しない */
    public void addLayoutComponent( String name, Component comp ) {
    }

    /** LayoutManeger インターフェイスで予約されたメソッド 
        特に新しい処理は追加しない */
    public void removeLayoutComponent( Component comp ) {
    }

    /** 適切なサイズを計算して返すメソッド
        ここでは手を抜いて現在のサイズをそのまま返す */
    public Dimension preferredLayoutSize( Container cont ) {
         return new Dimension( cont.getSize().width,
                               cont.getSize().height );
    }

    /** 許される最小のサイズを計算して返すメソッド
        ここでは手を抜いて常に 1x1 のサイズを返す */
    public Dimension minimumLayoutSize( Container cont ) {
        return new Dimension( 1, 1 );
    }

    /** 内部のレイアウトを決定するメソッド */
    public void layoutContainer( Container cont ) {
        int xlimit = cont.getSize().width - hgap;
        int ylimit = cont.getSize().height - vgap;
        int x = hgap, y = vgap;
        int colw = 0;

        for (int i = 0 ; i < cont.getComponentCount() ; i++) {
            Component m = cont.getComponent(i);
            if ( m.isVisible() ) {
                Dimension d = m.getPreferredSize();
                int w = d.width;
                int h = d.height;
                m.setSize( w, h );
                if ( y + h <= ylimit ) {
                    m.setLocation( x, y );
                    colw = Math.max(colw, w);
                } else {
                    y = vgap;
                    x += hgap + colw;
                    if( x >= xlimit ) break;
                    colw = w;
                    m.setLocation( x, y );
                }
                y = y + h + vgap;
            }
        }
    }
}