コンポジット(Composite)について

コンポジットは、任意のレベルにまでネストでき、コントロールやコンポジットを、子として取り混ぜることができます。
  これによってGUI開発の複雑さが大幅に緩和され、(内部GUIをカプセル化することによって)GUIコードが再利用しやすくなります。
  コンポジットは、視覚的に区別しやすいように境界を持つこともでき、あるいは、より大きなグループに継ぎ目なく統合するために、境界無しにすることもできます。

1.コンポジット Composite

Compositeはパネルのようなもので、その中にコンポーネントを追加できます。複雑なレイアウトを作るときに使います。
  下の例では、Shellの上と下にCompositeを二つ配置し、それぞれのCompositeにGridLayoutとFillLayoutを適用しています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
shell.setLayout(new FillLayout(SWT.VERTICAL));

Composite c1 = new Composite(shell, SWT.NONE);
GridLayout gl = new GridLayout();
gl.numColumns = 2;
c1.setLayout(gl);
new Button(c1, SWT.PUSH).setText("Button1");
new Button(c1, SWT.PUSH).setText("Button2");
new Button(c1, SWT.PUSH).setText("Button3");
new Button(c1, SWT.PUSH).setText("Button4");

Composite c2 = new Composite(shell, SWT.NONE);
c2.setLayout(new FillLayout(SWT.VERTICAL));
new Button(c2, SWT.PUSH).setText("Button5");
new Button(c2, SWT.PUSH).setText("Button6");
new Button(c2, SWT.PUSH).setText("Button7");
new Button(c2, SWT.PUSH).setText("Button8");

2.グループ Group

GroupはCompositeのようにコンポーネントをグループ化し、境界線と表題を表示することができます。
  ラジオボタンを利用している場合は、グループ単位で選択が有効になります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
shell = new Shell();
shell.setText("SWT Application");
shell.setLayout(new FillLayout(SWT.VERTICAL));

Group g1 = new Group(shell, SWT.SHADOW_NONE);
g1.setLayout(new FillLayout(SWT.VERTICAL));
g1.setText("Group1 - SHADOW_NONE");
Label l1_1 = new Label(g1, SWT.NONE);
l1_1.setText("Group1 Label");
Button b1_1 = new Button(g1, SWT.PUSH);
b1_1.setText("Group1 Button");

Group g2 = new Group(shell, SWT.SHADOW_IN);
g2.setText("Group2 - SHADOW_IN");
g2.setLayout(new FillLayout(SWT.HORIZONTAL));
Button b2_1 = new Button(g2, SWT.RADIO);
b2_1.setText("Radio Button 1");
Button b2_2 = new Button(g2, SWT.RADIO);
b2_2.setText("Radio Button 2");

Group g3 = new Group(g2, SWT.SHADOW_OUT);
g3.setText("Group3 - SHADOW_OUT");
g3.setLayout(new FillLayout());
Button b3_1 = new Button(g3, SWT.RADIO);
b3_1.setText("Radio Button");

shell.setSize(400, 200);

3.タブ TabFolder

TabFolderとTabItemを使うとタブでフォームの切り替えを行うことができます。
  以下の例は2つのタブを作成し、それぞれにボーダー付きのラベルを追加しています。
  各タブに複数のウィジェットを配置する場合はCompositeを使います。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
shell.setLayout(new FillLayout());

TabFolder tabFolder = new TabFolder(shell,SWT.NULL);

// 1つめのタブを作成
TabItem item1 = new TabItem(tabFolder,SWT.NULL);
item1.setText("Tab1");

// 1つめのタブにLabelを追加
Label label1 = new Label(tabFolder,SWT.BORDER);
label1.setText("Tab1");
item1.setControl(label1);

// 2つめのタブを作成
TabItem item2 = new TabItem(tabFolder,SWT.NULL);
item2.setText("Tab2");

// 2つめのタブにLabelを追加
Label label2 = new Label(tabFolder,SWT.BORDER);
label2.setText("Tab2");
item2.setControl(label2);

CTabFolderは機能的にはTabFolderとほぼ同等ですが、見た目や機能が若干異なります。
  TabFolderではOSネイティブのタブコントロールを使用しますが、CTabFolderはEclipseのエディタやビューで使われているようなスマートな外観のタブを使用したい場合に利用します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
shell.setLayout(new FillLayout());

CTabFolder tabFolder = new CTabFolder(shell,SWT.CLOSE);

// 1つめのタブアイテムを作成
CTabItem tabItem1 = new CTabItem(tabFolder,SWT.NONE);
tabItem1.setText("タブ1");

// 1つめのタブにウィジェットを設定
Label label1 = new Label(tabFolder,SWT.NONE);
label1.setText("ラベル1");
tabItem1.setControl(label1);

// 2つめのタブアイテムを作成
CTabItem tabItem2 = new CTabItem(tabFolder,SWT.NONE);
tabItem2.setText("タブ2");

// 2つめのタブにウィジェットを設定
Label label2 = new Label(tabFolder,SWT.NONE);
label2.setText("ラベル2");
tabItem2.setControl(label2);

4.スプリットペイン SashForm

調整可能な境界をつくるには、SashFormを使います。コンストラクタで境界を垂直方向にするか、水平方向にするかを指定します。
  SashForm生成後、格納したいWidgetをインスタンス化すると、上から下、あるいは左から右の順番で実際にWidgetが格納されていきます。境界線のデフォルトの位置は、setWeightsメソッドで指定することが可能です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
shell.setLayout(new FillLayout());

SashForm baseSash = new SashForm(shell, SWT.HORIZONTAL);

//lefthand sash
Text leftText = new Text(baseSash, SWT.BORDER | SWT.MULTI);
leftText.setText("Left Text");

SashForm leftSash = new SashForm(baseSash, SWT.VERTICAL);

List list = new List(leftSash, SWT.BORDER);
list.add("item1");
list.add("item2");
list.add("item3");

Text bottomText = new Text(leftSash, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
bottomText.setText("Bottom Text");

//Sashの境界を調整 上部20% 下部80%
leftSash.setWeights(new int [] {20,80});