Блокирование и разблокирование пунктов меню

Блокирование и разблокирование пунктов менюБывают случаи, когда некоторые пункты меню должны выбираться лишь в определенных ситуациях. Например, если документ открыт лишь для чтения, то пункт меню Save не имеет смысла. Разумеется, этот пункт можно удалить с помощью JMenu.remove(), но пользователя может удивить постоянно изменяющееся меню. Лучше все же заблокировать пункты меню, временно лишив пользователя возможности выполнять ряд операции.

Чтобы разблокировать или заблокировать пункт меню, используется метод setEnabled():

Существуют две стратегии блокирования и разблокирования пунктов меню. При каждом изменении состояния программы можно вызывать метод setEnabled(), применяя его к соответствующему пункту меню. Например, открыв документ только для чтения, можно заблокировать Save и Save as. Однако, пользуясь этой стратегией, программист рискует засорить код фрагментами, предназначенными для изменения состояния пунктов меню. Гораздо лучше совсем не беспокоиться о состоянии пунктов меню в основной части программы и задавать их параметры непосредственно перед отображением на экране.

Для этого нужно зарегистрировать обработчик событий, связанных с выбором меню. В пакете javax.swing.event содержится интерфейс MenuListener, в котором объявлены три метода:

  • void menuSelected(MenuEvent event)
  • void menuDeselected(MenuEvent event)
  • void menuCanceled(MenuEvent event)

Метод menuSelected() вызывается перед отображением меню на экране. Это самый подходящий момент для того, чтобы заблокировать или разблокировать пункты меню. В приведенном ниже фрагменте кода показано, как блокируются и разблокируются пункты пункты Save и Save As, в зависимости от состояния флажка Read Only.

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

Вот что получилось:

Блокирование и разблокирование пунктов меню