2012-03-15 14 views
6

Actualmente estoy desarrollando una aplicación java SWT en Windows 7. Por lo general, la aplicación se minimizará, y cuando hay un evento en el puerto serie, la aplicación debe maximizarse. El siguiente código hace la parte de maximización.Aplicación Java SWT - Traer al frente

private void bringToFront(final Shell shell) { 
    shell.getDisplay().asyncExec(new Runnable() { 
     public void run() { 
      if(!shell.getMaximized()){ 
       shell.setMaximized(true); 
      } 
      shell.forceActive(); 
     } 
    }); 
} 

Pero a veces la aplicación SWT se maximiza detrás de otra aplicación. Por ejemplo, si tengo un punto de energía ejecutándose en modo Pantalla completa, la aplicación maximizada está detrás de la presentación de PowerPoint. Me gustaría maximizarlo y ponerlo al frente de todas las demás aplicaciones.

¿Alguien me puede ayudar?

+0

Nope. El método forceActive mueve el shell a la parte superior del orden Z. Esto traerá el caparazón al frente si y solo si ninguna otra ventana también se mueve hacia la parte superior del orden Z. –

Respuesta

-2

Necesita que su aplicación funcione en modo de pantalla completa.

vistazo a este enlace How can I create a Java Swing app that covers the Windows Title bar?

+1

ok, no estoy usando la biblioteca SWING, pero SWT. Intenté con una opción similar en SWT pero no cumple con lo que esperaba. La aplicación Java cuando está maximizada todavía está detrás de la aplicación del punto de energía. – Dinesh

5

Deberá ajustar el bit de estilo SWT.ON_TOPShell en su caso. Lamentablemente, la configuración de bits de estilo solo es posible en el constructor.

Pero si entiendo su configuración de caso de uso, ese bit podría ser viable para usted, ya que solo parece alternar entre estado minimizado y maximizado.

Si eso no es posible, simplemente deseche y recree su caparazón y su contenido, cuando desee alternar entre estados.

4

Encontré alguna solución para el problema, podría no ser la mejor solución pero funciona para mí. Si alguien tiene una mejor solución manténganse informados. Gracias

Utilizando el método ShowDesktop() primera simular tecla windows + D evento para mostrar el escritorio

 private void showDesktop() { 
     try{ 
      Robot robot = new Robot(); 
      robot.keyPress(KeyEvent.VK_WINDOWS); 
      robot.keyPress(KeyEvent.VK_D); 
      robot.keyRelease(KeyEvent.VK_D); 
      robot.keyRelease(KeyEvent.VK_WINDOWS); 
      } 
     catch(Exception e){e.printStackTrace();} 
    } 

continuación, maximice la aplicación de shell

private void bringToFront(final Shell shell) { 

     showDesktop(); //minimize all the application 

     Thread.sleep(5000); // here have to wait for some time, I am not sure why 

     shell.getDisplay().asyncExec(new Runnable() { 
     public void run() { 
      if(!shell.getMaximized()){ 
       shell.setMaximized(true); 
      } 
      shell.forceActive(); 
     } 
    }); 
    } 
5

Hay una otra "hackey" forma de hacer esto que lo que encontraste, que no requiere que minimices todo lo demás. De hecho, necesita llamar al shell.setMinimized(false) y después de eso shell.setActive() para restaurar el estado anterior de shell. Sin embargo, eso solo funciona si el shell estaba realmente en el estado minimizado. Así que aquí está mi solución final, que minimiza artificialmente el shell si no se ha minimizado. El costo es una animación rápida si se tiene que hacer la minimización.

shell.getDisplay().syncExec(new Runnable() { 

    @Override 
    public void run() { 
     if (!shell.getMinimized()) 
     { 
      shell.setMinimized(true); 
     } 
     shell.setMinimized(false); 
     shell.setActive(); 
    } 
}); 
Cuestiones relacionadas