Как определить, какой пункт меню называется ActionListener? - PullRequest
0 голосов
/ 26 февраля 2009

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

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

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

Ответы [ 5 ]

2 голосов
/ 26 февраля 2009

Хотя 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...
}
2 голосов
/ 26 февраля 2009

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

Короче говоря, добавьте ActionListener в меню элементов. В методе actionPerformed используйте event.getSource (). Вы можете добавить ЖЕ ActionListener ко всем пунктам меню, если хотите.

1 голос
/ 26 февраля 2009

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

1 голос
/ 26 февраля 2009

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

0 голосов
/ 26 февраля 2009

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

...