Java.use(better);

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


Episode#08《改訂版》

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


《関連記事》


《改訂版》

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

同種のリスナーを異種のコンポーネントと関係付けたいことがあります。たとえば、

abstract class ActionPerformed
  implements Reactor, ActionListener {
  public void actionPerformed(ActionEvent e) {
    execute();
  }
}

リスナー ActionListener は、ボタンやメニュー項目を選択したり、フィールドに入力したときに発生するイベント ActionEvent に呼応して、メソッド actionPerformed を呼び出すので、必要な処理を実行 execute するように依頼します。そのためには事前に、

abstract class ButtonClicked extends ActionPerformed {
  protected AbstractButton source;
  public void listenTo(AbstractButton comp) {
    comp.addActionListener(this);
    source = comp;
  }
}

abstract class EditDone extends ActionPerformed {
  protected JTextField source;
  public void listenTo(JTextField comp) {
    comp.addActionListener(this);
    source = comp;
  }
}

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

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

      JRadioButton comp = new JRadioButton(item);
      new ButtonClicked() {
        public void execute() {
          frame.setTitle(source.getText());
        }
      }.listenTo(comp);

抽象クラス ButtonClicked を具象化したインスタンスは、ボタンを選択したときのイベントに呼応 listenTo して、メソッド execute を呼び出します。すると、選択したボタンのテキスト getText をもとに、ウインドーのタイトルを変更します。

次の事例では、テキストフィールドに入力すると、ウインドーのタイトルが変化します。

    JTextField comp = new JTextField();
    new EditDone() {
      public void execute() {
        frame.setTitle(source.getText());
      }
    }.listenTo(comp);

抽象クラス EditDone を具象化したインスタンスは、テキストフィールドに入力したときのイベントに呼応 listenTo して、メソッド execute を呼び出します。すると、入力したフィールドのテキスト getText をもとに、ウインドーのタイトルを変更します。

 ↑ TOP

》作業中です《

update*13/01/29 20:07:16