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(); }