【问题标题】:How to make a JMenu do something when unfolded?如何让 JMenu 在展开时做某事?
【发布时间】:2013-07-01 00:01:36
【问题描述】:

单击 JMenu(或单击相邻的 JMenu 然后将鼠标拖到其上)时的默认行为是展开并显示其子菜单和菜单项。当这种情况(菜单展开时)发生时,我可以关联其他行为(例如生成事件)吗?

【问题讨论】:

  • 我已经删除了我的答案,因为在测试中,这是明显错误的。对不起。
  • @user2460978 如果您想知道子菜单何时打开,则需要将PopupListener 附加到菜单JPopupMenu。请参阅JMenu#getPopupMenu 了解起点。

标签: java swing events listener jmenu


【解决方案1】:

有专门针对 JMenus 的事件监听器类:

javax.swing.event.MenuListener

javax.swing.event.MenuDragMouseListener

将这些与组件关联起来需要调用的方法是

分别为JMenuComponentName.addMenuListener(MenuListener m);JMenuComponentName.addMenuMouseDragListener(MenuDragMouseListener m);

【讨论】:

    【解决方案2】:

    您可以使用MenuListener,它应该为您提供有关菜单状态的信息。

    这个简单的例子在每次打开菜单时都会创建一个新的菜单项...

    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.event.MenuEvent;
    import javax.swing.event.MenuListener;
    
    public class TestMenuBar {
    
        public static void main(String[] args) {
            new TestMenuBar();
        }
    
        public TestMenuBar() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JMenuBar mb = new JMenuBar();
                    JMenu main = new JMenu("Test");
                    mb.add(main);
    
                    main.addMenuListener(new MenuListener() {
                        @Override
                        public void menuSelected(MenuEvent e) {
                            System.out.println("Selected");
                            JMenu menu = (JMenu) e.getSource();
    
                            menu.add(new JMenuItem("I'm dynamiclly created"));
                        }
    
                        @Override
                        public void menuDeselected(MenuEvent e) {
                            System.out.println("deselected");
                        }
    
                        @Override
                        public void menuCanceled(MenuEvent e) {
                            System.out.println("Canceled");
                        }
                    });
    
                    JFrame frame = new JFrame("Testing");
                    frame.setJMenuBar(mb);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.setSize(200, 200);
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }        
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 2012-01-12
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      相关资源
      最近更新 更多