2009-08-13 3 views
5

Immagina di creare un semplice elaboratore di testi con Java Swing. Ho una serie di azioni scritte per eseguire la giustificazione del testo. Sul menu Ho un menù:Sync JMenu ButtonGroups con JToolbar ButtonGroups

 
View 
    Left Justify 
    Center Jusitfy 
    Right Justify 

Si tratta di JRadioButtonMenuItems e un ButtonGroup per garantire un solo elemento è selezionato in qualsiasi momento.

Inoltre, immagino di avere una barra degli strumenti equivalente composta da JToggleButtons e ancora un ButtonGroup per garantire che solo il pulsante possa essere attivo in qualsiasi momento.

Il "Left Justify" JRadioButtonMenu e JToggleButton vengono inizializzati utilizzando la stessa azione, e così via con gli altri elementi.

La mia domanda è questa: qual è il metodo migliore per sincronizzare i due gruppi? Se faccio clic sull'icona "Giustifica la destra" sulla barra degli strumenti, voglio che il gruppo nel menu sia aggiornato di conseguenza, e viceversa.

risposta

2

io dopo un sacco di ricerca ho trovato informazioni here. In sostanza, è possibile aggiungere questo metodo actionPerformed della tua azione:

action.putValue(Action.SELECTED_KEY, Boolean.TRUE); 

E questo farà tutto il lavoro per voi!

Sfortunatamente i tutorial ufficiali di Sun non coprono questo aspetto (o almeno non l'ho notato), quindi la difficoltà di individuare un approccio così semplice per risolvere il mio problema.

+0

Questo funziona solo in Java 6 però. –

0

Date un'occhiata al Mediator Design Pattern

+0

Grazie. Ma sembra che ci sia bisogno di un sacco di refactoring per applicare questo modello. Sembra che se lo facessi dovrei scrivere codice specifico per ognuno degli articoli. Speravo che ci fosse un modo più intelligente per determinare automaticamente questo dato che le voci di menu e gli elementi della barra degli strumenti condividono le stesse azioni. – arooaroo

1

Observer pattern amico mio. La barra dei menu osserva la barra degli strumenti e la barra degli strumenti osserva la barra dei menu. Saranno entrambi osservatori e osservabili. Ognuno ha il proprio ascoltatore che, in un evento di cambiamento, notifica all'osservatore (l'altro) il nuovo valore in parametro.

Uno dei grandi vantaggi del modello di osservatore è che l'accoppiamento è molto basso, quindi non è necessario un gran numero di refactoring per implementare il collegamento, modificarlo o rimuoverlo in futuro.

0

D'altra parte (ancora una volta), è possibile scrivere solo 1 listener in una classe esterna. Un listener per il menu e per la barra degli strumenti. Quando 1 cambia, il listener li imposta entrambi sul nuovo valore.