2010-04-18 23 views
6

He creado una aplicación Java Swing que no tiene una ventana principal visible pero que se controla mediante el icono de la bandeja haciendo clic con el botón derecho.(Java) JPopupMenu no se cerrará si hago clic fuera de él

Estoy usando un JPopupMenu para esto, pero cuando hago clic fuera del menú emergente (por ejemplo, en la ventana de otra aplicación o en el escritorio) el JPopupMenu no desaparece, que no es el comportamiento esperado.

Originalmente estaba usando un popupMenu que funcionó como se esperaba, pero esto no me permitió tener iconos en el menú.

¿Cómo puedo hacer que se cierre cuando hago clic en otro lugar, como esperaba?

Gracias!

Respuesta

2

Al final "solucioné" esto pirateando el problema. Como señala Camickr, JPopupMenu tiene muchas fallas. Sin embargo, es la única implementación del menú emergente Swing que le permite tener un ícono al lado de cada elemento del menú.

Mi solución fue implementar un oyente en el menú jpopupmenu que, si el usuario colocaba el mouse sobre el menú, después de 3 segundos se configuraría como .isVisible (falso) si el usuario no colocaba el mouse sobre el menú dentro de ese tiempo.

Para lograr esto, tuve que usar un subproceso separado que constantemente comprobaba si el popupmenu estaba activo. Si es así, compruebe si el mouse estaba sobre ella, usando un detector de eventos, y establezca la visibilidad en falso si el usuario no la volvió a ingresar en 3 segundos.

Esto no es una solución perfecta ya que el usuario aún tiene que esperar 3 segundos para que desaparezca el menú (debe ser instantáneo si hace clic) y desaparecerá aunque esté enfocado (no debería a menos que el usuario haga clic) Sin embargo, se consideró "lo suficientemente bueno" para ser aceptado.

Espero que ayude.

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

no parece funcionar del todo bien en Windows 10. –

+0

Funciona bien en Windows 10 si el sistema operativo coloca el directamente en la parte visible de la bandeja, pero falla si el sistema operativo coloca el icono en una " bandeja secundaria plegable "o lo que sea que se llame a ese panel. –

Cuestiones relacionadas