EclipseでGUIを作る場合、どんなのが適当かなーと 思ってたら SWT からブラウザが起動できるらしいので 試して見たがえらくはまった。

SWTから起動したブラウザはイベントをJavaで拾えるので ローカルアプリとの連係ができる。
通常のブラウザはセキュリティ上の制限が厳しくWebアプリと ローカルアプリを連係させるのは難しかったが これで簡単にできるかもしれない。

SWT の開発環境は以前はデフォルトで入っていたらしいのだが 最近の版では別途インストールが必要らしい。 しかもプラットフォーム毎に異なるバイナリが使う必要がある。

以下のURLから使っているEclipseと同じ版の「SWT Binary and Source」 を落してきてインストールする。

  • http://download.eclipse.org/eclipse/downloads/

FreeBSDの場合は ports の x11-toolkits/swt-devel からインストール でるので楽なのだがカテゴリが java/ でも develop/ でも 無いので探すのに苦労した。 しかもインストール先が /usr/local/share/java/classes/ なのですごく分かりにくい。

追記:Linux系の場合は libwebkitgtk-1.0 をインストールするのが楽。

コンパイルは ビルドパス にインストール先の swt-devel.jar を 追加するだけで通るようになる。

はまったのは実行で何も考えずに実行するとこんなエラーがでる。

org.eclipse.swt.SWTError: No more handles [Unknown Mozilla path (MOZILLA_FIVE_HOME not set)]

ググった情報を元に eclipse の起動スクリプトに設定を追加してみた。

export MOZILLA_FIVE_HOME=/usr/local/lib/firefox3 export LD_LIBRARY_PATH=$MOZILLA_FIVE_HOME:$LD_LIBRARY_PATH

しかし別のエラーが...

UnsatisfiedLinkError: no swt-mozilla-gtk-3555 or swt-mozilla-gtk in swt.library.path, java.library.path or the jar file

しかし、 swt-develでインストールされるライブラリはこれだけだ。

libswt-atk-gtk-3631.so libswt-awt-gtk-3631.so libswt-cairo-gtk-3631.so libswt-glx-gtk-3631.so libswt-gnome-gtk-3631.so libswt-gtk-3631.so libswt-pi-gtk-3631.so libswt-xulrunner-gtk-3631.so

本来なら libswt-xulrunner-gtk-3631.so が使われるべきと 思うのだがググっても良く分からない。

探し回ったらこんな所に居やがったのだが明らかに旧版。

~/eclipse/org.eclipse.platform_3.4.0_185596441/configuration/org.eclipse.osgi/bundles/129/1/.cp/libswt-mozilla-gtk-3452.so

バージョンの混乱が起こっているようなのだが原因がわからないので SWT のソースを読みまくってやっと状況が見えてきた。

最初に libswt-xulrunner-gtk の使える環境か否か調べて だめなら libswt-mozilla-gtk を使うようになっていた。

で、ソースをさらに読むとシステムプロパティに org.eclipse.swt.browser.XULRunnerPath が設定されていないと xulrunner を使わないようになっている事が判明。

実行環境に設定したら動いたよ。

-Dorg.eclipse.swt.browser.XULRunnerPath=/usr/local/lib/firefox3

言及しているサイトはあんまり無いけどFirefoxのみの設定だからか?

あちこちにあるサンプルだけど一応置いとく。

import org.eclipse.swt.widgets.*; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.*; import org.eclipse.swt.events.*; import org.eclipse.swt.layout.*; public class BrowserTest { public static void main(String[] args) { Display display = new Display(); final Shell shell = new Shell(display); shell.setText("BrowserTest"); shell.setLayout(new FillLayout()); Browser browser = new Browser(shell, SWT.NONE); browser.setUrl("http://www.yahoo.co.jp"); shell.setSize(800, 600); shell.open(); while (!shell.isDisposed ()){ if (!display.readAndDispatch ()){ display.sleep (); } } shell.dispose(); display.dispose(); } }

実行結果: