SWTの基本的なコントロールについて

SWT GUIはほとんどすべて、幾つかの基本部分から作られます。
SWTウィジェットはすべて、 org.eclipse.swt.widgets パッケージ、あるいは org.eclipse.swt.custom パッケージの中にあります。(幾つかのEclipseプラグインでは、別パッケージとしてカスタム・ウィジェットも提供しています。)ウィジェット・パッケージには、OSのコントロールに基づくコントロールが含まれていますが、カスタム・パッケージには、OSのコントロール・セット以上に拡張したコントロールが含まれています。
一部のカスタム・パッケージのコントロールは、ウィジェット・パッケージの中にあるコントロールと似ています。名前の衝突を避けるために、カスタム・コントロールの名前は、「C」で始まるようになっています(例えばLabelに対してCLableなど)。
SWTでは、すべてのコントロールは(後で議論する、シェルのような最上位レベルのコントロールを除いて)、作る際に、親コントロール(コンポジット・インスタンス)を持つ必要があります。
コントロールは(明示的に追加する必要のあるAWT/Swingとは異なり)、作られると自動的に、親に「追加」されます。つまり、GUIの構成は、「トップダウン」で行われるのです。従って、すべてのコントロールはコンストラクターへの引数として、コンポジットの親(またはサブクラス)をとります。
大部分のコントロールにはフラグ・オプションがあり、コントロールを作った時に設定する必要があります。
従って、大部分のコントロールには、(よく、スタイルと呼ばれる)2番目のコンストラクター引数があり、こうしたオプションを設定するためのフラグを提供します。
全てのフラグ値は static final int であり、 org.eclipse.swt パッケージの SWT クラスの中で定義されます。オプションが必要無い場合には、値として SWT.NONE を使います。

1.ラベル Label

ラベルは恐らく最も単純なコントロールですが、プレーンな(つまり色や特別なフォント、またはスタイルを持たない)テキストや、アイコンと呼ばれる小さな画像を表示するために使われます。
ラベルはフォーカスを受けることがありません(つまりユーザーは、タブ・キーやマウスでラベルに行くことができません)。従って、入力イベントを生成しません。

1
2
3
4
5
6
Label lblNewLabel = new Label(shell, SWT.WRAP);
lblNewLabel.setFont(SWTResourceManager.getFont("メイリオ", 14, SWT.NORMAL));
lblNewLabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_GRAY));
lblNewLabel.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED));
lblNewLabel.setBounds(36, 55, 239, 68);
lblNewLabel.setText("これは一つラベルのサンプルです。");

プラットフォームの制限から、標準のラベル・コントロールはテキストとアイコンの両方を持つことはできません。
両方を一緒にサポートするためには、CLabelコントロールを使います。

1
2
3
4
CLabel lblNewLabel = new CLabel(shell, SWT.NONE);
lblNewLabel.setImage(SWTResourceManager.getImage("...\\common_checkBox_on_n.png"));
lblNewLabel.setBounds(10, 10, 167, 24);
lblNewLabel.setText("This is a CLabel!");

2.テキスト Text

ラベルはテキストを示すものですが、ユーザーがテキストを入力できるようにしたい場合がよくあります。
  テキスト・コントロールは、このために使います。テキストは1行(テキスト・フィールド)でも、複数(テキスト領域)でも可能です。
  テキストは読み取り専用にすることもできます。テキスト・フィールドには記述が無いため、多くの場合、その目的を識別するためのラベル・コントロールが前に付きます。
  テキスト・コントロールは、その使い方についての情報を提供する「ツール・ヒント」を持つこともできます(全てのコントロールが、この機能をサポートしています)。

1
2
Text text = new Text(shell, SWT.BORDER);
text.setBounds(58, 19, 249, 24);

3.ボタン Button

アクションがいつ起きるべきかを、ユーザーが示すようにしたいことがよくあります。このために最も一般的な方法としては、ボタン・コントロールを使う方法です。
  ボタンには、下記のような幾つかのスタイルがあります。

|ソース|執行結果|説明|

  • ボタン種類:ARROW
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
Button upButton = new Button(shell, SWT.ARROW | SWT.UP);
upButton.setBounds(25, 10, 40, 28);
upButton.setText("UP");

