Uruma では、画面上にボタンが押されるなどのイベントが発生した際、S2Container に登録されたコンポーネント上のメソッドを呼び出すことができます。
これを、メソッド・バインディング(Method Binding) と呼びます。
メソッド・バインディングを利用すると、GUI プログラミングにありがちなリスナークラスをいちいち作成するという、面倒なコーディングから解放されます。
メソッド・バインディングにより画面から呼び出されるクラスのことを、Uruma ではアクション・クラス と呼びます。アクション・クラスは画面と1対1となるように作成します。 今まで Web アプリケーションを作成してきた方は、Web アプリケーションにおける Action クラス とほぼ同じ位置づけと理解していただければよいでしょう。 アクション・クラスは、以下の命名規則で S2Container に登録します。
(画面の id (先頭を大文字にしたもの)) + Action
たとえば、画面の id (window 要素の id です)が、「hoge」の場合、「HogeAction」がアクション・クラスのコンポーネント名となります。
Convention over Configuration の考え方により、設定ファイルを書かなくても画面と POJO が結びつけられるわけです。
メソッド・バインディングでは、GUI コンポーネントの持つ id が、呼び出すメソッドを指定する役割を持ちます。
まず、アクション・クラス上で呼び出されるメソッドは、必ず @EventListener が記述されており、引数なしのメソッドである必要があります。次に、GUI コンポーネントの id と同じ名前のメソッドが呼び出されます。
たとえば、次のようなボタンがあった場合、
<button id="ok" text="OK" />
以下のようなメソッドと対応します。
@EventListener
public void ok() {
}
また、次のように @EventListener アノテーションの id 属性を明示的に指定することもできます。
この場合、メソッド名は自由に決めることができます。
@EventListener(id="ok")
public void onOkButton() {
}
@EventListener アノテーションでは、type 属性により、呼び出されるイベントを指定することができます。
たとえば、以下のような例では、ラベル上でマウスカーソルが動くたびにメソッドが呼び出されます。
@EventListener(type=EventListenerType.MOUSE_MOVE)
public void label() {
}
type 属性で指定する値は、EventListenerType クラスで定義されている定数を指定します。
定数には以下のようなものがあり、SWT で定義されているすべてのイベントを指定できます。
また、イベントの利用例については、org.seasar.uruma.annotation.EventListenerTypeTest クラスをご覧ください。
なお、type 属性に何も指定しない場合は、EventListenerType.SELECTION を指定したのと同じことになります。
| イベント | 説明 | イベント | 説明 |
|---|---|---|---|
| KEY_DOWN | キーを押したとき | ICONIFY | ウィンドウがアイコン化されたとき |
| KEY_UP | キーを離したとき | DEICONIFY | ウィンドウがアイコン化状態から元に戻ったとき |
| MOUSE_DOWN | マウスのボタンを押したとき | CLOSE | ウィンドウがクローズされるとき |
| MOUSE_UP | マウスのボタンを放したとき | ACTIVATE | ウィンドウがアクティブ化されたとき |
| MOUSE_MOVE | マウスカーソルを動かしたとき | DEACTIVATE | ウィンドウが非アクティブ化されたとき |
| MOUSE_ENTER | マウスカーソルがコンポーネント上に入ったとき | SHOW | メニューが表示されたとき |
| MOUSE_EXIT | マウスカーソルがコンポーネント上から出たとき | HIDE | メニューが非表示になったとき |
| MOUSE_DOUBLE_CLICK | ダブルクリックするとき | MODIFY | |
| MOUSE_HOVER | マウスカーソルを動かしたとき | VERIFY | |
| PAINT | コンポーネントを描画するとき | HELP | |
| MOVE | コンポーネントが移動したとき | ARM | |
| RESIZE | コンポーネントのサイズが変更されたとき | TRAVERSE | |
| DISPOSE | コンポーネントが破棄されたとき | DRAG_DETECT | ドラッグされたとき |
| SELECTION | コンポーネントが選択されたとき | HARD_KEY_DOWN | キーが押されたとき |
| DEFAULT_SELECTION | デフォルトのコンポーネントが選択されたとき | HARD_KEY_UP | キーが離されたとき |
| FOCUS_IN | コンポーネントにフォーカスが移ったとき | MENU_DETECT | |
| FOCUS_OUT | コンポーネントからフォーカスがはずれたとき | SET_DATA | |
| EXPAND | ツリーの項目が展開されたとき | MOUSE_WHEEL | マウスホイールが回転したとき |
| COLLAPSE | ツリーの項目が折りたたまれたとき |
アクション・クラスに @InitializeMethod アノテーションが記述されたメソッドがある場合、画面を表示する直前にそのメソッドが呼び出されます。
@InitializedMethod
public void initialize() {
...
}
なお、@InitializeMethod アノテートできるメソッド(以下、「イニシャライズ・メソッド」と呼びます)には以下のような制約があります。
アクション・クラスに @PostOpenMethod アノテーションが記述されたメソッドがある場合、画面を表示直後にそのメソッドが呼び出されます。
@PostOpenMethod
public void postOpen() {
...
}
なお、@PostOpenMethod アノテートできるメソッド(以下、「ポストオープン・メソッド」と呼びます)には以下のような制約があります。