如果我这样定义JMenu
和JMenuBar
:
private JMenuBar jMenuBar;
private JMenu jMenu1;
jMenuBar = new JMenuBar();
jMenu1 = new JMenu();
jMenu1.setText("ABOUT");
//and here add a MenuListener so that i can detect when a menu is clicked:
jMenu1.addMenuListener(this);
jMenuBar.add(jMenu1);
setJMenuBar(jMenuBar);
//and here i implement the menulisteners
public void menuSelected(MenuEvent e) {
//my logic here
}
public void menuDeselected(MenuEvent e) {}
public void menuCanceled(MenuEvent e) {}
现在它工作正常。但问题是,如果我有多个菜单,我怎么能区分两者。就像在菜单监听器,我怎么知道点击来自菜单1或另一个菜单2?
我的意思是,如果我有另一个菜单,我也为这个菜单添加了菜单监听器:
jMenu2.addMenuListener(this);
则无法区分点击来自哪个菜单。我怎么能做到呢?
可以使用MenuEvent类的getSource()
方法。或者您也可以将单独的侦听器作为匿名类添加到两个菜单中。
public void menuSelected(MenuEvent e) {
//Make sure jMenu1 and jMenu2 are accessible in here.
if(e.getSource()==jMenu1)
operationForMenu1();
else if(e.getSource()==jMenu2)
operationForMenu2();
}
或
jMenu1.addMenuListener(new MenuListener() {
@Override
public void menuSelected(MenuEvent arg0) {
// operation here.
}
@Override
public void menuDeselected(MenuEvent arg0) {
}
@Override
public void menuCanceled(MenuEvent arg0) {
}
});
jMenu2.addMenuListener(new MenuListener() {
@Override
public void menuSelected(MenuEvent arg0) {
// operation here.
}
@Override
public void menuDeselected(MenuEvent arg0) {
}
@Override
public void menuCanceled(MenuEvent arg0) {
}
});
ActionListener
而不是MenuListener
。(仅当您不想对menuCanceled和menuDeselected进行操作时)这就是getSource()
的作用,这是MenuEvent
从EventObject
继承的方法。
您可以使用ActionListener
代替。下面是如何捕捉菜单项
jMenu1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
// Perform action on menu1 clicked here
}
}
如果你有多个菜单在点击时共享相同的代码,那么你可以将动作监听器重构成一个单独的类。
我认为其中一种方法是将ButtonModel
添加到JMenuItem
或将JMenuItems
添加到ButtonGroup
也可以舒适地解决这个问题,例如ButtonModel
我来到这里,看看是否有什么我更喜欢getSource(),并决定坚持使用getSource。我更喜欢使用字符串(而不是比较对象),所以我发布了我的代码,以防对任何人有帮助。(我知道有些人不喜欢早期回报,不喜欢切换报表,不喜欢K&R。再说一次,个人喜好,根据需要调整
public void menuSelected(MenuEvent evt) {
String menuName;
Object obj = evt.getSource();
if (obj instanceof JMenu) {
JMenu menu = (JMenu) obj;
menuName = menu.getText();
System.out.println(menuName);
} else {
return;
}
switch (menuName) {
case "Edit":
if (undo.hasPreviousState()) {
jMenuItemEditUndo.setEnabled(true);
} else {
jMenuItemEditUndo.setEnabled(false);
}
if (undo.hasNextState()) {
jMenuItemEditRedo.setEnabled(true);
} else {
jMenuItemEditRedo.setEnabled(false);
}
break;
case "Insert":
DefaultListModel<String> listModel = (DefaultListModel<String>) jListTags.getModel();
if (listModel.contains("table")) {
jMenuItemInsertTable.setEnabled(true);
} else {
jMenuItemInsertTable.setEnabled(false);
}
break;
default:
System.out.println("Menu " + menuName + " not a special case in menuSelected");
}
}
当然,不addMenuListener()的JMenu(s)甚至不会触发menuSelected()。
改变按钮或标签的颜色。简单简短的xoxo
块报价Public static void main ()