S2Swing的なもの開発記: アクションとイベントのバインディング

以下のような仕様で、自動バインディングの仕組みを作ってみました。試した感触はなかなか悪くないです。

アクションのバインディング仕様

まず、アクションハンドラとなるメソッドを作成し、@Actionアノテーションを付けます。ここまではSwing Application Frameworkと共通の手順です。

次に、アクションを発生させたいコンポーネントのフィールドに、アクションメソッド名を指定した@ActionSourceアノテーションを付けます。これによって、コンポーネントとアクションが自動的にバインドされます。

ちなみに、Swing Application Frameworkの機能によって、アクションは簡単に非同期化できます。アクション名やアクセラレータキー設定をプロパティファイルからインジェクションすることも可能です。

@ActionSource("openFile")
private JButton openFileButton;
@ActionSource("openFile")
private JMenuItem openFileMenuItem;

@Action
private void openFile() {
    // アクションの実行
}

イベントのバインディング仕様*1

コンポーネント名_イベント識別子』の名前規約に従ってメソッドを作成し、@Eventアノテーションを付けると、コンポーネントとイベントが自動的にバインドされます。こちらも、イベント処理を簡単に非同期化できるようになっています。

private JTextField textField;

@Event
private void textField_keyPressed(KeyEvent e) {
    // イベントの処理
}

// 非同期タスク処理中のブロッキング対象を指定可能
@Event(block = BlockingScope.COMPONENT)
private Task textField_focusGained(FocusEvent e) {
    // Taskを返すことで非同期化
    return new SomeAsyncTask();
}

*1:NetBeansを使う場合、GUIデザイナがイベントの面倒を見てくれるので必要性の薄い機能かもしれませんが、動的にコンポーネントを生成するようなケースでも上記バインディングは有効なので、それなりに便利だと思います。