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:
if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
toFront();
repaint();
(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):
setVisible(true);
toFront();
requestFocus();
repaint();
...
public @Override void toFront() {
int sta = super.getExtendedState() & ~JFrame.ICONIFIED & JFrame.NORMAL;
super.setExtendedState(sta);
super.setAlwaysOnTop(true);
super.toFront();
super.requestFocus();
super.setAlwaysOnTop(false);
}
A partir de Java 8_20, este código parece funcionar bien.