2009-07-30 16 views
6

Un grido ai guru Swing là fuori !!Comandi di azione e classi di azioni?

Ho fatto programmazione Swing per diversi anni, ma non sono mai stato chiaro su questo.

Come sapete, Swing/AWT offre diversi modi per eseguire una determinata azione quando si fa clic su un pulsante. L'ho visto fare diversi modi nelle applicazioni su cui ho lavorato. Il progetto a cui sto attualmente lavorando su tende a seguire questo approccio:

someButton.setActionCommand("mycommand"); 
someButton.addActionListener(listener); 

--snip--

public void actionPerformed(ActionEvent event) { 
    String command = event.getActionCommand(); 
    if (command.equals("mycommand")) 
     doThis(); 
    else if (command.equals("someothercommand")) 
     doThat(); 
etc. 

Questo sembra tipo di goffo per me - non v'è alcun vantaggio di questo stile di programmazione , o è meglio usare Swing Action s?

Oppure ci sono diverse situazioni in cui i diversi approcci sono migliori/peggiori?

+0

Penso che sia sufficiente usare la discrezione per decidere quando è appropriato. Non penso che ci sia qualcosa di giusto o sbagliato in quanto tale, è solo una di quelle cose su cui i programmatori hanno preferenze personali, ma come ha detto Brandon, se i pulsanti multipli facessero la stessa cosa avrebbe senso usare un'azione ascoltatore! – Andy

risposta

4

IMO, è preferibile utilizzare listener separati per Azioni.

In questo modo si lascia la delegazione di quale azione dovrebbe accadere a Swing. Non devi confrontare le stringhe per decidere cosa fare.

Avere un enorme ActionListener per più di un'azione significa rompere il modello per me.

+1

Inoltre, consente che il codice nel listener di azioni sia più grande o che la delega venga tenuta internamente. Credo che la ragione principale per usare l'elemento comando sia se ci sono diversi comandi che possono causare azioni dallo stesso componente. Comunque, non posso pensare a quello che è inerente a Swing/AWT. – aperkins

3

Dal punto di vista del design, penso che sia meglio avere una classe per gestire un'azione specifica per un componente rispetto a una classe che è un tipo di progettazione "lascia gestire tutto per tutti i componenti qui".

Inoltre, se si utilizza Action a) si può applicare a più di un componente (ad esempio un pulsante e una voce di menu) b) chiamare setEnable per abilitare/disabilitare per tutti i componenti la sua attaccato al ec) Anche utilizzare per definire varie impostazioni sui componenti a cui è collegato (vale a dire, l'etichetta di testo, il testo del tooltip, il tasto di scelta rapida, l'icona, ecc.). Quest'ultimo viene eseguito tramite il metodo putValue e richiamando nuovamente questo metodo modificherà le impostazioni per tutti i componenti a cui è collegato.

In particolare, consiglierei di sottoclasse AbstractAction per le vostre esigenze.

0

sua Utile se si dispone di diversi pulsanti o componenti che eseguono la stessa azione (es. Diversi pulsanti di uscita sulla stessa pagina sarà utilizzare lo stesso codice)

li tutti insieme per lo stesso comando di azione e tutti saranno utilizzare lo stesso codice in chi ascolta

JButton.addActionListener(this); 
JButton2.addActionListener(this); 
JButton.setActionCommand("exit"); 
JButton2.setActionCommand("exit"); 

public void ActionPerformed(ActionEvent e){ 
    if(e.getActionCommand=="exit") 
     System.exit(0); 
} 
+0

No, se eseguono la stessa azione ... dai loro lo stesso listener di azioni .... non c'è bisogno di stringhe di comando – jjnguy

+0

Ok grazie, ancora sto imparando e questo è quello che mi è stato insegnato loro sono stati usati :) :) – Brandon

+0

Può essere utile ... ma sarebbe meglio dare l'ascoltatore ad entrambi i componenti. – jjnguy

1

so che è il codice demo, ma dal momento che si sta lavorando su questa roba ho pensato di ricordare che oscillazione tende ad essere molto ripetitivo se non stai attento.

L'utilizzo delle classi di azioni tende a consentire un refactoring migliore. Nello swing, uno dei modi migliori per iniziare è assicurarsi che le stringhe NO siano nel codice. Quasi ogni "Nuovo" sarà in un ciclo di qualche tipo, leggendo da un set di dati (spesso il set di dati è semplice come un array). Una volta che inizi a leggere da un set di dati del genere, le azioni possono aiutarti molto.

Si utilizzano i dati per creare l'azione, i dati per creare il proprio controllo ei dati per associare i due - in questo modo si può finire molto vicino (o su) 0 linee di codice per un nuovo controllo.

Una volta che si inizia a programmare in questo modo e si possono vedere i modelli, è almeno veloce come il modo ripetitivo e molto meno incline agli errori.

Problemi correlati