JWindow sempre no topo não recebendo eventos de foco
Pergunta
Eu tenho um JWindow (definido para estar sempre no topo) que você pode clicar para obter um menu pop. Se o direito de utilizador clica a janela que mostra o menu pop, mas, em seguida, se o usuário clica em qualquer outra janela (como o Firefox) no menu pop não desaparece.
Tentei corrigi-lo adicionando focusListener na JWindow, i implementado focusListener e override
public void focusGained(FocusEvent e) {
System.out.println("gain" );
}
public void focusLost(FocusEvent e) {
System.out.println("lost" );
}
mas há evento nunca obter chamado. Eu também tentei o seguinte,
addWindowFocusListener(new WindowAdapter() {
public void windowGainedFocus(WindowEvent e) {
System.out.println("gain 2" );
}
});
Este evento também não é chamado.
Tudo isso jwindows tem um único JLabel com uma imagem sobre ele.
Solução
A partir da memória JWindow não receber eventos de foco / janela.
Outras dicas
Você está supor para setFocusableWindowState(true)
chamada em uma JWindow
para permitir que ele seja focusable. Mas que "ainda" não é suficiente. O JWindow
também deve ter focalizável Componentes e eu ainda não sou capaz de fazê-lo funcionar.
Usando JFrame setUndecorated()
parece ser a melhor escolha.
Para ser focusable, um JWindow
precisa ser criado com um Frame
pai, como new JWindow(parentFrame)
. Faça isso e eu acho que você deve encontrá-lo irá receber automaticamente o foco quando você configurá-lo para visível.
Não sei o que você está tentando fazer. Se você está tentando esconder o popup manualmente, então você provavelmente deve usar um WindowListener e manipular o evento windowDeactivated.
Se você realmente quer para exibir um menu pop-up, você deve estar usando JPopupMenu, não implementá-la a si mesmo.