Как я могу определить, какой пункт меню называется ActionListener?
У меня есть программа Java, в которой у меня есть JMenu с произвольным количеством элементов (в этом случае есть один пункт меню для каждой динамической библиотеки, загруженной в настоящее время в другой программе). Я запускаю цикл, чтобы добавить JCheckBoxMenuItem в меню, так как я не знаю, сколько их будет.
Как я могу настроить прослушиватель действий для этих пунктов меню, который знает, какая опция вызвала его? В частности, я хочу запустить ту же функцию, но с другим набором или параметрами для каждого из пунктов меню (и снова с другой функцией в зависимости от того, переключается ли проверка или отключается).
Может ли кто-нибудь указать мне правильное направление?
Ответов (5)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...
}
Обязательно прочитайте это: http://java.sun.com/docs/books/tutorial/uiswing/misc/action.html
Короче говоря, добавьте ActionListener в menuItems. В методе actionPerformed используйте event.getSource (). При желании вы можете добавить ОДИН ActionListener ко всем пунктам меню.
Когда вы создаете меню, вы можете передать Action
объект JCheckBoxMenuItem
сконфигурированному с любыми параметрами, которые вам нужны для данного действия (вы также можете нажать туда ссылку на флажок, чтобы проверить состояние). Таким образом, вам не нужно будет выполнять какую-либо обработку, когда действие действительно выполняется, потому что будет вызвано правильное действие.