17

java.awt.event.ActionListenerインターフェイスを実装するための最良の方法は何ですか?

クラスに ActionListener を実装させ、これを ActionListener として追加します。

class Foo implements ActionListener{

    public Foo() {
        JButton button = new JButton();
        button.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e) {

    }
}

または、匿名 ActionListener クラスのオブジェクトを追加します。

class Foo{

    public Foo() {
        JButton button = new JButton();
        button.addActionListener(new ActionListener() {     
            public void actionPerformed(ActionEvent e) {

            }
        });
    }
}
4

3 に答える 3

30

一部の (jeanette/kleopatra) は、ActionListener をほとんど使用せず、代わりに AbstractAction などのアクションを使用すると述べています。ほとんどの場合、GUI クラスにリスナーを実装させるのは理想的ではありませんが、これは単一責任の原則を破り、コードの保守と拡張をより困難にするため、そうしないことを強くお勧めします。

たとえば、このための内部クラス:

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;

class Foo {

   public Foo() {
       JButton button = new JButton(new ButtonAction("Action", KeyEvent.VK_A));
   }

   private class ButtonAction extends AbstractAction {
      public ButtonAction(String name, Integer mnemonic) {
         super(name);
         putValue(MNEMONIC_KEY, mnemonic);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         System.out.println("button pressed");
      }
   }

}
于 2012-07-11T17:24:56.667 に答える
8

2 番目のオプション (匿名クラス) の方が確かに優れています。別のオプションは、 内にネストされたクラスを持つことFooです。

次の 2 つの理由から、最初のオプションは使用しません。

  • のユーザーは、Fooが実装されていることを知る必要はありませんActionListener
  • 同じクラスに 2 つの異なるリスナーを実装することはできません。
于 2012-07-11T17:28:31.103 に答える
4

場合によります。ActionListener複数のコンポーネントでを再利用する場合は、オプション 1 の方が適しています。ActionListenerが 1 つのボタンにのみ関連付けられる場合は、オプション 2 で問題ありません。

一般に、プロジェクトの成長が予想される場合は、別のクラス (または内部クラス) を作成します。Fooを実装する必要はありませんActionListener

于 2012-07-11T17:27:12.827 に答える