Button downButton = new Button(shell, SWT.ARROW | SWT.DOWN);
downButton.setBounds(75, 10, 40, 28);
downButton.setText("DOWN");

Button leftButton = new Button(shell, SWT.ARROW | SWT.LEFT);
leftButton.setBounds(125, 10, 40, 28);
leftButton.setText("LEFT");

Button rightButton = new Button(shell, SWT.ARROW | SWT.RIGHT);
rightButton.setBounds(175, 10, 40, 28);
rightButton.setText("RIGHT");

執行結果:

上向き、下向き、左向き、あるいは右向きの矢印として表示します

  • ボタン種類:CHECK
1
2
3
Button checkButton = new Button(shell, SWT.CHECK);
checkButton.setBounds(20, 10, 102, 18);
checkButton.setText("Check Button");

執行結果:

ラベルの付いたチェック記号

  • ボタン種類:PUSH
1
2
3
4
5
6
7
Button pushButton = new Button(shell, SWT.PUSH);
pushButton.setBounds(23, 10, 81, 28);
pushButton.setText("Push Button");

Button newButton = new Button(shell, SWT.NONE);
newButton.setBounds(122, 10, 81, 28);
newButton.setText("Push Button 2");

執行結果:

(離すと状態を保持しない)瞬時動作の押しボタン(最も一般的なイベント・ソース)

  • ボタン種類:RADIO
1
2
3
Button radioButton = new Button(shell, SWT.RADIO);
radioButton.setBounds(10, 10, 99, 18);
radioButton.setText("Radio Button");

執行結果:

同じグループ内の他のラジオボタンと排他的な、(離しても状態を保持する)記号

  • ボタン種類:TOGGLE
1
2
3
Button toggleButton = new Button(shell, SWT.TOGGLE);
toggleButton.setBounds(10, 10, 93, 28);
toggleButton.setText("Toggle Button");

執行結果:

離しても状態を保持する押しボタン

org.eclipse.swt.event.SelectionListenerインターフェースを実装したイベントリスナを登録することで、ボタンがクリックされた場合の処理を行うことができます。

1
2
3
4
5
6
7
8
9
Button button = new Button(shell,SWT.NULL);
button.setText("Button");
button.addSelectionListener(new SelectionAdapter(){
    public void widgetSelected(SelectionEvent e){
        MessageBox mesBox = new MessageBox(shell);
        mesBox.setMessage("ボタンがクリックされました");
        mesBox.open();
    }
});

4.リストボックス List

リストボックス(List)はComboによく似たAPIを持っています。コンストラクタの引数で単一選択or複数選択、スクロールバーやボーダーの有無を指定することができます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
 // 単一選択のリスト
List list1 = new List(shell,SWT.SINGLE|SWT.BORDER|SWT.V_SCROLL);
list1.add("Item1");
list1.add("Item2");
list1.add("Item3");
list1.setBounds(10, 10, 71, 68);

// 複数選択可能なリスト
List list2 = new List(shell,SWT.MULTI|SWT.BORDER|SWT.V_SCROLL);
list2.add("Item1");
list2.add("Item2");
list2.add("Item3");
list2.setBounds(100, 10, 71, 68);

5.コンボボックス Combo

ドロップダウンリストの複数の選択肢より1つを選択します。または入力します。
コンボには、次のように相互排他的な2つのスタイルのうち、どちらか1つのスタイルを定義する必要があります。

  • SIMPLEは、値のリストを表示します。
  • DROP_DOWNは、値のリストをドロップダウンで表示します。コンボはオプションとして、次のスタイルもサポートしています。
  • READ_ONLYは、このコンボのテキスト・フィールドを、ユーザーが編集できないようにします。
    ここで取り上げるコントロール(リスト、コンボ、テーブル、ツリー)はすべて、次のように相互排他的な2つのスタイルのうち、どちらか1つをサポートします。
  • SINGLEユーザーは、1つのアイテムしか選択できません。
  • MULTIユーザーは、複数のアイテムを選択することができます。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
    // シンプルコンボ
    Combo combo1 = new Combo(shell,SWT.SIMPLE);
    combo1.add("Item1");
    combo1.add("Item2");
    // ドロップダウン(入力可能)
    String[] MONTHS = { "January", "February", "March", "April", "May",  
                "June", "July", "August", "September", "October" };  

    Combo combo2= new Combo(shell, SWT.DOWN);  
    combo2.setItems(MONTHS);  
    combo2.setBounds(10,10,134,24);
    combo2.setText("January"); // デフォルトで表示される文字列を設定
    // ドロップダウン(入力不可)
    Combo combo3 = new Combo(shell,SWT.READ_ONLY);
    combo3.add("Item1");
    combo3.add("Item2");
    combo3.select(0); // 最初のアイテムを選択状態にする

