はじめてのUIBinderプログラミング
UIBinderとは
GWT2.0から用意された仕組みです。
- GUIレイアウトの定義をXMLで記述できる
- Widgetのイベント処理の記述が簡略化できる
といった利点があります。前者については、従来の方法だとクラスを生成しながらWidgetの配置を頭の中で想像する必要がありましたが、XMLで直接的に記述できるのでわかりやすくなります。後者は、イベントの記述が簡素化し、Javaコードの可読性が高まります。
以下は、サンプルプログラムにUiBinderで作った画面を表示するまでの基本操作です。
Eclipseでの作成方法
srcの上で右クリックをして、【New】→【Other】とウィザード画面を開きます。Google web ToolKit からUiBinderを選びます。
クラス名を入力してFinishを押します。デフォルトではサンプルコードが書かれますので、適時、チェックを外してください。
サンプルコードを理解する
【test.ui.xml】
このファイルにXML形式でインタフェース(画面)を設計します。具体的にはGWTのWidget(部品)を貼り付けます。ネームスペースが g:で始まっているのがGWTのタグです。UIBinderの便利なところは、一般的なCSSやHTMLの記述を含めてもほぼ問題ないということです。ここでのポイントは、ui:field属性です。ここで指定した名前が、Javaのコードで呼び出す部分になります。
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<ui:style>
.important {
font-weight: bold;
}
</ui:style>
<g:HTMLPanel>
Hello,
<g:Button styleName="{style.important}" ui:field="button" />
</g:HTMLPanel>
</ui:UiBinder>
【test.java】
このファイルに、各ウィジェットの操作を行います。内容を書き換えたり、イベント処理をしたりです。下記のサンプルでは、ボタンをクリックするとHelloというダイアログボックスが出てきます。
public class test extends Composite implements HasText {
private static testUiBinder uiBinder = GWT.create(testUiBinder.class);
interface testUiBinder extends UiBinder<Widget, test> {
}
public test() {
initWidget(uiBinder.createAndBindUi(this));
}
@UiField
Button button;
public test(String firstName) {
initWidget(uiBinder.createAndBindUi(this));
button.setText(firstName);
}
@UiHandler("button")
void onClick(ClickEvent e) {
Window.alert("Hello!");
}
public void setText(String text) {
button.setText(text);
}
public String getText() {
return button.getText();
}
}
変数の対応について
@UiFieldアノテーションで、xmlで定義したwidget要素と関連付けられます(同じ名前である必要があります)。@UiFieldアノテーションによる記述については、特にプログラム中で呼び出しをしないのであれば、インスタンス変数を記述する必要がありません。つまり、わざわざ newでインスタンスを生成する必要がないということです。ただし、@UiFieldアノテーションは、各変数ごとに必ず付けてください。
ダメな例)
下記のように書いたからと言って、それぞれがUiFieldとして解釈はされません
@UiField
Button btn1;
Button btn2;
良い例)
めんどくさいですが、ひとつづつ書いていきましょう。
@UiField
Button btn1;
@UiField
Button btn2;
同じクラスに限り、以下の書き方でもOKなようです。
@UiField
Button btn1,
btn2;
イベントの記述について(@UiHandler)
UIBinderで素晴らしいところは、イベントの記述が簡単になることです。@UiHandlerアノテーションで、イベント貼付けます。@UiHandlerアノテーションを利用したでのイベントの割り当てですが、
- イベントの関数名 はなんでもいい
- キャッチするイベントの種類を決定するのはメソッドの引数の型
@UiHandler("button")
void onClick(ClickEvent e) {
Window.alert("Hello!");
}
クリックイベントを拾いたいからといってメソッド名をonClickにしているのではありません。 上記の場合は、ClickEventを引数の型にしているので、buttonに対する ClickEventを拾っているのです。
イベントへの複数のWidgetへの割り当て
複数のWidgetに同じような処理を割り当てたい時は、下記のように複数指定できます。この場合、どのWidgetが反応したのかを識別したい場合は、getSourceメソッドを利用します。
@UiHandler({"radioButtonA","radioButtonB","radioButtonC"})
void onClickRadio(ClickEvent e) {
selectedRadioBtn = (RadioButton)e.getSource();
//Window.alert("Hello!");
}
UIBinderで作成したWidgetの呼び出し
以上まででは、プログラムを実行しても画面には反映されません。これを表示するには、通常のWidgetと同様にRootPanelにaddする必要があります。
サンプルプロジェクトで作成したFirstgwtを例にします。このプロジェクトでは、Firstgwt.javaファイルが onModuleLoadメソッドを含んだ起動クラスです。サンプルでは、下記のようにいろいろサンプルの記述があります。
、
とりあえず、下記のようにonModuleLoadのところを全てコメントアウトし、作成した UIBinderクラスである test をRootPanelにaddします。
これを実行すると、下記のようにボタンらしきものが表示されるのでクリックするとHelloのダイアログメッセージが出てくるはずです。