ItemListener против ChangeListener против ActionListener - PullRequest
0 голосов
/ 02 ноября 2018

Я видел много программ на Java Swing, которые используют ActionListener, ChangeListener или ItemListener. Каковы различия между ними и когда я должен использовать каждый из них?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Для 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 в основном предназначен для того, чтобы указывать средствам визуализации, что компонент должен быть перекрашен.

0 голосов
/ 02 ноября 2018

ActionListener
Они используются с кнопками или меню. Чтобы каждый раз, когда вы щелкаете по ним, он уведомляет ActionEvent, который, в свою очередь, вызывает функцию actionPreformed (ActionEvent e) для выполнения указанной задачи.

ItemListeners
Они используются с флажками, переключателями, комбо-боксами и тому подобным.
Посмотрите, что происходит, когда вы используете ActionListener со списком вместо слушателя элемента в этой ссылке https://coderanch.com/t/331788/java/add-listener-combo-drop-list.

ChangeListener
Это используется с такими компонентами, как ползунки, средства выбора цвета и счетчики, где вы хотите, чтобы действие выполнялось в соответствии с изменением в этом компоненте (https://docs.oracle.com/javase/tutorial/uiswing/events/changelistener.html).
Сосредоточьтесь на слове «изменить». Тогда вы можете подумать, что это должен работать с кнопками тоже. Вы можете увидеть на этом сайте http://www.java2s.com/Tutorial/Java/0240__Swing/AddchangelistenertoButtonmodel.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...