2013-07-18 55 views
3

我試圖用兩個彈出菜單創建系統托盤圖標,一個應該用鼠標左鍵調用,另一個用右鍵調用。 AWT提供了創建PopupMenu的簡單方法,但不能使用鼠標左鍵來調用菜單,而不使用無形的JFrame或其他東西。所以,我發現swing JPopupMenu可以通過任何鼠標按鈕調用。但是JPopupMenu有錯誤(我不知道這是一個真正的bug還是我在Java中不太好),當我在JPopupMenu之外按鼠標時,它不會隱藏。我試過使用鼠標監聽器的函數mouseExited,但它只能用於JPopupMenu邊框。如果鼠標離開JPopupMenu邊界它隱藏,我不能按任何JPopupMenu按鈕。也許,任何人都有同樣的問題,並可以幫助我找出如何使其正確工作。Java上jpopupmenu on mouseExited

public static JPopupMenu jpm; 
public static TrayIcon ti; 

public static void main(String args[]) throws IOException, AWTException, 
     ClassNotFoundException, InstantiationException, 
     IllegalAccessException, UnsupportedLookAndFeelException { 
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
    SystemTray st = SystemTray.getSystemTray(); 
    Image icon = ImageIO.read(SipLogin.class 
      .getResource("/resources/phone-yellow-small.png")); 

    ti = new TrayIcon(icon, "Sip login", null); 

    jpm = new JPopupMenu(); 

    JMenuItem jmi1 = new JMenuItem("JMenuItem1"); 
    JMenuItem jmi2 = new JMenuItem("JMenuItem2"); 
    JMenuItem jmi3 = new JMenuItem("JMenuItem3"); 
    JMenuItem jmi4 = new JMenuItem("JMenuItem4"); 



    ti.addMouseListener(new MouseAdapter() { 
     public void mouseReleased(MouseEvent e) { 
      if (e.isPopupTrigger()) { 
       jpm.setLocation(e.getX(), e.getY()); 
       jpm.setInvoker(jpm); 
       jpm.setVisible(true); 
      } 
     } 
    }); 

    jpm.add(jmi1); 
    jpm.add(jmi2); 
    jpm.add(jmi3); 
    jpm.add(jmi4); 

    jpm.addMouseListener(new MouseAdapter() { 
     public void mouseExited(MouseEvent e) { 
      jpm.setVisible(false); 
     } 
    }); 

    st.add(ti); 




} 
+0

mKorbel刪除鼠標移動偵聽,他只想要一個在同一時間顯示,這取決於哪一個鼠標按鍵被按下的。 – predi

+0

我知道只有一個JPopup可以被看到,但是我不能讓它像PopupMenu一樣隱藏,當鼠標在菜單外的某個地方被按下時,女巫就會隱藏起來。 – Algirdas

+0

試試這個[thread](http://stackoverflow.com/q/7461477/1057230),不知道它是否會滿足你的要求,但只是在以下情況下:-) –

回答

0

拿一個鼠標偵聽器和左,右鍵分開:

變化從

ti.addMouseListener(new MouseAdapter() { 
    public void mouseReleased(MouseEvent e) { 
     if (e.isPopupTrigger()) { 
      jpm.setLocation(e.getX(), e.getY()); 
      jpm.setInvoker(jpm); 
      jpm.setVisible(true); 
     } 
    } 
}); 

ti.addMouseListener(new MouseAdapter() { 
    public void mouseReleased(MouseEvent e) { 
     if(e.getclickCount < 2){ 
      if(e.getButton().equals(MouseEvent.Button1){ 
       showPopup1(); 
      } 
      if(e.getButton().equals(MouseEvent.Button3){ 
       showPopup2(); 
      } 
     } 
    } 
}); 
0

感謝非常有用的談話,但我需要添加一些字:

有時,當您添加menuItems時,JPopupMenu的行爲將以不可預測的方式進行(當鼠標懸停在鼠標上時,它不會關閉)。

在這種情況下,你需要從你的菜單項

JMenuItem jmi1 = new JMenuItem("JMenuItem1"); 

jmi1.removeMouseMotionListener(jmi1.getMouseMotionListeners()[0]); 
jmi1.removeMouseListener(jmi1.getMouseListeners()[0]);