2009-03-13 25 views
6

Escribo un juego pequeño, con un JFrame que contiene el juego principal y otro JFrame que muestra el puntaje. el problema es que, cuando termine de construirlos, ¡el puntaje JFrame siempre termina enfocado! He intentado llamar scoreDisplay.toFront(), scoreDisplay.requestFocus(), e incluso:¿Cómo enfocar un JFrame?

display.setState(JFrame.ICONIZED); 
display.setState(JFrame.NORMAL); 

¿Hay alguna manera de hacer este trabajo? Gracias de antemano, John murano

+0

Para futuros visitantes que deseen enfocar un JFrame, vea mi respuesta en la página que utiliza 'frame.requestFocus()'. La respuesta aceptada resuelve el problema de OP, pero la solución es muy específica para su situación. –

Respuesta

2

Tenga en cuenta que el establecimiento de la puntuación en el mismo marco que el marco de juego?

Otra opción posible (rápida y sucia) es crearlos en orden inverso, o al menos (si la puntuación depende del juego) mostrarlos en orden inverso.

score.setVisible(true); 
game.setVisible(true); 

Mi conjetura es que en la actualidad son:

game.setVisible(true); 
score.setVisible(true); 
+0

Gracias. ¡Esta solución funciona perfectamente! –

+2

Si bien esta solución resuelve el problema del OP, no responde a la pregunta del título. –

6

Toggle alwaysOnTop

Ver aquí:

http://forums.sun.com/thread.jspa?threadID=5124278

Lea sobre toFront en la API http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Window.html#toFront

Algunas plataformas pueden no permitir esta VM para colocar sus ventanas por encima de las ventanas de aplicaciones nativas, o ventanas de otras máquinas virtuales.

En el sistema operativo Windows, por ejemplo, toFront hace que el icono en la barra de tareas para parpadeo, pero la ventana se queda en la parte posterior .

El único pensamiento que forzará la ventana al frente es setAlwaysOnTop.

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

Gracias. Esto funcionó para mí, con la advertencia de que tenía que llamarlos (inmediatamente) después de frame.setVisible (true). Supongo que tiene sentido, pero los estaba haciendo por separado. – ensignr

-2
frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
frame.setVisible(true); 

Pruebe lo anterior ..

6

Llame al método requestFocus().

No se garantiza que esto funcione, porque hay muchas razones por las que un sistema operativo no permite que un marco tenga foco. Podría haber otro marco con mayor prioridad en una aplicación diferente. También hay algunos escritorios Linux que (si recuerdo correctamente) no permiten que los marcos soliciten el foco.

Para tener más posibilidades de éxito, también recomiendo llamar al método toFront() antes de solicitar el enfoque.

frame.setVisible(true); 
frame.toFront(); 
frame.requestFocus(); 

Por favor, tenga en cuenta, nada de esto está garantizado debido a la manipulación marco, sobre todo con el enfoque y la estratificación, es muy dependiente del sistema operativo. De modo que configure el marco como visible, muévalo al frente y solicite el enfoque. Una vez que renuncie al EDT, el sistema operativo probablemente le dará al marco el enfoque. Por lo menos, la ventana debe estar en la parte superior.

0

Simplemente agregue la siguiente línea de código sobre el código JOptionPaneMessageDialog ... this.setAlwaysOnTop (false);