Swing + Foco

Olá,

Tenho duas perguntas sobre Swing e foco:

1 - Como faço para jogar o foco para minha aplicação Swing? Tenho uma aplicação Swing que fica rodando e, de vez em quando, precisa abrir uma janela para o usuário. O usuário pode estar trabalhando em outra aplicação, e eu preciso que essa janela apareça por cima de todas as outras de todos os programas abertos, só que não pode ser modal.

2 - É possível trocar o foco entre aplicações (swing ou nativas) a partir da minha aplicação Swing? Preciso, a partir de minha aplicação, jogar o foco para uma determinada aplicação que está aberta (tipo ALT+TAB). É possível?

obs: não sei se faz diferença, mas só preciso que isso funcione no Windows.

Alguém tem idéia?

Obrigado!

Pois é, com exceção do alwaysOnTop, todos esses métodos funcionam para alternar entre as janelas da mesma JVM. Mas o que eu preciso é alternar entre as janelas do SO.

O melhor que eu consegui até agora foi:

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

Isto faz a minha janela saltar sobre todas as outras do SO, sem ser modal e sem impedir que o usuário alterne para outra janela depois que ela aparecer. Mas ainda não tenho resposta para a pergunta 2 :frowning:

Saudações. :slight_smile:

Eu conheço uma maneira de deixar uma janela “sempre no topo”, dessas que aparece dizendo “cheguei!”.

Use o método setAlwaysOnTop(boolean ) , original da classe Window.

Existe, sim, uma maneira de permutar entre as janelas: acabei de ver que a classe Window também possui dois métodos chamados toFront() e toBack() , que, respectivamente, jogam a sua janela para a frente e para trás de todas as outras (o nome do método já diz tudo). Usá-los com sabedoria pode garantir o resultado que você deseja.

Consulte a API Java e procure esses métodos.

[[ obs: não encare isso como uma ofensa; mas, caso não saiba, a classe Window é superclasse de JFrame. Logo, esses métodos também funcionam num JFrame. ]]

Boa sorte.