GridLayoutクラスは、最も便利でよく使われるレイアウトです。
GridLayoutクラスは、列数を決めて、Controlの数がその列数に達したら、その次のConrolは、
折り返して表示します
。
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
public class GridLayoutComposite extends Composite {
public GridLayoutComposite(Composite parent) {
super(parent, SWT.NONE);
GridLayout layout = new GridLayout(4, false);
setLayout(layout);
for (int i=0 ; i<10 ; i++) {
Button button = new Button(this, SWT.NONE);
button.setText("button " + i);
}
}
}
GridLayoutクラスで指定できるオプションは、列数だけでした。 さらに詳細なレイアウトを設定するには、GridDataクラスを使用します。
GridDataの設定は、コンストラクタで指定するものと、パラメータ値に直接設定するものの2種類が存在します。 まずはコンストラクタで指定するものから見ていきます。
FILL_BOTH // 縦と横を満たす FILL_HORIZONTAL // 横を満たす FILL_VERTICAL // 縦を満たすFILL_???スタイルを指定して作成されたレイアウトデータをセットされたコントロールは、コンポジットのサイズが変わったときに、 あまった余白をそのコントロールで満たすようになります。 FILL_HORIZONTALが設定されていたら横幅が広がったときに横に伸び、 FILL_VERTICALが設定されていたら縦幅が広がったときに縦に伸びます。 FILL_BOTHの場合は、縦にも横にも伸びます。 実行例では、button 4に、FILL_BOTHが設定してあります。
HORIZONTAL_ALIGN_BEGINNING // 左寄り HORIZONTAL_ALIGN_CENTER // 左右の中央 HORIZONTAL_ALIGN_END // 右寄り
HORIZONTAL_ALIGN_BEGINが指定されると左寄りに、
HORIZONTAL_ALIGN_CENTERが指定されると中央に、
HORIZONTAL_ALIGN_ENDが指定されると右寄りに表示されます。
これはあくまでも、コントロールが表示される範囲内での話しであって、
表示順が入れ替わるわけではありません。
実行例では、short 4のボタンに、HORIZONTAL_ALIGN_ENDが設定されています。
VERTICAL_ALIGN_BEGINNING // 上寄り VERTICAL_ALIGN_CENTER // 上下の中央 VERTICAL_ALIGN_END // 下寄り そしてワシ // 年寄り(ちがーう!)HORIZONTAL_ALIGN_????の縦ヴァージョンです。
次に、パラメータ値に直接指定するものを見ていきます。
widthHint // Controlの横幅の下限 heightHint // Controlの縦幅の下限widthHint、heightHintには、それぞれSWT_DEFAULTを指定することもできます。 この場合は、下限が0になります。 実行例の場合、button 4には、widthHint = 100、heightHint = 50が設定されているので、 他のボタンは小さくパックされているのに、button4だけはその最低幅を保ったまま表示されています。
horizontalIndent // 左右のコントロール同士のピクセル幅 verticalIndent // 上下のコントロール同士のピクセル幅
horizontalSpan // 横何カラムにまたがるか verticalSpan // 縦何カラムにまたがるか一番理解しにくいのが、このhorizontalSpanとverticalSpanだと思います。 普通GridLayoutでは、横方向に4列の場合、4つのコントロールを並べることができます。 この状態は、horizontalSpanが1の状態です(デフォルト)。 しかし、horizontalSpanを4にすると、横にそのコントロールの1つのみしか配置することができません。 つまり4個分の幅をそのコントロール1つが占領してしまうわけです。 verticalSpanについても、縦方向に、同じです。
最後に、horizontalSpan、verticalSpan、それにFILL_BOTHを使ったサンプルプログラムを示します。
GridDataをセットしたbutton 3だけが横幅2、縦幅2をとり、また、伸縮します。
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
public class GridLayoutComposite extends Composite {
public GridLayoutComposite(Composite parent) {
super(parent, SWT.NONE);
GridLayout layout = new GridLayout(3, false);
setLayout(layout);
GridData data = new GridData(GridData.FILL_BOTH);
data.horizontalSpan = 2; // 横幅を2つとる
data.verticalSpan = 2; // 縦幅を2つとる
for (int i=0 ; i<9 ; i++) {
Button button = new Button(this, SWT.NONE);
button.setText("button " + i);
// button 3だけにLayoutDataを設定
if (i == 3) {
button.setLayoutData(data);
}
}
}
}