2010-04-18 4 views
6

Ho creato un'app di Java Swing che non ha una finestra principale visibile ma che è controllata tramite l'icona della barra delle applicazioni facendo clic con il pulsante destro del mouse.(Java) JPopupMenu non si chiude se faccio clic all'esterno di esso

Sto utilizzando un JPopupMenu per questo, ma quando faccio clic all'esterno del menu a comparsa (ad esempio sulla finestra di un'altra applicazione o sul desktop), JPopupMenu non scompare che non è il comportamento previsto.

Originariamente stavo usando un menu popup che funzionava come previsto ma questo non mi permetteva di avere icone nel menu.

Come posso chiuderlo quando faccio clic altrove, come previsto?

Grazie!

risposta

2

Alla fine ho "risolto" questo hackerando il problema. Come sottolinea Camickr, JPopupMenu è piuttosto buggato. Tuttavia è l'unica implementazione del menu a comparsa Swing che ti consente di avere un'icona accanto a ciascun elemento del menu.

La mia soluzione era implementare un listener sul menu jpopupu che, se l'utente avesse spostato il mouse sul menu, dopo 3 secondi sarebbe stato impostato su .isVisible (false) se l'utente non avesse riportato il mouse sopra menu in quel momento.

Per ottenere ciò, ho dovuto utilizzare un thread separato che verificava costantemente se il menu popup era attivo. In tal caso, controlla se il mouse era su di esso, utilizzando un listener di eventi e imposta la visibilità su false se l'utente non l'ha inserita di nuovo entro 3 secondi.

Questa non è una soluzione perfetta come l'utente deve ancora attendere 3 secondi per il menu a scomparire (dovrebbe essere istante se lui/lei clic di distanza) e scomparirà anche se è a fuoco (non dovrebbe a meno che l'utente non faccia clic). Tuttavia, si sentiva "abbastanza buono" per essere accettato.

Spero che questo aiuti.

6
//_Popup is your JPopupMenu, call this method before setting your popup to visible 
public void armPopup() 
{ 
    if(_Popup != null) 
    { 
     Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() 
     { 
      @Override 
      public void eventDispatched(AWTEvent event) { 

       if(event instanceof MouseEvent) 
       { 
        MouseEvent m = (MouseEvent)event; 
        if(m.getID() == MouseEvent.MOUSE_CLICKED) 
        { 
         _Popup.setVisible(false); 
         Toolkit.getDefaultToolkit().removeAWTEventListener(this); 
        } 
       } 
       if(event instanceof WindowEvent) 
       { 
        WindowEvent we = (WindowEvent)event; 
        if(we.getID() == WindowEvent.WINDOW_DEACTIVATED || we.getID() == WindowEvent.WINDOW_STATE_CHANGED) 
        { 
         _Popup.setVisible(false); 
         Toolkit.getDefaultToolkit().removeAWTEventListener(this); 
        } 
       } 
      } 

     }, AWTEvent.MOUSE_EVENT_MASK | AWTEvent.WINDOW_EVENT_MASK); 

    } 
} 
+0

non sembra funzionare perfettamente ragione su Windows 10. –

+0

Funziona bene su Windows 10 se il sistema operativo pone il direttamente sulla parte visibile del vassoio, ma non riesce se il sistema operativo pone l'icona in una " sottotassello pieghevole "o che mai viene chiamato quel pannello. –

Problemi correlati