O Windows tem a facilidade de evitar que as janelas roubem o foco; em vez disso, ele pisca o ícone da barra de tarefas. No XP, ele está ativado por padrão (o único lugar que vi para alterá-lo é usando o TweakUI, mas há uma configuração de registro em algum lugar). No Vista, eles podem ter alterado o padrão e / ou exposto como uma configuração acessível ao usuário com a interface do usuário pronta para usar.
Evitar que as janelas se forcem para a frente e obtenham o foco é um recurso desde o Windows 2K (e eu, por exemplo, sou grato por isso).
Dito isso, tenho um pequeno aplicativo Java que uso para me lembrar de registrar minhas atividades enquanto trabalho e torna-se a janela ativa a cada 30 minutos (configurável, claro). Ele sempre funciona de forma consistente no Windows XP e nunca pisca a janela da barra de título. Ele usa o seguinte código, chamado no thread de IU como resultado de um evento de timer disparado:
if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
toFront();
repaint();
(a primeira linha é restaurada se minimizada ... na verdade ela restauraria se maximizada também, mas eu nunca fiz isso).
Embora eu geralmente tenha este aplicativo minimizado, muitas vezes ele está simplesmente atrás do meu editor de texto. E, como eu disse, sempre funciona.
Tenho uma ideia de qual poderia ser o seu problema - talvez você tenha uma condição de corrida com a chamada setVisible (). toFront () pode não ser válido a menos que a janela seja realmente exibida quando for chamada; Eu tive esse problema com requestFocus () antes. Você pode precisar colocar a chamada toFront () em um ouvinte da IU em um evento ativado por janela.
07-09-2014: Em algum ponto no tempo, o código acima parou de funcionar, talvez em Java 6 ou 7. Depois de alguma investigação e experimentação, tive que atualizar o código para substituir o toFront
método da janela, fazer isso (em conjunto com o código modificado de que está acima):
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 do Java 8_20, esse código parece estar funcionando bem.