Evitar ganhar foco

Olá

Estou trabalhando com uma apliçação que abre janelas pop-up para dar avisos ao usuário. Eu gostaria que as janelas abrissem sem roubar o foco da aplicação que o usuário está trabalhando, mas isto ocorre em determinadas ocasiões.

Para ficar claro se estou falando da minha aplicação ou de outra, vou usar o Word no lugar de “outra-aplicação-que-não-a-minha”:

a. Na primeira vez que a janela pop-up abre, ocorre roubo de foco do usuário digitando no Word. Se o usuário clicar de volta no Word enquanto a janela estiver aberta, as outras vezes que a janela popar não vai haver roubo do foco. Se o usuário não clicar, a próxima janela irá roubar o foco novamente. E assim sucessivamente: se enqto esta janela aparecer ele clicar no Word, depois o problema não ocorre mais; senão, persiste. Ou seja: parece que clicando no Word, a janela “aprende” a não roubar mais o foco.

b. A janela é um Container formado por um JPanel, um JEditorPane e um JButton; o Container é um atributo de um JFrame. Toda vez que o usuário clica no JPanel (que faz com que a janela popup feche), o problema volta a acontecer: na próxima vez que janela que é aberta, ela rouba o foco novamente (ou seja, desaprendeu a não roubar o foco).

Já tentei usar o comando setFocusableWindowState, que, settado para false, faz com que uma janela não tenha foco (usado para menus flutuantes; mas neste caso, por trás, a aplicação tem foco), mas ele não funciona. Aparentemente, pelo menos 1 janela/componente tem que estar ativo (quando tiro o JPanel, o problema passa a ocorrer quando se clica num dos outros componentes).

Alguém teria alguma sugestão? Agradeço muito qualquer ajuda!

Denise

Denise, não sei se vai ajudar, mas que tal se você fizer a janela principal gerar a pop-up e logo depois setar o foco para a principal novamente? Desta forma dá pra dar uma enganada. Será como se a principal não tivesse perdido o foco em momento algum.

Obrigada, Rnpenna!

Eu acho que não te entendi ou talvez não tenha me explicado bem.

Eu não tenho uma janela principal e outra pop-up. A única janela da minha aplicação é esta pop-up.

O que eu preciso é não roubar o foco da aplicação que o usuário está trabalhando e o setFocusableWindowState como falso era minha esperança (veja abaixo). Mas talvez eu não o esteja entendendo bem.

Outra opção é devolver o foco de volta assim que ela abrir, mas não sei se é isto é possível.

Obrigada mais uma vez!
Denise

public void setFocusableWindowState(boolean focusableWindowState)

Sets whether this Window can become the focused Window if it meets the other requirements outlined in isFocusableWindow. If this Window’s focusable Window state is set to false, then isFocusableWindow will return false. If this Window’s focusable Window state is set to true, then isFocusableWindow may return true or false depending upon the other requirements which must be met in order for a Window to be focusable.

Setting a Window’s focusability state to false is the standard mechanism for an application to identify to the AWT a Window which will be used as a floating palette or toolbar, and thus should be a non-focusable Window.

Ah sim me perdoe, eu é quem não havia entendido o que você quis dizer. Tente usar o método windowDeactivated() da interface WindowListener.

Obrigada, vou tentar! Denise

Olá:

Rpenna, obrigada mais uma vez pela sua dica. Mas antes de testar sua solução, um amigo tentou reproduzir o erro no computador dele e não conseguiu. Como as versões Java eram diferentes, desconfiamos disto.

Aparentemente consegui resolver o problema apenas mudando a versão do Java. A minha era 1.5.0_06-b05. Com a versão 1.6.0-b105 não consegui reproduzir o erro (testei muito rapidamente, mas pareceu realmente funcionar).

Denise