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 );
}
}
}
}
}