TopdownLayout.java



import java.awt.*;

/** 新しく設計されたレイアウトのポリシーのクラス TopdownLayout
    コンポーネントを上から下へ順に配置する */

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.size().width, cont.size().height );
    }

    /** 許される最小のサイズを計算して返すメソッド
        ここでは手を抜いて常に 1x1 のサイズを返す */

    public Dimension minimumLayoutSize( Container cont ) {

        return new Dimension( 1, 1 );
    }

    /** 内部のレイアウトを決定するメソッド */

    public void layoutContainer( Container cont ) {

        Insets insets = cont.insets();
        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++) {

            Component m = cont.getComponent(i);
            if ( m.isVisible() ) {

                Dimension d = m.preferredSize();
                int w = d.width;
                int h = d.height;
                m.resize( w, h );
        
                if ( (y + h + vgap) <= maxheight ) {
                    m.move( x, y );
                    y += vgap;
                    y += h;
                    colw = Math.max(colw, w);
                } else {
                    y = vgap;
                    x += hgap + colw;
                    colw = w;
                    m.move( x, y );
                }
            }
        }
    }
}