2012-09-17 28 views
8


Przepraszamy za tytuł, prawdopodobnie zbyt ogólny.Najlepsze praktyki ActionListener

Już przeczytałem tutorial How to Write an Action Listener Java i już przeczytałem this question, ale wciąż mam pewne wątpliwości: Zastanawiałem się, które rozwiązanie jest najlepsze, gdy muszę wykonać tę samą akcję wiele razy.

Chciałbym ponownie użyć tego samego ActionListener, ale nie jestem pewien, jak to osiągnąć w najlepszy sposób (mówiąc w kategoriach: czytelność kodu, wydajność kodu, wydajność i styl kodu).

Pierwszy „standardowy” kod (które chciałbym użyć, jeśli nie będę ponownie użyć słuchacza działania):

btnMenu.addActionListener(
    new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      Navigator.showMenu(); 
     } 
    } 
); 

W ten sposób nic nie mogę ponowne Aw, ponieważ jest anonimowy wewnętrzna klasa ...

teraz mogę myśleć o następujących rozwiązań:

  1. Store odwołaniem od anonimowej klasy wewnętrznej w polu (który najprawdopodobniej będzie static final);
  2. Napisz nową klasę, która implementuje interfejs ActionListener.

kod Przykład roztwór 1

public static final MENU_ACTION_LISTENER = new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     Navigator.showMenu(); 
    } 
}; 

btnMenu.addActionListener(MENU_ACTION_LISTENER); 

przykłady w roztworze 2:

// package-private, only GUI-package classes should be able to use it. 
// most likely I won't ever need to subclass it, so why not making it final? 
final class MenuActionListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     Navigator.showMenu(); 
    } 
} 

// now, wherever I need to use it: 
btnMenu.addActionListener(new MenuActionListener()); 

że pewne wątpliwości obu roztworów:

  1. gdzie są przechowywane odniesienia do anonimowych słuchaczy akcji? Mogłem mieć jakąś klasę narzędziową (np. ActionListenersUtil), w której przechowywać wszystkie detektory działania, które chcę ponownie wykorzystać w polach static final, ale nie podoba mi się to ... wydaje mi się złym projektem.

  2. większy sens, prawdopodobnie najlepiej podąża za Command Pattern ... Ja początkowo miał pewne wątpliwości na temat pakietów ... Chciałbym mieć wszystkie słuchaczy w osobnym opakowaniu (np com.myapp.gui dla elementów GUI i com.myapp.gui.listeners dla Ale kiedy to zapisałem, zdałem sobie sprawę, że nie mam wyboru: jedyne miejsce, w którym ma sens, jest w tym samym pakiecie (ponieważ muszą być one musi być paczką-prywatną), nawet jeśli ze względu na porządek bym miał lubię umieszczać je wszystkie w osobnym pakiecie Nadal mam pewne wątpliwości, ponieważ większość detektorów akcji może być ponownie użyta, nawet w przypadku zmian GUI, ale nadal dobrze byłoby mieć go w tym samym opakowaniu?

Kolejne pytanie: jaka jest różnica między wywołaniem btnMenu.addActionListener(MENU_ACTION_LISTENER); i btnMenu.addActionListener(new MenuActionListener()); (mówienie w perspektywie JVM, klasa, klasa obciążenia kompilacji pamięci zajmowanej przez poszczególne klasy, zbieranie śmieci i tak dalej)?

Proszę o pomoc, jestem teraz tak zagubiony! :(

Odpowiedz

14

Najlepszym sposobem jest utworzenie Action zamiast ActionListener, jeśli musisz dołączyć go do przycisków, menu, ....Action jest model JButton, a model ma być wspólna

To daje również możliwość zmiany, ikonę tekstową, status włączona, i inne właściwości wszystkich przycisków że Action jest przyłączony do w tym samym czasie bez wielu połączeń. Dodatkowo można go dołączyć do pozycji menu i tak samo dobrze. Aby uzyskać numer Action, nie trzeba zaczynać od początku. AbstractAction to dobry punkt wyjścia. The Swing Action tutorial jest również dobrą lekturą.

+3

+1 Daje to również możliwość zmiany tekstu, ikony, statusu włączonego i innych właściwości wszystkich przycisków, do których "akcja" jest dołączona w tym samym czasie bez wielu połączeń. Dodatkowo można go dołączyć do pozycji menu i tak samo dobrze. – Brian

+1

+1000 gdybym mógł ... ;-) –

+0

@Brian bardzo dobra uwaga. Kopiuję-wkleiłem to w odpowiedzi, aby było bardziej kompletne – Robin