Для JMenuItem вместо слушателя вы должны использовать Action (который является более способной формой ActionListener):
Action saveAction = new AbstractAction("Save") {
@Override
public void actionPerformed(ActionEvent event) {
saveDocument();
}
};
saveAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_S);
saveAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control S"));
saveMenuItem = new JMenuItem(saveAction);
Для JCheckBoxMenuItems и JRadioButtonMenuItems, так же как и с обычными JMenuItems, метод actionPerformed Action вызывается, когда пользователь активирует элемент меню. Вы можете проверить новое состояние в вашем действии:
Action showStatusAction = new AbstractAction("Show Status") {
@Override
public void actionPerformed(ActionEvent event) {
boolean selected = (Boolean) getValue(SELECTED_KEY);
statusBar.setVisible(selected);
}
};
showStatusAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_W);
showStatusAction.putValue(Action.SELECTED_KEY, true);
showStatusMenuItem = new JCheckBoxMenuItem(showStatusAction);
Обратите внимание, что Action.SELECTED_KEY работает, только если вы установили его на true
или false
перед установкой Action. Из документации :
Компоненты, которые учитывают это свойство, используют значение, только если оно не равно нулю. Например, если вы установите действие, которое имеет нулевое значение для SELECTED_KEY
для JToggleButton
, JToggleButton
не будет обновлять выбранное состояние каким-либо образом. Точно так же, каждый раз, когда выбранное состояние JToggleButton
изменяется, оно будет возвращать значение в Действие только в том случае, если Действие имеет ненулевое значение для SELECTED_KEY
.
Если вы настаиваете на непосредственном использовании слушателей, ItemListener указывает состояние выбора, поэтому его можно использовать для мониторинга состояния JCheckBoxMenuItems и JRadioButtonMenuItems. Для всех других JMenuItems используйте ActionListener.
Вышеприведенное действительно относится ко всем потомкам AbstractButton , а также к JMenuItem и его классам-потомкам:
- Для кнопок J используйте Действие.
- Для JToggleButtons, JCheckBoxes и JRadioButtons используйте Action и проверьте его значение SELECTED_KEY.
- Если вы не хотите использовать Actions, используйте ActionListener для JButtons и ItemListener для JToggleButtons, JCheckBoxes и JRadioButtons.
Насколько я понимаю, нет причин использовать ChangeListener со стандартным JMenuItem или кнопкой, поскольку ChangeEvent в основном предназначен для того, чтобы указывать средствам визуализации, что компонент должен быть перекрашен.