Синхронизируйте 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)


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

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

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

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

person arooaroo    schedule 13.08.2009

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

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

person Philippe Carriere    schedule 13.08.2009

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

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

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

person willcodejavaforfood    schedule 13.08.2009

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

person Philippe Carriere    schedule 13.08.2009