Tenemos una aplicación Java que se debe traer a un primer plano cuando un mecanismo de telecontrol activa algo en la aplicación.
Para ello, nos hemos dado cuenta en el método llamado de la clase que representa el marco de nuestra aplicación (extensión de a JFrame
) siguiente implementación:
setVisible(true);
toFront();
En Windows XP, esto funciona la primera vez que se llama, la segunda vez solo parpadea la pestaña en la barra de tareas, el marco ya no aparece al frente. Lo mismo ocurre con Win2k. En Vista, parece funcionar bien.
¿Tienes alguna idea?
toFront()
al EDT usandoinvokeLater
. A continuación se incluye una respuesta simple, pero no es la respuesta aceptada. Sin embargo, funciona. Perfectamente.Respuestas:
Una posible solución es:
fuente
Tuve el mismo problema al traer un
JFrame
al frente en Ubuntu (Java 1.6.0_10). Y la única forma en que podría resolverlo es proporcionando unWindowListener
. Específicamente, tuve que configurar miJFrame
para que permaneciera siempre en la parte superior cada vez quetoFront()
se invocaba y proporcionar unwindowDeactivated
controlador de eventos asetAlwaysOnTop(false)
.Entonces, aquí está el código que podría colocarse en una base
JFrame
, que se usa para derivar todos los marcos de la aplicación.Siempre que su marco deba mostrarse o llevarse al frente, llame
frame.setVisible(true)
.Desde que me mudé a Ubuntu 9.04, parece que no hay necesidad de tener una
WindowListener
invocaciónsuper.setAlwaysOnTop(false)
, como se puede observar; este código se movió a los métodostoFront()
ysetVisible()
.Tenga en cuenta que el método
setVisible()
siempre debe invocarse en EDT.fuente
.setAlwaysOnTop(true);
era el único que trabajó para mí cuando se utiliza un JWindow.setAlwaysOnTop(true)
es la única forma en que lo hago funcionar bajo Windows 10, ¡gracias!Windows tiene la capacidad de evitar que las ventanas roben el foco; en su lugar, parpadea el icono de la barra de tareas. En XP está activado por defecto (el único lugar que he visto para cambiarlo es usando TweakUI, pero hay una configuración de registro en alguna parte). En Vista, es posible que hayan cambiado el valor predeterminado y / o lo hayan expuesto como una configuración accesible para el usuario con la interfaz de usuario lista para usar.
Evitar que las ventanas se fuercen al frente y se enfoquen es una característica desde Windows 2K (y yo, por mi parte, estoy agradecido por ello).
Dicho esto, tengo una pequeña aplicación de Java que uso para recordarme que registre mis actividades mientras trabajo, y se convierte en la ventana activa cada 30 minutos (configurable, por supuesto). Siempre funciona de manera uniforme en Windows XP y nunca muestra la ventana de la barra de título. Utiliza el siguiente código, llamado en el hilo de la IU como resultado de la activación de un evento de temporizador:
(la primera línea se restaura si se minimiza ... en realidad la restauraría si se maximizara también, pero nunca la tengo así).
Si bien normalmente tengo esta aplicación minimizada, a menudo está simplemente detrás de mi editor de texto. Y, como dije, siempre funciona.
Tengo una idea de cuál podría ser su problema; tal vez tenga una condición de carrera con la llamada setVisible (). toFront () puede no ser válido a menos que la ventana se muestre realmente cuando se llama; He tenido este problema con requestFocus () antes. Es posible que deba poner la llamada toFront () en un detector de IU en un evento activado por ventana.
2014-09-07: En algún momento, el código anterior dejó de funcionar, tal vez en Java 6 o 7. Después de investigar y experimentar, tuve que actualizar el código para anular el
toFront
método de la ventana para hacer esto (junto con el código modificado de lo que está arriba):A partir de Java 8_20, este código parece funcionar bien.
fuente
super.setAlwaysOnTop(false);
es para que la ventana no siempre esté en la parte superior, lo cual es necesario para deshacerse de lotrue
que configuramos anteriormente para llevar la ventana al frente, ¿correcto? Lo pregunto porque con su código, la ventana todavía está siempre arriba en mi caso, lo que obviamente no quiero. Ejecutando jre1.8.0_66 en Windows 10.Aquí hay un método que REALMENTE funciona (probado en Windows Vista): D
La variable de pantalla completa indica si desea que la aplicación se ejecute en pantalla completa o en ventana.
Esto no hace parpadear la barra de tareas, pero trae la ventana al frente de manera confiable.
fuente
Hj, todos sus métodos no funcionan para mí, en Fedora KDE 14. Tengo una forma sucia de traer una ventana al frente, mientras esperamos que Oracle solucione este problema.
Y esto funciona perfectamente en mi Fedora KDE 14 :-)
fuente
Este método simple funcionó para mí perfectamente en Windows 7:
fuente
repaint()
es necesario, loinvokeLater()
hizo. Gracias.Probé tus respuestas y solo la de Stefan Reich funcionó para mí. Aunque no pude restaurar la ventana a su estado anterior (maximizada / normal). Encontré mejor esta mutación:
Eso es en
setState
lugar desetExtendedState
.fuente
La forma más sencilla que he encontrado que no tiene inconsistencias entre plataformas:
setVisible (falso); setVisible (verdadero);
fuente
Las reglas que rigen lo que sucede cuando .toFront () un JFrame son las mismas en Windows y en Linux:
-> si una ventana de la aplicación existente es actualmente la ventana enfocada, entonces el enfoque cambia a la ventana solicitada -> si no, la ventana simplemente parpadea en la barra de tareas
PERO :
-> las nuevas ventanas se enfocan automáticamente
¡Explotemos esto! Quieres traer una ventana al frente, ¿cómo hacerlo? Bien :
O, en código java:
fuente
Existen numerosas advertencias en el javadoc para el método toFront () que pueden estar causando su problema.
Pero, de todos modos, haré una conjetura, cuando "solo parpadee la pestaña de la barra de tareas", ¿se ha minimizado la aplicación? Si es así, se puede aplicar la siguiente línea del javadoc:
"Si esta ventana es visible, trae esta ventana al frente y puede convertirla en la ventana enfocada".
fuente
Para evitar que la ventana pierda el foco cuando vuelva a ser visible después de estar oculta, todo lo que se necesita es:
Al igual que:
fuente