ウィジェットの使い方、レイアウトの設定等、Swingアプリケーションとよく似ているため、Swingを知っている人はそれほど違和感なくプログラミングできるはずです。
以下ではSWTアプリケーションと作成のポイントを簡単に説明します。
Display display = new Display();
Shell shell = new Shell(display);
shell.pack(); // Swingのpack()と同様
shell.open(); // SwingのsetVisible(true)と同様
// 窓が閉じるまでメインスレッドを終了しない
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
IMPORTANT: This class is not intended to be subclassed・・・(Shellクラス) IMPORTANT: This class is intended to be subclassed only within the SWT implementation・・・(Buttonクラス)
Button button = new Button(shell, SWT.PUSH);
Text text = new Text(shell, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);
Table#setLinesVisible(boolean);
準備で取得したSWTの媒体の中のswt.jarをクラスパスに指定し、コンパイルする。
% javac -classpath swt.jar -d classes src/*.java
尚、swt.jarはプラットフォーム毎に異なります。筆者はWindows版SWTのswt.jarでビルドしたアプリケーションをLinux環境で動作させることができました(実行時はLinux版SWTのswt.jarを使用)。ネイティブライブラリと結びつく部分だけが異なっているのであれば、コンパイルはどのプラットフォーム向けのjarを利用しても問題ないということかもしれません。
コンパイルで生成されたクラスファイル及びSWTの媒体に含まれるjarファイルををクラスパスに指定し、JVMがネイティブライブラリをロードできるように、java.library.pathシステムプロパティでネイティブライブラリの位置を指定します。
以下はWindowsプラットフォームで実行する場合のコマンド例です。
% java -cp classes;lib/windows/jar/swt.jar
-Djava.library.path=lib/windows/dll ターゲットクラス
Linux(gtk)版ではjarファイルが2つあるため、
% java -cp classes:lib/linux-gtk/jar/swt.jar:lib/linux-gtk/jar/swt-pi.jar
-Djava.library.path=lib/linux-gtk/so ターゲットクラス
のようにします。
以下は表とボタンを貼り付けたシンプルなGUIアプリケーションのWindowsとLinux環境でのスナップショットです。

SWTアプリケーション(Windows)

SWTアプリケーション(Linux-gtk)
以下のスナップショットは同じような画面をSwingで作成したものです。

Swingアプリケーション
Java Web Startを利用することによって、ブラウザからのリンククリックで、SWTアプリケーションをクライアントサイドで実行させることができます。Java Web StartはWeb ブラウザに関連付けて使用するヘルパーアプリケーションで、ユーザが特別な起動ファイル (JNLP ファイル) を指すリンクをクリックすると、ブラウザが Java Web Start を起動します。Java Web Startの主な利点は以下になります(Java Web Start開発者ガイドから抜粋)。
また、ブラウザからのリンククリックによる起動以外に、「Java Web Start アプリケーションマネージャ」(JWS付属)からアプリケーションを起動することも可能です。ブラウザはこのJava Web Start アプリケーションマネージャをキックする役目でしかありません。
尚、ネイティブライブラリ(WindowsならばDLL, Linuxならばso)についてもjarコマンドでアーカイブしたものをWebサーバ上へ配置する必要があります(Java Web Startによって配布可能な媒体は、Jar, イメージ, JNLPファイルです)。複数のライブラリを一つのJarにアーカイブすることが可能です。
JNLPファイルはアプリケーションの基本的な要素や説明を記述したXMLファイルで、ダウンロードされるJarファイルや実行クラス名等を記述します。
ブラウザからこのファイルへアクセスすると、WebサーバからMIME タイプ"application/x-java-jnlp-file"としてHTTPレスポンスが返されます。ブラウザではそのMIMEタイプを見てJava
Web Startを実行します。
そのため、まずWebサーバの要件として、JNLPファイルへのアクセスに対してapplication/x-java-jnlp-file MIME タイプを設定するようWebサーバを構成する必要があります。Apache等のWebサーバではMIMEタイプの設定が必要でしょう。尚、Tomcat4.1.27では拡張子.jnlpへのアクセスでMIMEタイプがapplication/x-java-jnlp-fileに設定されました。そのため、デフォルト設定でJava Web Startを使うことができます。
クライアントサイドでは上述のようにHTTPレスポンスのMIMEを見て、ブラウザがJava Web Startを実行します。そのため、クライアント側の要件としては、この2点が必要になります。
プラットフォームがWindowsであり、JDK1.4.2以降をインストールしていれば、1,
2の設定は不要です(既に設定されています)。JDK1.4.1以前がインストールされているならばJava
Web Startを個別にインストールする必要があります。Java Web Startのインストールによって、2が設定されます。
まずはJNLPファイルを用意する必要があります。JNLPファイルにはアプリケーションの情報や、ダウンロードすべきリソースを記述します。このファイルをJava Web Startが解析し、Java Web Startによってリソースのダウンロードが行われ、アプリケーションが起動されます。
SWTアプリケーション配布のために、以下のJNLPを作成しました。
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="http://hostname:8080/swt" href="index.jnlp">
<information>
<title>SWT Table Example</title>
<vendor>ESC</vendor>
<homepage href="index.html"/>
<description>SWT Table Example</description>
<description kind="short">SWT Table Example</description>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.4+"/>
<jar href="lib/application.jar"/>
</resources>
<resources os="Windows">
<jar href="lib/windows/jar/swt.jar"/>
<nativelib href="lib/windows/dll/swt-win.jar"/>
</resources>
<resources os="Linux">
<jar href="lib/linux-gtk/jar/swt.jar"/>
<jar href="lib/linux-gtk/jar/swt-pi.jar"/>
<nativelib href="lib/linux-gtk/so/swt-linux.jar"/>
</resources>
<application-desc main-class="swt.Main"/>
</jnlp>
JNLPファイルの仕様の詳細は割愛します。ここではポイントだけ簡単に解説します。
このJNLPファイルをWebサーバへ必要なリソースと共に配置し、ブラウザやJava Web Start アプリケーションマネージャから要求を出せば、SWTアプリケーションが起動します。
Java Web Startではクライアントでアプリケーションを起動する際、更新されたファイルがないかサーバ側へ問い合わせ、もしあればダウンロードを行う仕組みが備わっています。従って、サーバ側のJarファイルを更新するだけで、次回の起動時にクライアント側へファイルが自動的に配布されます(正確には、Java Web StartからWebサーバへGET要求を出し、それに対するWebサーバのレスポンスで、更新されているかどうかを判断する)。サーバ側からクライアントへファイルを配布する必要はありません。
ただ、複数のバージョンのJarをサーバへ配置し、設定を変更するだけでダウンロードさせるバージョンを変えたい場合もあると思います。このようなバージョン管理の仕組みは「Java Web Start 開発者向けパック」によって実現できます。
Java Web Start 開発者向けパックには、上記を行うためのサーブレットが含まれており、サーブレット・コンテナ上で動作するWebアプリケーションとして提供されています。そのため、サーバ側の要件として、新たにサーブレット・コンテナが必要になります。
<servlet>
<servlet-name>
JnlpDownloadServlet
</servlet-name>
<servlet-class>
com.sun.javaws.servlet.JnlpDownloadServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JnlpDownloadServlet</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
以下は異なるバージョン(1.0と1.1とする)のJarを2つ用意し、サーバ側の設定によってどちらを実行するかを切り替える例です。まずJNLPファイルでJarファイルにversion属性を追加します。
<resources>
<j2se version="1.4+"/>
<jar href="application.jar" version="1.0"/>
</resources>
次に、以下の version.xml ファイルを作成し、JNLPファイルと同じディレクトリに配置します。
<?xml version="1.0" encoding="utf-8"?>
<jnlp-versions>
<resource>
<pattern>
<name>application.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>application-1_0.jar</file>
</resource>
<resource>
<pattern>
<name>application.jar</name>
<version-id>1.1</version-id>
</pattern>
<file>application-1_1.jar</file>
</resource>
</jnlp-versions>
version.xmlでは、JNLPで指定されたバージョンに対して、実際にどのファイルをダウンロードさせるかを記述します。この例ではJNLPファイルで version=1.0 としているため、application-1_0.jar がダウンロードされます。バージョン1.1のJar(application-1_1.jar)で動作させたい場合は、JNLPファイルでバージョンを1.0→1.1に変更すれば、次回の起動でapplication-1_1.jar がダウンロードされ、実行されます。
筆者自身、今回初めてSWTアプリケーションを作成しましたが、その過程で感じた感想を以下に挙げます。
| SWT on Windows | Swing on Windows | SWT on Linux(gtk) | Swing on Linux | |
|---|---|---|---|---|
| PgDnスクロール | 21 | 14 | 30 | 15 |
| マウス スクロール | 21 | 24 | 48 | 29 |
| カーソルキー スクロール | 34 | 35 | 40 | 35 |
| PgDnスクロール(Accel OFF) | 72 | 15 | 21 | 15 |
| マウス スクロール(Accel OFF) | 22 | 25 | 46 | 29 |
| カーソルキー スクロール (Accel OFF) |
34 | 34 | 188 | 119 |
| SWT on Windows | Swing on Windows | |
|---|---|---|
| PgDnスクロール | 14 | 13 |
| マウス スクロール | 26 | 26 |
| カーソルキー スクロール | 33 | 32 |
| PgDnスクロール(Accel OFF) | 28 | 13 |
| マウス スクロール(Accel OFF) | 26 | 26 |
| カーソルキー スクロール (Accel OFF) |
32 | 32 |
| SWT on Windows | Swing on Windows | SWT on Linux(gtk) | Swing on Linux | |
|---|---|---|---|---|
| PgDnスクロール | 13 | 17 | 114 | 17 |
| マウス スクロール | 19 | 30 | 59 | 35 |
| カーソルキー スクロール | 22 | 28 | 55 | 121 |