Как я могу определить, какой пункт меню называется ActionListener?

У меня есть программа Java, в которой у меня есть JMenu с произвольным количеством элементов (в этом случае есть один пункт меню для каждой динамической библиотеки, загруженной в настоящее время в другой программе). Я запускаю цикл, чтобы добавить JCheckBoxMenuItem в меню, так как я не знаю, сколько их будет.

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

Может ли кто-нибудь указать мне правильное направление?

Ответов (5)

Решение

Хотя event.getSource () определенно сообщит вам, от какой именно кнопки произошло событие, он имеет побочный эффект, заключающийся в необходимости отслеживать сгенерированные кнопки или отслеживание кнопки. Также вы можете захотеть предоставить пользователю другое имя библиотеки (возможно, включая информацию о версии), чем используется для идентификации библиотеки. Использование свойства кнопки «ActionCommand» может помочь разделить эти проблемы. Таким образом, вам нужно будет изменить код при создании пунктов меню флажков и в слушателе.

ActionListener actionListener = ... // whatever object holds the method, possibly this
String[] libraries = ... // however you get your library names
JMenu parentMenu = ... // the menu you are adding them to

for (String s : libraries) {
  // prettyName is a method to make a pretty name, perhaps trimming off
  // the leading path
  JCheckBoxMenuItem child = new JCheckBoxMenuItem(prettyName(s), true);
  child.setActionCommand(s);
  parentMenu.acc(child);
}

Код обработчика действия будет ...

public void actionPerformed(ActionEvent evt) {
  // the 'current' selection state, i.e. what it is going to be after the event
  boolean selected = ((JCheckBoxMenuItem)evt.getSource()).isSelected();
  String library = evt.getActionCommand();
  ... process based on library and state here...
}

event.getSource () должен это сделать.

Чистый способ сделать это - создать разные ActionListener для каждого. EventObject.getSource ускользает.

Обязательно прочитайте это: http://java.sun.com/docs/books/tutorial/uiswing/misc/action.html

Короче говоря, добавьте ActionListener в menuItems. В методе actionPerformed используйте event.getSource (). При желании вы можете добавить ОДИН ActionListener ко всем пунктам меню.

Когда вы создаете меню, вы можете передать Action объект JCheckBoxMenuItem сконфигурированному с любыми параметрами, которые вам нужны для данного действия (вы также можете нажать туда ссылку на флажок, чтобы проверить состояние). Таким образом, вам не нужно будет выполнять какую-либо обработку, когда действие действительно выполняется, потому что будет вызвано правильное действие.