コンボ・コントロールの代わりに、CCombo(org.eclipse.swt.customパッケージの中にあります)と呼ばれる実装を使うこともできます。
CComboはComboと似ていますが、他のファンクションも幾つかサポートしています。最も顕著なものとして、CComboに組み込みのTextコントロールからテキストをカット、コピーしたり、Textコントロールにペーストしたりするように、プログラム的に指示できるファンクションがあります。また、CComboは常にDROP_DOWNスタイルなので、typeスタイルはサポートしていません。
CComboも、オプションとして次のようなスタイルをサポートしています。

  • BORDERは、テキスト領域の周囲に枠を表示します。
  • READ_ONLYは、このコンボのテキスト・フィールドを、ユーザーが編集できないようにします。

6.テーブル Table

テーブル(Table)は2次元の表を表示することができます。ヘッダの設定にはTableColumn、データの設定にはTableItemを使用します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
Table table = new Table(shell, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
table.setBounds(10,10,233,138);

// ヘッダを可視にする
table.setHeaderVisible(true);

// ヘッダを設定
String[] cols = { "列1", "列2", "列3" };
for (int i = 0; i < cols.length; i++) {
    TableColumn col = new TableColumn(table, SWT.LEFT);
    col.setText(cols[i]);
    col.setWidth(50);
}
// データを設定
for (int i = 0; i < 5; i++) {
    TableItem item = new TableItem(table, SWT.NULL);
    String[] data = { String.valueOf(i + 1) + "-1", String.valueOf(i + 1) + "-2", String.valueOf(i + 1) + "-3" };
    item.setText(data);
}

7.ツリー Tree

ツリーは、階層情報を表示できるリストです。ツリーは、アプリケーションが持っている、階層構造の中間レベルを拡大、縮小できる機能をサポートしています。

1
2
3
4
5
6
7
8
9
// ルートとなる要素を追加
TreeItem root = new TreeItem(tree,SWT.NULL);
root.setText("Root");
// ルートの子要素を追加
TreeItem item1 = new TreeItem(root,SWT.NULL);
item1.setText("Item1");
// ルートの子要素を追加
TreeItem item2 = new TreeItem(root,SWT.NULL);
item2.setText("Item2");

ツリーのコンストラクタのスタイル指定でSWT.MULTIかSWT.SINGLEを指定することによって要素の複数選択を許可するかどうかを指定できます。

1
2
// 複数選択可能なツリーを作成
Tree tree = new Tree(shell,SWT.MULTI);

また、SWT.CHECKを指定することで、ツリーの各要素にチェックボックスを表示することができます。

1
2
// ツリーの各要素にチェックボックスを表示
Tree tree = new Tree(sShell, SWT.BORDER|SWT.CHECK);

ツリーは通常、階層構造を表示するので、ツリーにはデータ・モデルを提供する必要があります。この例では、内部クラスNodeを使っています。   

 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
28
public class Node {
    protected java.util.List children;
    public java.util.List getChildren() {
        return children;
    }
    public void setChildren(java.util.List children) {
        this.children = children;
    }
    public void addChild(Node node) {
        children.add(node);
    }

    protected String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public Node(String name) {
        this(name, new ArrayList());
    }
    public Node(String name, java.util.List children) {
        setName(name);
        setChildren(children);
    }
}

ツリーを作るには、まずツリー・コントロールを作り、次にTreeItemsで囲んだストリング・データを追加します。TreeItemsは、他のTreeItemsを含むこともできるので、値の階層構造を作ることができます。

 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// Create the Tree
protected Tree createTree(Composite parent, int mode, Node root) {
    tree = new Tree(parent, mode | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
    tree.setBounds(10, 10, 249, 242);
    tree.addSelectionListener(new SelectionListener() {
    @Override
    public void widgetSelected(SelectionEvent e) {
        // TODO Auto-generated method stub
    }

    @Override
    public void widgetDefaultSelected(SelectionEvent e) {
        // TODO Auto-generated method stub
    }
    });
    setTreeContents(root);
    return tree;
}
protected void setTreeContents(Node root) {
    tree.removeAll();
    TreeItem ti = new TreeItem(tree, SWT.NONE);
    setTreeItemContents(ti, root);

}
protected void setTreeItemContents(TreeItem ti, Node root) {
    ti.setText(root.getName());
    java.util.List children = root.getChildren();
    if (children != null && children.size() > 0) {
        for (Iterator i = children.iterator(); i.hasNext();) {
            Node n = (Node)i.next();
            TreeItem tix = new TreeItem(ti, SWT.NONE);
            setTreeItemContents(tix, n);
        }
    }
}

// sample creation code
protected void addChildren(Node n, int count, int depth, String prefix) {
    if (depth > 0) {
        for (int i = 0; i < count; i++) {
            String name = prefix + '.' + i;
            Node child = new Node(name);
            n.addChild(child);
            addChildren(child, count, depth - 1, name);
        }
    }
}

Node root = new Node("<root>");
addChildren(root, 3, 3, "Child");
tree = createTree(shell, SWT.CHECK, root);

8.ツールバー ToolBar

ToolBarコンストラクタのスタイル指定により、通常の概観のToolBarとポインタが上にあるときのみボタンが浮くあがるFlat型のToolBarを作り分けることができます。

 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
28
        shell.setLayout(new FillLayout(SWT.VERTICAL));

        //----- ToolBar1
        ToolBar tb1 = new ToolBar(shell, SWT.NONE);

        ToolItem item1 = new ToolItem(tb1, SWT.PUSH);
        item1.setText("Push");

        ToolItem item2 = new ToolItem(tb1, SWT.SEPARATOR);

        ToolItem item3 = new ToolItem(tb1, SWT.CHECK);
        item3.setText("Check");

        ToolItem item4 = new ToolItem(tb1, SWT.RADIO);
        item4.setText("Radio");

        //----- ToolBar2
        ToolBar tb2 = new ToolBar(shell, SWT.FLAT);
        ToolItem item5 = new ToolItem(tb2, SWT.PUSH);
        item5.setText("Push");

        ToolItem item6 = new ToolItem(tb2, SWT.SEPARATOR);

        ToolItem item7 = new ToolItem(tb2, SWT.CHECK);
        item7.setText("Check");

        ToolItem item8 = new ToolItem(tb2, SWT.RADIO);
        item8.setText("Radio");

9.クールバー CoolBar

クールバーはマウスでドラッグすることで配置を変更することのできるツールバーです。
  見た目はツールバーに似ていますが、操作はかなり複雑になっています。
  基本的にはCoolBarの子としてCoolItemを作成し、CoolItem#setControlでCoolItemに任意のコントロールを貼り付けるという感じになります。
  この際、CoolItemがCoolBar上でドラッグ可能な区画となります。また、きちんと表示するにはCoolItemに対するサイズの指定も必要です。

 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
CoolBar coolbar = new CoolBar(shell, SWT.NULL);
coolbar.setBounds(10, 10, 300, 12);

ToolBar toolbar1 = new ToolBar(coolbar, SWT.FLAT);
ToolItem tItem1_1 = new ToolItem(toolbar1, SWT.PUSH);
tItem1_1.setText("Item1");
ToolItem tItem1_2 = new ToolItem(toolbar1, SWT.PUSH);
tItem1_2.setText("Item2");

CoolItem item1 = new CoolItem(coolbar, SWT.PUSH);
item1.setControl(toolbar1);
Point pt1 = toolbar1.computeSize(SWT.DEFAULT, SWT.DEFAULT);
pt1 = item1.computeSize(pt1.x, pt1.y);
item1.setSize(pt1);

ToolBar toolbar2 = new ToolBar(coolbar, SWT.FLAT);
ToolItem tItem2_1 = new ToolItem(toolbar2, SWT.PUSH);
tItem2_1.setText("Item3");

CoolItem item2 = new CoolItem(coolbar, SWT.PUSH);
item2.setControl(toolbar2);
Point pt2 = toolbar2.computeSize(SWT.DEFAULT, SWT.DEFAULT);
pt2 = item2.computeSize(pt2.x, pt2.y);
item2.setSize(pt2);

shell.setSize(400, 80);
shell.open();

10.プログレスバー ProgressBar

プログレスバーは処理の進捗をあらわすためのウィジェットです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
ProgressBar progbar = new ProgressBar(shell,SWT.NULL);
progbar.setBounds(10, 10, 364, 12);
progbar.setMinimum(0);
progbar.setMaximum(9999);

shell.setSize(400,70);
shell.open();

for(int i=0;i<10000;i++){
     progbar.setSelection(i);
}

コンストラクタのスタイル指定でSWT.SMOOTHを指定するとバーの表示がなめらかになります。

1
2
// スムーズなプログレスバー
ProgressBar progbar = new ProgressBar(shell,SWT.SMOOTH);

11.スライダー Slider

Sliderはいわゆるスクロールバーです。値の調節や、他のコンポーネントと同期してスクロールさせることが可能です。   コンストラクタにSWT.HORIZONTALを指定すると水平スクロールバーに、SWT.VERTICALを指定すると垂直スクロールバーになります。   以下にSliderの値をテキストボックスに表示する簡単なサンプルを示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
final Slider slider = new Slider(shell,SWT.HORIZONTAL);
slider.setBounds(10, 10, 159, 20);
slider.setMinimum(0);
slider.setMaximum(100);
slider.setIncrement(1);
slider.addSelectionListener(new SelectionAdapter(){
    public void widgetSelected(SelectionEvent e){
        text.setText(String.valueOf(slider.getSelection()));
    }
});

text = new Text(shell,SWT.BORDER);
text.setBounds(10, 35, 159, 20);

12.スケール Scale

ScaleはSliderと同様に指定された区間内でバーを移動することにより値を選択できるコンポーネントです。   コンストラクタの引き数で水平方向か垂直方向かの表示を選ぶことができます。   setMinimumメソッドで最小値の設定、setMaximumメソッドで最大値の設定、setSelectionで現在値の設定をします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
final Scale scale = new Scale(shell, SWT.HORIZONTAL);
scale.setBounds(10, 10, 159, 42);
scale.setMinimum(0);
scale.setMaximum(100);
scale.addSelectionListener(new SelectionAdapter(){
      public void widgetSelected(SelectionEvent e) {
            text.setText(String.valueOf(scale.getSelection()));
      }
});

text = new Text(shell,SWT.BORDER);
text.setBounds(20, 58, 159, 20);

13.スビナ Spinner

SWT 3.1からSpinnerが追加されました。スピナは数値を入力するための小さなウィジェットで、利用法も簡単です。

1
2
3
4
5
Spinner spinner = new Spinner(shell, SWT.BORDER);
spinner.setMinimum(50); // 最小値を指定
spinner.setMaximum(100); // 最大値を指定
spinner.setSelection(75); // 初期値を指定
spinner.setBounds(10, 10, 40, 24);

SWT 3.1で追加されたorg.eclipse.swt.widgets.LinkはHTMLのリンク風ウィジェットです。ボタンの代わりに使うことができます。
Linkにセットする文字列は...で囲む必要があります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
final Link link = new Link(shell, SWT.NONE);
link.setText("<a>リンク</a>");
link.setBounds(10, 10, 47, 20);
link.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
    public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
        text.setText("リンクがクリックされました。");
    }
});
link.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

text = new Text(shell, SWT.BORDER);
text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
text.setBounds(10, 36, 226, 20);