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) {
}
});
}
}
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");
}
}
}
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 implementujeActionListener
. - nie można zaimplementować dwóch różnych słuchaczy w tej samej klasie.
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
.
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