2012-09-17 15 views
8


Ci scusiamo per il titolo, probabilmente troppo generico.ActionListener best practice

Ho già letto il tutorial da Java e ho già letto this question, ma ho ancora qualche dubbio: mi chiedevo quale sia la soluzione migliore quando devo eseguire la stessa azione più volte.

Vorrei riutilizzare lo stesso ActionListener, ma non sono sicuro su come ottenere ciò nel modo migliore (parlando in termini di: leggibilità del codice, maneggevolezza del codice, prestazioni e stile del codice).

Prima il codice "standard" (che userei se non ho intenzione di riutilizzare l'ascoltatore azione):

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

In questo modo non posso riutilizzare nulla OBV, dal momento che è un anonimo interno classe ...

Ora, mi vengono in mente le seguenti soluzioni:

  1. memorizzare un riferimento di un anonimo classe interna in un campo (che sarà molto probabilmente static final);
  2. Scrivere una nuova classe che implementa l'interfaccia ActionListener.

codice Esempio per soluzione 1: codice

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

btnMenu.addActionListener(MENU_ACTION_LISTENER); 

Esempio per soluzione 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()); 

ho qualche dubbio circa due soluzioni:

  1. dove memorizzare riferimenti ad ascoltatori di azioni anonimi? Potrei avere una sorta di classe di utilità (ad esempio ActionListenersUtil) in cui archiviare tutti i listener di azioni che desidero riutilizzare nei campi static final, ma non mi piace ... mi sembra un design scadente.

  2. ha più senso, probabilmente la cosa migliore segue la Command Pattern ... Inizialmente ho avuto qualche dubbio sui pacchetti ... Mi piacerebbe avere tutti gli ascoltatori in un pacchetto separato (ad esempio com.myapp.gui per gli elementi GUI e com.myapp.gui.listeners per ascoltatori, ma quando ho annotato questo mi sono reso conto che non ho scelta: l'unico posto in cui ha senso è nello stesso pacchetto (perché lo deve essere pacchetto-privato), anche se per ordine avrei mi piace metterli tutti in un pacchetto separato Ho ancora qualche dubbio, perché la maggior parte degli ascoltatori di azioni può essere riusabile anche nel caso in cui la GUI cambi, sarebbe comunque una buona idea averlo nello stesso pacchetto?

Un'altra domanda: qual è la differenza tra chiamare btnMenu.addActionListener(MENU_ACTION_LISTENER); e btnMenu.addActionListener(new MenuActionListener()); (parlando in termini di JVM, classe di carico, di classe la compilazione, la memoria occupata da ogni classe, raccolta dei rifiuti e così via)?

Per favore aiuto, sono così confuso adesso! :(

risposta

14

Il modo migliore è creare uno Action invece di uno ActionListener se si deve allegarlo a pulsanti, menu, ....Un Action è il modello di un JButton, e il modello è destinato a essere condiviso

Questo ti dà anche la possibilità di cambiare il, icona di testo, lo stato attivato, e altre proprietà di tutti i pulsanti che l'Action è attaccato allo stesso tempo senza più chiamate. Inoltre, può essere collegato a voci di menu e simili.

Per creare un Action non è necessario iniziare da zero. AbstractAction è un buon punto di partenza. Il Swing Action tutorial è anche una buona lettura.

+3

+1 In questo modo è anche possibile modificare il testo, l'icona, lo stato abilitato e altre proprietà di tutti i pulsanti a cui è collegato l'azione contemporaneamente senza più chiamate. Inoltre, può essere collegato a voci di menu e simili. – Brian

+1

+1000 se potessi ... ;-) –

+0

@Brian commento molto buono. Ho copiato e incollato nella risposta per renderlo più completo – Robin