Синхронизируйте JMenu ButtonGroups с JToolbar ButtonGroups

Представьте, что я делаю простой текстовый процессор с помощью Java Swing. У меня есть набор действий, написанных для выравнивания текста. В MenuBar у меня есть меню:

View
  Left Justify
  Center Jusitfy
  Right Justify

Он состоит из JRadioButtonMenuItems и ButtonGroup, чтобы обеспечить выбор только одного элемента в любой момент времени.

Кроме того, представьте, что у меня есть эквивалентная панель инструментов, состоящая из JToggleButtons и снова ButtonGroup, чтобы гарантировать, что только одна кнопка может быть активной в любой момент времени.

JRadioButtonMenu и JToggleButton «Выравнивание по левому краю» инициализируются с использованием одного и того же действия и т. д. с другими элементами.

У меня такой вопрос: как лучше всего синхронизировать две группы? Если я нажму значок «Выровнять по правому краю» на панели инструментов, я хочу, чтобы группа в меню обновлялась соответствующим образом, и наоборот.


person arooaroo    schedule 13.08.2009    source источник


Ответы (5)


arrow_upward
2
arrow_downward

После долгих поисков я нашел информацию здесь . По сути, вы можете добавить это в метод actionPerformed вашего действия:

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

И это сделает всю работу за вас!

К сожалению, официальные руководства Sun не освещают этот аспект (или, по крайней мере, я его не заметил), поэтому трудно найти такой простой подход к решению моей проблемы.

person arooaroo    schedule 13.08.2009

arrow_upward
1
arrow_downward

Шаблон Observer, мой друг. Строка меню наблюдает за панелью инструментов, а панель инструментов наблюдает за строкой меню. Они будут и наблюдателями, и наблюдаемыми. У каждого есть свой слушатель, который при изменении события уведомляет наблюдателя (другого) о новом значении параметра.

Одно из больших преимуществ шаблона наблюдателя заключается в том, что связь очень низка, поэтому вам не потребуется много рефакторинга для реализации связи, ее изменения или удаления в будущем.

person Philippe Carriere    schedule 13.08.2009

arrow_upward
0
arrow_downward

Взгляните на шаблон проектирования посредника.

person Boris Pavlović    schedule 13.08.2009
comment
Спасибо. Но кажется, что для применения этого шаблона требуется очень много рефакторинга. Кажется, что если бы я сделал это, мне пришлось бы кодировать специально для каждого из элементов. Я надеялся, что есть более разумный способ определить это автоматически, учитывая, что элементы меню и элементы панели инструментов используют одни и те же действия. - person arooaroo; 13.08.2009

arrow_upward
0
arrow_downward

Если вы используете действия Swing, компоненты должны автоматически отключаться/включаться, если само действие включено. Вы также можете зарегистрироваться в качестве прослушивателя свойства для действия, а также отслеживать другие изменения. Посмотрите на http://java.sun.com/javase/6/docs/api/javax/swing/Action.html для подробного списка доступных свойств.

person willcodejavaforfood    schedule 13.08.2009

arrow_upward
0
arrow_downward

С другой стороны (опять я), вы можете просто написать 1 слушателя во внешнем классе. Слушатель для меню и для панели инструментов. Когда 1 изменяется, слушатель устанавливает для них обоих новое значение.

person Philippe Carriere    schedule 13.08.2009