コンポジット(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}); |
