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 アノテートできるメソッド(以下、「ポストオープン・メソッド」と呼びます)には以下のような制約があります。