MenuListener实现,如何检测哪个JMenu被点击



如果我这样定义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) {}

现在它工作正常。但问题是,如果我有多个菜单,我怎么能区分两者。就像在菜单监听器,我怎么知道点击来自菜单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进行操作时)(根据@Kleopatra在评论中建议删除此操作)

这就是getSource()的作用,这是MenuEventEventObject继承的方法。

您可以使用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 ()

相关内容

  • 没有找到相关文章