2009-08-13 10 views
5

Wyobraź sobie, że tworzę prosty procesor tekstu z Java Swing. Mam zestaw akcji zapisanych w celu wykonania uzasadnienia tekstowego. Na MenuBar Mam menu:Sync JMenu ButtonGroups z JToolbar ButtonGroups

 
View 
    Left Justify 
    Center Jusitfy 
    Right Justify 

Składa JRadioButtonMenuItems i buttonGroup aby zapewnić tylko jeden element jest wybrany w danym momencie.

Wyobraź sobie, że mam równoważny pasek narzędzi składający się z JToggleButtons i ponownie ButtonGroup, aby zapewnić, że tylko jeden przycisk może być aktywny w tym samym czasie.

JRadioButton Menu i JToggleButton "Left Justify" są inicjalizowane przy użyciu tej samej akcji i tak dalej z innymi elementami.

Moje pytanie brzmi: jaka jest najlepsza metoda synchronizacji dwóch grup? Jeśli kliknę ikonę "Right Justify" na pasku narzędzi, chcę, aby grupa w menu została odpowiednio zaktualizowana i na odwrót.

Odpowiedz

2

I po wielu poszukiwań znalazłem informację here. Zasadniczo, możesz dodać to do działania akcji. Wydajna metoda:

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

A to wszystko wykona za Ciebie!

Niestety oficjalne tutoriale Sun nie obejmują tego aspektu (a przynajmniej go nie zauważyłem), stąd trudność w wykryciu tak prostego podejścia do rozwiązania mojego problemu.

+0

Działa to jednak tylko w Javie 6. –

0
+0

Dzięki. Wygląda jednak na to, że w celu zastosowania tego schematu konieczne jest wiele refaktoryzacji. Wydaje się, że gdybym to zrobił, musiałbym kodować specjalnie dla każdego z przedmiotów. Miałem nadzieję, że istnieje inteligentniejszy sposób ustalenia tego automatycznie, biorąc pod uwagę, że elementy menu i elementy paska narzędzi mają te same akcje. – arooaroo

1

Observer pattern mój przyjaciel. Pasek menu obserwuje pasek narzędzi, a pasek narzędzi obserwuje pasek menu. Będą zarówno obserwatorami, jak i obserwowalne. Każdy ma swój własny detektor, który podczas zdarzenia zmiany powiadamia obserwatora (drugiego) o nowej wartości w parametrze.

Jedną z największych zalet wzoru obserwatora jest to, że istnieje bardzo niskie sprzężenie, więc nie trzeba wiele refaktoryzacji, aby wdrożyć połączenie, zmodyfikować go lub usunąć w przyszłości.

0

Z drugiej strony (ja znowu), mógłbyś po prostu napisać 1 słuchacza w zewnętrznej klasie. Słuchacz dla menu i paska narzędzi. Po 1 zmianie słuchacz ustawia je obie na nową wartość.