2006-04-20

SWTのBrowserウィジェットは便利

仕事でJavaのプログラムを書いているっていうと,StrutsやOracleやDIコンテナでゴー!っていうサーバサイドな人が多いと思いますが,私はクライアントサイドのアプリをJavaで作ってます。

特殊な端末向けの専用アプリで,いろいろとシステム上の都合からクライアントサイドアプリが必要なのです。GUIライブラリはSWT ver3.1.1を使っているんですが,これに含まれるBrowserウィジェットという画面部品が超便利なので,メモっておきます。

Browserウィジェットというのは簡単に言えば,IEコンポーネントをJavaから使えるようにしたものです。便利なのは,Browserウィジェットのほうから表示されるHTML上のJavaScriptを起動できること。

例えば,test.htmlのなかでtest()という関数が定義されてたら,次のようなコードで実行できます。


Browser browser = new Browser(this, SWT.NONE);
URL url = getClass().getResource("test.html");
browser.setUrl(url.toString());
browser.execute("test()");


さらにJavaScript内でwindow.statusに値を設定すると,そのイベントをJavaで拾って値を取得できます。それにはこんな感じでリスナを設定すればOK。


browser.addStatusTextListener(new StatusTextListener() {
public void changed(StatusTextEvent e) {
// JavaScriptで設定した値を表示する
System.out.println("window.status=" + e.text);
}
});



これで何かうれしいかというと,画面デザインをHTML+CSS+JavaScriptで出来るようになるからです。SWTはけっこう色々出来るんですが,やっぱり細かいデザインに拘りだすとSWTだけでやるのは難しい。新しい画面部品を作ったりしなくちゃいけなくなって面倒くさいです。

そういう場合にはHTMLとJavaScriptでガーっと作っちゃうことが出来ます。しかもコンパイル無しであとから変更可能!

前にprototype.jsの練習をしましたが,今になって役に立ってきてます。あとScript.acuo.usとか使うとデザインの幅が出てきて良い感じになります。

ということで,クライアントアプリでBrowserウィジェットを使うと,工期が短くて忙しいときでも,わりと簡単に画面が作れるよという話しでした。




ついでにBrowserウィジェットでちょっと嵌ったこともメモ。上でtest.html内のtest()関数を呼び出すサンプルを出したけど,Browserウィジェットからは外部JavaScriptファイルで定義された関数は呼び出せないみたい。

つまりtest.js内でtest()関数が定義されていて,そのtest.jsをtest.htmlが読み込んでいるとする。その場合はbrowser.execute("test()")とやってもtest()関数は呼ばれません。これがバグなのか仕様なのか調べてないけど,まぁそういうことらしい。

0 件のコメント: