Java.use(better);

前の記事次の記事
Java.use(better);


Episode#08《改訂版》

Command パターンの応用 -- GoF を反面教師に


《関連記事》


《改訂版》

  • Scala に準拠するように、クラス/メソッドの名前を変更しました。
□ 異種のコンポーネントに対して同一のメソッドを利用する

異種のコンポーネントに対して同一のメソッドを利用したいことがあります。たとえば、

abstract class ValueChanged
  implements Reactor, ListSelectionListener, TreeSelectionListener {
  public void valueChanged(ListSelectionEvent e) {
    execute();
  }
  public void valueChanged(TreeSelectionEvent e) {
    execute();
  }
}

リスナー ListSelectionListener/TreeSelectionListener は、リスト項目/ツリー項目を選択したときに発生するイベント ListSelectionEvent/TreeSelectionEvent に呼応して、同じメソッド valueChanged を呼び出すので、必要な処理を実行 execute するように依頼します。そのためには事前に、

abstract class ListSelectionChanged extends ValueChanged {
  protected JList source;
  public void listenTo(JList comp) {
    comp.addListSelectionListener(this);
    source = comp;
  }
}

abstract class TreeSelectionChanged extends ValueChanged {
  protected JTree source;
  public void listenTo(JTree comp) {
    comp.addTreeSelectionListener(this);
    source = comp;
  }
}

異なるコンポーネント JList/JTree ごとに、対応するメソッド addListSelectionListener/addTreeSelectionListener を利用して、リスナーを登録しておく必要があります。このとき、フィールド source を介して、抽象クラスごとに固有のコンポーネントにアクセスできます。

次の事例では、リスト項目を選択すると、ウインドーのタイトルが変化します。

    JList comp = new JList("red,green,blue".split(","));
    new ListSelectionChanged() {
      public void execute() {
        frame.setTitle(source.getSelectedValue()+"");
      }
    }.listenTo(comp);

 ̄抽象クラス ListSelectionChanged を具象化したインスタンスは、リスト項目を選択したときのイベントに呼応 listenTo して、メソッド execute を呼び出します。すると、選択したリスト項目の情報 getSelectedValue をもとに、ウインドーのタイトルを変更します。

次の事例では、ツリー項目を選択すると、ウインドーのタイトルが変化します。

    new TreeSelectionChanged() {
      public void execute() {
        frame.setTitle(source.getLastSelectedPathComponent()+"");
      }
    }.listenTo(comp);

抽象クラス TreeSelectionChanged を具象化したインスタンスは、ツリー項目を選択したときのイベントに呼応 listenTo して、メソッド execute を呼び出します。すると、選択したツリー項目の情報 getLastSelectedPathComponent をもとに、ウインドーのタイトルを変更します。

 ↑ TOP

》作業中です《

update*13/01/29 20:32:19