Standard Widget Toolkit

2008年03月22日

Standard Widget Toolkit

SWT (Standard Widget Toolkit) は IBM が Eclipse 用に開発した GUI ライブラリです。JNI を使用することで昔の Swing で問題となっていたグラフィック描画のボトルネックを回避し、当時の Swing ベースのアプリケーションと比較して格段の速さを誇っていました。

J2SE 1.4 以降は Swing のグラフィックが高速になったため速度的な優位性はなくなりましたが、

AWT/Swing に慣れているプログラマ向けの注意点は以下の通り。

  • SWT コンポーネントは継承して使うよう設計されていません。既存のウィジェットをゴリゴリと組み合わせてゆくスタイルです。
  • ウィンドウリソースの開放処理はプログラマが明示的に行う必要があります。
  • コンストラクタで親のコンポジットを指定します。つまり SWT コンポーネントは親から順に作成する必要があります。
  • イベント処理の連携が煩雑になるためあまりお勧めできませんが、いざとなれば AWT や Swing と SWT を混在させる事が可能です。

SWT 開発の準備

SWT は JNI を使用していますが、必要なネイティブライブラリはまとめて JAR に格納されているため、プラットフォームごとの JAR を入手してクラスパスを通すだけで利用が可能です。

  1. eclipse.org からプラットフォームごとの Stable 版 (Windows であれば swt-3.3.1.1-win32-win32-x86.zip) をダウンロードします。
  2. ダウンロードした ZIP ファイルを解凍して swt.jar を取り出します。
  3. クラスパスの通るディレクトリ (${java.home}/lib/ext, ${jre.home}/lib/ext など) に保存するか、または明示的にクラスパスを通してコンパイルと実行を行います。

ウィンドウの表示

ウィンドウの表示

SWT のウィンドウ表示も非常に簡単。 DisplayJava™ API リファレンス がディスプレイデバイスを表しており、その上にウィンドウを表す ShellJava™ API リファレンス を構築します。

SWT では表示中のウィンドウ残っていても main() が終了すればプログラムも終了してしまいます。このためウィンドウが閉じるまでイベントキューからメッセージを拾ってディスパッチするというループ処理が必要です。

プログラムの終了前には使用したリソースを Display#dispose() で明示的に開放します。

Java
Display display = Display.getDefault();

// ウィンドウの構築と表示
Shell shell = new Shell(display);
shell.setText("ウィンドウタイトル");
Rectangle area = display.getBounds();
area.x = (area.width - 400) / 2 + area.x;
area.y = (area.height - 300) / 2 + area.y;
area.width = 400;
area.height = 300;
shell.setBounds(area);
shell.open();

// メッセージループ
while(! shell.isDisposed()){
    if(! display.readAndDispatch()){
        display.sleep();
    }
}
display.dispose();

Shell のコンストラクタには以下のウィンドウスタイルを論理和で指定することができます。

SWT.BORDERウィンドウ枠の表示
SWT.CLOSEタイトルバーの閉じるボタンの有効化
SWT.MINタイトルバーの最小化ボタンの有効化
SWT.MAXタイトルバーの最大化ボタンの有効化
SWT.RESIZEウィンドウのリサイズの有効化
SWT.TITLEタイトルバーの有無
SWT.NO_TRIM装飾なしの組み合わせ
SWT.SHELL_TRIM一般的なウィンドウの組み合わせ (CLOSE|TITLE|MIN|MAX|RESIZE)
SWT.DIALOG_TRIM一般的なダイアログの組み合わせ (CLOSE|TITLE|BORDER)
SWT.MODELESSモードレスウィンドウ
SWT.PRIMARY_MODALプライマリモーダルウィンドウ
SWT.APPLICATION_MODALアプリケーションモーダルウィンドウ
SWT.SYSTEM_MODALシステムモーダルウィンドウ

タブの表示

タブの表示

タブ切り替えの表示は TabFolderJava™ API リファレンス クラスを使用します。

これにに必要な数だけ TabItemJava™ API リファレンス を追加してゆき、タブ内容となるコンポーネントを TabItem#setControl() で指定します。

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

TabItem tab1 = new TabItem(tabFolder, SWT.NULL);
tab1.setText("タブ1");
Label greeting = new Label(tabFolder, SWT.NULL);
greeting.setText("hello, world");
tab1.setControl(greeting);

TabItem tab2 = new TabItem(tabFolder, SWT.NULL);
tab2.setText("タブ2");

TabItem tab3 = new TabItem(tabFolder, SWT.NULL);
tab3.setText("タブ3");
CVS 2008/03/29