SWTでWEBブラウザを操作するアプリケーションを作成してみる 〜その1〜

Javaでブラウザを操作するようなプログラムを作成してみることにしました。以下はその備忘録です。

この記事ではSWTアプリケーション作成の第一歩として「ウィジェットが配置されていない空のウィンドウを出力するまで」を記載しています。

SWTについて

Javaでブラウザを操作するとなるとGUIコンポーネントを利用することになりますが、ここではSWTというものを利用することにします。

SWT(Standard Widget ToolKit)は、Eclipseプロジェクトから提供されているGUI作成用ツールキットです。

このSWTパッケージ内のBrowserというクラスを利用することで、ブラウザを操作するアプリケーションが作れるようです。

他にもSwingにMozSwingという高機能なWEBブラウザコンポーネントがあるようですが、WEB上の情報が少ないので今回はSWTを利用することにします。

http://d.hatena.ne.jp/kaiseh/20090608/1244463562

SWTのダウンロード

SWTは下記URLからダウンロードできます。

http://www.eclipse.org/swt/

ページ上部のStableという文字があるあたりで、OS名がテキストリンクとなっているリンクをクリックし、ダウンロード先ミラーを選択することでダウンロードすることができます(2010/07/19現在)。

SWTはOSのネイティブAPIを利用するものだそうで、純粋なJavaではないようです。したがって、WindowsならWindows用のSWTを、LinuxならLinux用のSWTを利用する必要があります。

Eclipseでの外部Jar追加

ダウンロードしたファイルを解凍すると、swt.jarというJarファイルがあります。

今後SWTを利用したソースコードを書いていく際はこれをインクルードする必要があります。

Eclipseでは適当な名前でプロジェクトを作成したあと、

パッケージエクスプローラ内のプロジェクト名を右クリック → ビルド・パス → ビルド・パスの構成 → ライブラリーのタブを選択し、"外部Jar追加"ボタンを押下 → swt.jarを参照して開く

上記のような手順でswt.jarを追加することができます。

正しくswt.jarを読み込めている場合は、以下のクラスを実行するとタイトルバーに「Hello SWT」という文字が入ったウィンドウが立ち上がります。

適当にHelloSwtなどという名前をつけてクラスを保存して、実行してみてください。

package jp.linuxserver;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class HelloSwt {

        private Display display = new Display();
        private Shell shell = new Shell(display);

        public static void main(String[] args) {
                HelloSwt hello = new HelloSwt();
                hello.openWindow();
        }

        public HelloSwt() {
            shell.setText("Hello SWT");
            shell.setSize(1024, 768);
        }

        public void openWindow() {
            shell.open();
            while (!shell.isDisposed()) {
            	if (!display.readAndDispatch()) {
            		display.sleep();
            	}
            }
            display.dispose();
        }
}

メッセージループ

SWTアプリケーションには、表示中のウィンドウが残っていても、メインメソッドが終了すればプログラムも終了してしまうという特性があります。

したがって、ウィンドウの閉じるボタンが押下されるまで勝手にプログラムが終了しないように、イベントキューからメッセージを拾ってディスパッチするというループ処理が必要です。

上記のテストクラスではwhile文でループしている箇所がそれに相当します。

SWTのクラス

上記のテスト用クラスには様々なSWT固有のクラスが利用されていますが、それらの簡単な解説は以下のとおりです。

Displayクラス
プログラムが動いているOS固有のウィンドウシステムとの橋渡しを行い、そのOSが使っているイベントモデルをSWTのイベントループで処理できるようにするためのもの。

SWTアプリケーションではまずこの操作を最初に行う。

Shellクラス
引数にDisplayクラスのインスタンスを指定した場合はタイトルバーや最小化/最大化/閉じるボタンを持つトップレベルウィンドウとなる。

SWTアプリケーションではこのトップレベルウィンドウ内にウィジェットを配置していくことになる。

参考資料