Если ваш класс реализует ActionListener или использует объект анонимного класса ActionListener

Каков наилучший способ реализации интерфейса 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) {

            }
        });
    }
}

Ответ 1

Некоторые (jeanette/kleopatra) говорят, что почти никогда не используют ActionListener и вместо этого используют Actions, такие как 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");
      }
   }

}

Ответ 2

Второй вариант (анонимный класс), безусловно, лучше, другой вариант - иметь вложенный класс внутри Foo.

Я бы не пошел с первым вариантом по двум причинам:

  • Пользователям Foo не нужно знать, что он реализует ActionListener.
  • Вы не можете реализовать двух разных слушателей в одном классе.

Ответ 3

Это зависит. Если вы хотите повторно использовать ActionListener для нескольких компонентов, вариант лучше. Если ActionListener будет ассоциироваться только с одной кнопкой, вариант 2 в порядке.

Как правило, вы должны создать отдельный класс (или внутренний класс), если вы ожидаете некоторого роста в проекте. Нет необходимости в Foo для реализации ActionListener.