Klasa powinna zaimplementować ActionListener lub użyć obiektu anonimowej klasy ActionListener

Jaki jest najlepszy sposób implementacji java.awt.event.ActionListener interfejsu?

Niech twoja klasa zaimplementuje ActionListener i doda to jako ActionListener:

class Foo implements ActionListener{

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

    public void actionPerformed(ActionEvent e) {

    }
}

Lub dodać obiekt anonimowej klasy ActionListener:

class Foo{

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

            }
        });
    }
}
Author: Raedwald, 2012-07-11

3 answers

Niektórzy (jeanette/kleopatra) mówią, aby prawie nigdy nie używać ActionListener, a zamiast tego używać akcji takich jak AbstractAction. To prawie zawsze zły ideał, aby Twoja klasa GUI implementowała Twoich słuchaczy, ponieważ łamie to zasadę pojedynczej odpowiedzialności i sprawia, że Twój kod jest trudniejszy do utrzymania i rozszerzenia, więc zdecydowanie nalegam, abyś tego nie robił.

Więc na przykład klasa wewnętrzna dla tego:

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");
      }
   }

}
 30
Author: Hovercraft Full Of Eels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-11 17:34:30

Druga opcja (Klasa anonimowa) jest z pewnością lepsza, inną opcją byłoby posiadanie zagnieżdżonej klasy w Foo.

Nie wybrałbym pierwszej opcji z dwóch powodów:

  • użytkownicy Foo nie powinni wiedzieć, że implementuje ActionListener.
  • nie można zaimplementować dwóch różnych słuchaczy w tej samej klasie.
 8
Author: casablanca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-11 17:28:31

To zależy. Jeśli chcesz ponownie użyć ActionListener w wielu komponentach, opcja pierwsza jest lepsza. Jeśli ActionListener będzie kiedykolwiek skojarzony tylko z jednym przyciskiem, opcja druga jest w porządku.

Ogólnie rzecz biorąc, tworzysz osobną klasę (lub klasę Wewnętrzną), jeśli przewidujesz pewien wzrost w projekcie. Nie ma potrzeby implementacji Foo ActionListener.

 4
Author: Rob Wagner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-21 14:47:23