簡體   English   中英

光標移到外面時自動關閉JMenu

[英]auto-close JMenu when cursor goes outside

我有一個自動隱藏JMenu問題。 我不知道它的名字,但屏幕截圖可以解釋所有內容。

在此處輸入圖片說明

當光標在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不為空,則我無法使用MouseAdapter mouseExited(MouseEvent menuExit)和此函數MenuSelectionManager.defaultManager().clearSelectedPath()因為它每次都會關閉JMenu 有任何想法嗎?

好吧,我想,我找到了解決方案。 這是一個額外的Adapter ,可以在特定控件上捕獲MouseMotion

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

我對它的JMenu下的所有控件都使用addMouseMotionListener(menuLostFocusAdapter) 我知道這並不快,而且很美,但它運作起來很安靜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM