2013-07-18 6 views
3

두 개의 팝업 메뉴가있는 시스템 트레이 아이콘을 만들려고합니다. 하나는 마우스 왼쪽 버튼으로, 다른 하나는 오른쪽으로 호출해야합니다. AWT는 PopupMenu를 만드는 간단한 방법을 제공하지만 보이지 않는 JFrame이나 무언가를 만들지 않고 마우스 왼쪽 버튼으로 메뉴를 호출 할 수는 없습니다. 그래서 JPopupMenu 스윙은 마우스 버튼으로 호출 할 수 있습니다. 하지만 JPopupMenu는 JPopupMenu 외부에서 마우스를 눌렀을 때 버그가 아니라는 버그 (실제로 버그인지 또는 Java가 좋지 않은지는 알 수 없음)가 있습니다. 마우스 수신기의 function 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

이 스레드를 (http://stackoverflow.com/q/7461477/1057230) 시도하십시오, 귀하의 요구 사항을 충족시킬 수 있지만, 경우에만 :-) –

답변

0

한 마우스 수신기와 왼쪽 및 오른쪽 버튼을 클릭 분리하는 것을 보자 매우 유용한 대화를

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

덕분에

변경

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

에서,하지만 내가 필요 몇 마디 추가 :

때때로 menuItem을 추가 할 때 JPopupMenu이 예측할 수없는 방식으로 작동합니다 (마우스를 마우스로 올리면 닫히지 않습니다). 이 경우

당신이 당신의 메뉴 항목

JMenuItem jmi1 = new JMenuItem("JMenuItem1"); 

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