MenuListener实现,如何检测单击了哪个JMenu?

时间:2011-12-21 12:10:56

标签: java swing jmenu jmenubar

如果我这样定义了JMenuJMenuBar

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) {}

现在它运作正常。但问题是,如果我有一个以上的菜单,我怎么能区分这两个菜单。 就像在菜单监听器中一样,我怎么知道click1来自menu1或其他菜单2?

我的意思是如果我有另一个菜单,我也为这个菜单添加菜单监听器:

jMenu2.addMenuListener(this);

然后我无法区分点击来自哪个菜单。我怎么能这样做?

6 个答案:

答案 0 :(得分:6)

您可以使用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进行操作时)(在评论中删除@Kleopatra建议)

答案 1 :(得分:2)

这就是getSource()的用途,这是MenuEvent继承自EventObject的方法。

答案 2 :(得分:1)

您可以改用ActionListener。以下是如何捕获菜单项上的单击

 jMenu1.addActionListener(new ActionListener(){
  public void actionPerformed(ActionEvent e) {
    // Perform action on menu1 clicked here
  }
 }

如果单击时有多个菜单共享相同的代码,则可以将动作侦听器重构为单独的类。

答案 3 :(得分:0)

我认为向ButtonModel添加JMenuItem或向JMenuItems添加ButtonGroup的方法之一也可以解决这个问题,例如ButtonModel < / p>

答案 4 :(得分:0)

我来这里看看是否有我更喜欢getSource()的东西,并决定坚持使用getSource。我比较喜欢使用字符串(比较对象),所以我会发布代码,以防对任何人有帮助。 (我知道有些人不喜欢提前退货,不喜欢switch语句,不喜欢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");
    }
}

自然,不添加MenuListener()的JMenu甚至不会触发menuSelected()。

答案 5 :(得分:-1)

更改按钮或标签的颜色。简单而简短的xoxo

  

块报价   公共静态void main()