菜单上的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
因为此方法是从AbstractButton
inheritance的。 (JMenu文档)
JMenu menu = new JMenu("MyMenu"); menu.addActionListener(new ActionListener(){...});
但是,它不打算以这种方式使用: JMenu忽略ActionEvent 。 您应该使用MenuEvent
和MenuListener
。
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) {} }); }