メニューとメソッドバインディング

メソッドバインディングの一環として、メニューとメソッドバインディングの関係について考えてみます。

メニューついては、すでに id:dkameya さんがレンダラを作成してくれたので、以下のようなXMLを書くことでウィンドウにメニューを追加できるようになっています。

    <control type="menu">
      <item label="ファイル(&amp;F)">
        <item label="開く(&amp;O)..." />
        <item label="終了(&amp;X)" />
      </item>
      <item label="ヘルプ(&amp;H)">
        <item label="バージョン情報(&amp;V)..." />
      </item>
    </control>

実際には、メニューが選択された結果としてJava側のロジックが呼び出されなくてはならないので、メソッドバインディングが必要です。

今のメソッドバインディングの仕組みは、ウィジットのIDとS2Container上のコンポーネントのメソッドを命名規約またはアノテーションで結びつけるというものでした。

今のままだと、 item 要素に id 属性はないので、直接の紐付けができません。

そこで、以下のような感じにメニューの記述方法を変えたいと思います。

    <composite type="menu">
      <composite type="submenu">
        <property name="label">ファイル(&amp;F)</property>
        
        <control id="menuOpen" type="menuitem">
          <property name="label">開く(&amp;O)...</property>
        </control>
        <control id="menuTerminate" type="menuitem">
          <property name="label">終了(&amp;X)</property>
        </control>
      </composite>
      
      <composite type="submenu">
        <property name="label">ヘルプ(&amp;H)</property>
        <control id="menuVersion" type="menuitem">
          <property name="label">バージョン情報(&amp;V)...</property>
        </control>
      </composite>
    </composite>

これなら、各 menuitem に対して id が付加できるので、メソッドバインディングが可能です。

欠点として、現在の方法よりも記述が煩雑になってしまうことがあげられます。(このあたりは非常に悩むところですが、将来作成するエディタでカバーできればよいでしょうか)

いかがでしょう? > id:dkameya さん。