WTKXからロードする
では今のGUIを、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!" /> </BoxPane> </content> </Window>
<content>タグ内に、今回使用したコンポーネント類がまとめられています。ここでは、次のようなタグが使われていることが分かります。
タグ | 説明 |
<BoxPane> | BoxPaneコンテナのタグです。orientation属性でレイアウトの方向を指定します。 |
<Label> | これは既に説明しました。Labelコンポーネントのタグです。 |
<TextInput> | 入力フィールドTextInputコンポーネントのタグです。stylesでフォントだけ指定してあります。 |
<PushButton> | PushButtonコンポーネントのタグです。ここではイベント関係は特に用意しておらず、buttonDataだけ用意してあります。 |
これらのうち、コンポーネント関係にはすべて「wtkx:id」という属性が用意されています。これは、各要素を識別するためのIDです。これは、この後のstartupメソッドで必要となるものですので、必ず用意しておきます。
startupメソッドを修正する
では、WTKXファイルからGUIをロードして使用するように、HelloAppクラスのstartupメソッドを修正しましょう。
// org.apache.pivot.wtkx.WTKXSerializer をインポートする @Override public void startup(Display display, Map<String, String> map) throws Exception { WTKXSerializer serializer = new WTKXSerializer(); window = (Window)serializer.readObject(this, "HelloApp.wtkx"); label = (Label)serializer.get("label"); input = (TextInput)serializer.get("input"); button = (PushButton)serializer.get("button"); button.getButtonPressListeners().add(new ButtonPressListener() { @Override public void buttonPressed(Button arg0) { String s = input.getText(); label.setText("You typed: " + s); } }); window.open(display); }
これで完成です。実際にプログラムを動かしてみて、先ほどとまったく同じようにGUIが表示され、ボタンのクリックイベントが動作することを確認してください。
WTKXからGUIをロードするには、WTKXSerializerクラスのreadObjectを利用しました。これでWindowはロードされますが、その中に組み込まれているコンポーネント類を取得するにはどうするのでしょうか。これは「get」メソッドで取り出せます。
変数 =《WTKXSerializer》.get(《wtkx:idの値》);
このようにして呼び出します。引数には、先ほどWTKXのコンポーネント・タグに用意したwtkx:idの値を指定します。これにより、指定のwtkx:idのタグで定義されたコンポーネントが変数に取得される、というわけです。