アノテーションを使った書き方
ここではstartupでイベント処理などまで組み込んでいましたが、もしstartup内でコンポーネントを利用した処理が不要ならば、コンポーネントの取得は実はもっとシンプルにできます。Pivotに用意されているアノテーションを利用することで、コードを記述する必要がなくなるのです。HelloAppクラスに用意されているインスタンスフィールドを、次のように書き換えるのです。
@WTKX private Label label; @WTKX private TextInput input; @WTKX private PushButton button;
これで、WTKXからロードされたコンポーネントが、それぞれのフィールドに自動的に設定されます。startupメソッドに、getの処理を各必要はありません。
ここでは、org.apache.pivot.wtkx.WTKXクラスに用意されている@WTKXアノテーションを利用してインスタンスフィールドを宣言しています。これは、WTKXSerializerでロードされたオブジェクト内から、インスタンスフィールドの変数名と同じ名前のID(wtkx:id)のものを自動的にgetするものです。これにより、フィールドを用意しておくだけで自動的にロードしたコンポーネントが使えるようになります。
JavaScriptでイベント処理を実装する
これでGUIをWTKXファイルに切り離すことはできましたが、依然としてイベント処理部分、すなわちビジネスロジックについてはJavaのコード内にまとめられています。できればこの部分も外部に切り離してしまいたいところです。
Pivotでは、WTKX内にJavaScriptのスクリプトとして処理を記述することができます。スクリプトは、ファイルがロードされるとRhino(Java6より組み込まれているJavaScript実装)によって実行されます。では、HelloAppクラスを書き換えてみましょう。
@Override public void startup(Display display, Map<String, String> map) throws Exception { WTKXSerializer serializer = new WTKXSerializer(); window = (Window)serializer.readObject(this, "HelloApp.wtkx"); window.open(display); }
非常にシンプルになりました。では続いて、WTKXファイルを修正しましょう。HelloApp.wtkxを次のように書き換えてください。これで先ほどと同様の処理が実装されます。
<Window title="Sample" maximized="true" xmlns:wtkx="http://pivot.apache.org/wtkx" xmlns="org.apache.pivot.wtk"> <content> <BoxPane orientation="vertical"> <Label wtkx:id="label" styles="{font:'bold 24', color:'#0000FF'}" text="テキストを入力:" /> <TextInput wtkx:id="input" styles="{font:'Serif plain 14'}" /> <PushButton wtkx:id="button" buttonData="OK!"> <buttonPressListeners> <wtkx:script> function buttonPressed(button){ var s = input.getText(); label.setText(s + " と書いた。"); } </wtkx:script> </buttonPressListeners> </PushButton> </BoxPane> </content> </Window>
ここでは、<PushButton>タグ内に、<buttonPressListeners>というタグを用意しています。これが、ButtonPressListenerの情報を記述するためのものです。この中に、リスナーに実装されるメソッドを記述します。メソッドは、<wtkx:script>タグの中に、JavaScriptの関数として記述されます。メソッド名や引数などは、ButtonPressListenerに用意されるbuttonPressedと同じであることが分かるでしょう。
メソッド内では、wtkx:idで指定されたID(ここではinput、label)がそのまま使われています。このように、イベントまですべてWTKX内に用意してしまえば、Java側にはWTKXファイルをロードする処理だけしか書く必要はありません。Javaのコードが非常にシンプルになり、GUIの表示からイベント処理まで、ほとんどのコードをWTKXファイルという、XMLで記述したテキストファイルで用意できるようになります。