菜单上的java动作监听器,而不是菜单项

我需要启蒙。

如何添加动作actionListener事件绑定到菜单,而不绑定到菜单ITEM这里是演示代码,有效(在menuITEM上)..

menuFileItem.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent e) { System.out.println("It works"); } } ); 

但是当我尝试相同的,但只是在菜单本身它不起作用!

 menuFile.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent e) { System.out.println("Plz work... :( "); } } ); 

是否可以将监听器添加到菜单中? 我教过听众可以添加到一切。

您可以将ActionListener添加到JMenu因为此方法是从AbstractButtoninheritance的。 (JMenu文档)

 JMenu menu = new JMenu("MyMenu"); menu.addActionListener(new ActionListener(){...}); 

但是,它不打算以这种方式使用: JMenu忽略ActionEvent 。 您应该使用MenuEventMenuListener

 JMenu menu = new JMenu("MyMenu"); menu.addMenuListener(new MenuListener() { @Override public void menuSelected(MenuEvent e) { System.out.println("menuSelected"); } @Override public void menuDeselected(MenuEvent e) { System.out.println("menuDeselected"); } @Override public void menuCanceled(MenuEvent e) { System.out.println("menuCanceled"); } }); 

如果您实例化JMenu类以构建菜单对象,请尝试使用方法addMenuListener()。

我使用这个addMouseListener() ,因为当你点击JMenu ,它会将其标记为蓝色并在之后执行该事件。

我认为这就是你想要的效果。

在这里它使用这个代码:我声明:

 JMenu jmCadastrar = new JMenu("Cadastrar"); jmCadastrar.addMouseListener(new MouseListener() { @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub System.exit(0); } }); } 

基于之前的答案,我为解决方案添加了一个额外的关键监听器

这是一个便利function:

 public static void bind(JMenu menu, ActionListener listener) { menu.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { listener.actionPerformed(new ActionEvent(e.getSource(), ActionEvent.ACTION_PERFORMED, "Delegate")); } }); menu.addMenuKeyListener(new MenuKeyListener() { @Override public void menuKeyPressed(MenuKeyEvent e) { if(e.getKeyCode() != KeyEvent.VK_ENTER){ return; } // Find out if the menu is the currently selected menu element MenuElement[] selectionPath = e.getMenuSelectionManager().getSelectedPath(); // Because the JMenu will open a popup menu, the menu is the penultimate element in the path if (selectionPath.length < 2) { return; } MenuElement selectedMenu = selectionPath[selectionPath.length - 2]; if (selectedMenu == menu) { listener.actionPerformed(new ActionEvent(e.getSource(), ActionEvent.ACTION_PERFORMED, "Delegate")); } } @Override public void menuKeyTyped(MenuKeyEvent e) {} @Override public void menuKeyReleased(MenuKeyEvent e) {} }); }