当光标移出外面时自动关闭JMenu

时间:2015-07-20 09:57:55

标签: java swing menu awt listener

我在自动隐藏JMenu时遇到问题。我不知道它的名字,但截图应该解释一切。

enter image description here

当光标在JMenu移动时,它会展开,我可以选择任何JMenuItem,当光标移到另一个JMenu时,前一个关闭,新的打开。但是我不知道我应该使用哪个事件来检测光标何时离开JMenuItem而不是其他任何事件。

这是我的代码:

    public class MainWindow extends JFrame implements ActionListener {

    private JMenuBar menuBar=new JMenuBar();
    private JMenu Menu1=new JMenu("Menu1"); //empty
    private JMenu Menu2=new JMenu("Menu2");
    private JMenu Menu3=new JMenu("Menu3");
    private JMenu Menu4=new JMenu("Menu4"); //empty
    private JMenu Menu5=new JMenu("Menu5"); //empty

    private JMenuItem Menu2Item1=new JMenuItem("MenuItem1");
    private JMenuItem Menu2Item2=new JMenuItem("MenuItem2");
    private JMenuItem Menu2Item3=new JMenuItem("MenuItem3");
    private JMenuItem Menu2Item4=new JMenuItem("MenuItem4");

    private JMenuItem Menu3Item1=new JMenuItem("MenuItem1");
    private JMenuItem Menu3Item2=new JMenuItem("MenuItem2");
    private JMenuItem Menu3Item3=new JMenuItem("MenuItem3");
    private JMenuItem Menu3Item4=new JMenuItem("MenuItem4");
    private JMenuItem Menu3Item5=new JMenuItem("MenuItem5");
    private JMenuItem Menu3Item6=new JMenuItem("MenuItem6");
    private JMenuItem Menu3Item7=new JMenuItem("MenuItem7");

    private MouseAdapter menuAutoFocusAdapter=new MouseAdapter() {
        public void mouseEntered(MouseEvent menuEnter) {
            ((JMenu) menuEnter.getSource()).doClick();
        }

        public void mouseExited(MouseEvent menuExit) {
            if (((JMenu) menuExit.getSource()).getItemCount()==0) {
                MenuSelectionManager.defaultManager().clearSelectedPath();
            }
        }

        public void mousePressed(MouseEvent menuClick) {
            ((JMenu) menuClick.getSource()).doClick();
        }
    };

    public MainWindow() {
        super("AutoHide Menu");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(800, 600);
        setVisible(true);

        setJMenuBar(menuBar);
        menuBar.add(Menu1);
        menuBar.add(Menu2);
        menuBar.add(Menu3);
        menuBar.add(Menu4);
        menuBar.add(Menu5);

        Menu2.add(MenuItem1);
        Menu2.add(MenuItem2);
        Menu2.add(MenuItem3);
        Menu2.add(MenuItem4);

        Menu3.add(MenuItem1);
        Menu3.add(MenuItem2);
        Menu3.add(MenuItem3);
        Menu3.add(MenuItem4);
        Menu3.add(MenuItem5);
        Menu3.add(MenuItem6);
        Menu3.add(MenuItem7);

        Menu1.addMouseListener(menuAutoFocusAdapter);
        Menu2.addMouseListener(menuAutoFocusAdapter);
        Menu3.addMouseListener(menuAutoFocusAdapter);
        Menu4.addMouseListener(menuAutoFocusAdapter);
        Menu5.addMouseListener(menuAutoFocusAdapter);
    }
}

如果JMenu没有任何JMenuItem一切正常,但如果JMenu不为空,我就无法使用mouseExited(MouseEvent menuExit)中的MouseAdapter和此功能MenuSelectionManager.defaultManager().clearSelectedPath(),因为它每次关闭JMenu。 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

好吧,我想,我找到了解决方案。这是一个额外的Adapter,可以捕获MouseMotion特定控件。

private MouseMotionAdapter menuLostFocusAdapter=new MouseMotionAdapter() {
     public void mouseMoved(MouseEvent mouseMoveOutside) {
          if (weaponsTypes.getSelectionModel().isSelected()) {
               MenuSelectionManager.defaultManager().clearSelectedPath();
               weaponsTypes.getSelectionModel().clearSelection();
          }
     }
};

我对addMouseMotionListener(menuLostFocusAdapter)下的所有控件使用了JMenu。我知道这不是快速和美丽,但它很安静。