2009-08-13 9 views
5

Stellen Sie sich vor, ich mache eine einfache Textverarbeitung mit Java Swing. Ich habe eine Reihe von Aktionen geschrieben, um eine Textausrichtung durchzuführen. Auf der MenuBar habe ich ein Menü bekommt:Sync JMenu ButtonGroups mit JToolbar ButtonGroups

 
View 
    Left Justify 
    Center Jusitfy 
    Right Justify 

Diese besteht aus JRadioButtonMenuItems und ein ButtonBroup, um sicherzustellen, nur ein Element zu einem Zeitpunkt ausgewählt wird.

Stellen Sie sich auch vor, ich hätte eine entsprechende Werkzeugleiste bestehend aus JToggleButtons und wiederum eine ButtonGroup, um sicherzustellen, dass nur jeweils eine Schaltfläche aktiv sein kann.

Die "linksbündig" JRadioButtonMenu und JToggleButton werden mit der gleichen Aktion initialisiert, und so weiter mit den anderen Elementen.

Meine Frage ist dies: Was ist die beste Methode zur Synchronisierung der beiden Gruppen? Wenn ich in der Symbolleiste auf das Symbol "Rechtsbündig ausrichten" klicke, möchte ich, dass die Gruppe im Menü entsprechend aktualisiert wird und umgekehrt.

Antwort

2

ich nach viel Suche fand ich Informationen here. Grundsätzlich können Sie dies der actionPerformed-Methode Ihrer Aktion hinzufügen:

Und das wird die ganze Arbeit für Sie tun!

Leider decken die offiziellen Sun-Tutorials diesen Aspekt nicht ab (oder zumindest habe ich es nicht bemerkt), daher die Schwierigkeit, einen so einfachen Ansatz zur Lösung meines Problems zu finden.

+0

Dies funktioniert jedoch nur in Java 6. –

0

Werfen Sie einen Blick auf die Mediator Design Pattern

+0

Danke. Aber es scheint, als ob eine Menge Refactoring erforderlich ist, um dieses Muster anzuwenden. Es scheint, dass wenn ich das tun würde, ich speziell für jedes der Elemente programmieren müsste. Ich hatte gehofft, dass es eine klügere Möglichkeit gibt, dies automatisch zu bestimmen, da die Menüelemente und die Symbolleistenelemente die gleichen Aktionen teilen. – arooaroo

0

Wenn Sie die Swing-Aktionen verwenden, sollten die Komponenten automatisch deaktiviert/aktiviert werden, wenn die Aktion selbst ausgeführt wird. Sie können sich auch als Eigenschaftslistener für eine Aktion registrieren, um andere Änderungen zu überwachen. Eine detaillierte Liste der verfügbaren Eigenschaften finden Sie unter http://java.sun.com/javase/6/docs/api/javax/swing/Action.html.

1

Observer pattern mein Freund. Die Menüleiste beobachten Sie die Symbolleiste und die Symbolleiste beobachten Sie die Menüleiste. Sie werden beide Beobachter und beobachtbar sein. Jeder hat seinen eigenen Listener, der bei einem Änderungsereignis den Beobachter (den anderen) mit dem neuen Wert im Parameter benachrichtigt.

Einer der großen Vorteile des Beobachtermusters ist, dass es eine sehr geringe Kopplung gibt, so dass Sie nicht viel Refactoring benötigen, um die Verknüpfung zu implementieren, zu modifizieren oder in Zukunft zu entfernen.

0

Auf der anderen Seite (ich wieder), könnten Sie nur 1 Listener in einer externen Klasse schreiben. Ein Listener für das Menü und für die Symbolleiste. Wenn sich 1 ändert, setzt der Listener beide auf den neuen Wert.