[英]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.