2010-10-23 27 views
5

Me gustaría activar mi aplicación Swing programáticamente. Quiero decir que me gustaría escribir código que haga que el JFrame sea visible y esté enfocado (el encabezado de la ventana debe estar resaltado). Intenté usar requestFocus(). Funciona solo si la aplicación tiene al menos 2 ventanas A y B: A está oculta, B es visible. Ahora si llamo al A.requestFocus(), se activa como yo quiera. No sucede si la aplicación tiene solo una ventana o si ambas son invisibles.¿Cómo activar la ventana en Java?

Encontré 2 soluciones.

  1. usan un marco falso no decorado transparente que siempre está en la parte superior. Esta ventana falsa tendrá el rol de ventana B. No intenté implementarla, pero parece que debería funcionar.
  2. llamada A.setAlwaysOnTop(true). Esto trae la ventana A encima de otras ventanas. Pero todavía no está enfocado. Use java.awt.Robot (mouseMove, mousePress, mouseRelease) para hacer un clic en el encabezado de la ventana A. Ahora llame al A.setAlwaysOnTop(false) y vuelva a colocar el puntero del mouse en su posición anterior. Implementé el código y funciona, pero parece una solución fea.

¿Existe una solución "correcta"?

Respuesta

1

que creían que this puesto debe ayudarle.

1

Esto debe hacerlo:

frame.setSelected(true); 

y es probable que desee dentro de un bloque try/catch ...

Si eso no funciona en el sistema operativo que está usando, hay dos posibilidades:

frame.setAlwaysOnTop(true); 
frame.setAlwaysOnTop(false); 

y

frame.setVisible(true); 
frame.setVisible(true); // Yes you need this second one 
+0

Por lo que yo puedo decir no hay un método 'Frame.setSelected' –

+0

está en JInternalFrame –

+0

Sí, setSelected() no muere existe hasta el momento ... – AlexR

5
frame.setState(Frame.NORMAL); // restores minimized windows 
frame.toFront(); // brings to front without needing to setAlwaysOnTop 
frame.requestFocus(); 

para todo lo que desea saber en absoluto detalle, ver esta página: http://www.developer.com/java/other/article.php/3502181/Window-Focus-and-State-in-Java.htm

+0

to Front() tiene sentido. ¡Gracias! – AlexR

+0

Utilice 'requestFocusInWindow' en lugar de' requestFocus', consulte http://download.oracle.com/javase/tutorial/uiswing/misc/focus.html. –

+0

@Geoffrey - no ... eso es para enfocar los componentes * dentro * de las ventanas, no las ventanas mismas. Puede ser un buen vínculo para que él compruebe si todavía tiene problemas. –

1

Yo estaba en el mismo barco, ninguno de los anteriores funcionó.

"MI" solución fue la siguiente manera:

thisFrame.getWindowListeners()[0].windowActivated(
    new WindowEvent(
       thisFrame, 
       WindowEvent.WINDOW_ACTIVATED 
    ) 
); 
schedulesTable.requestFocus(); 

thisFrame = the window to get activated 

schedulesTable = my component in the window I wanted to get focus for 
+0

Gracias. Aunque hice esta pregunta hace muchos años y ese proyecto es irrelevante ahora, probablemente intente con su solución. – AlexR