Bug no JPopupMenu
Recentemente um bug com JPopupMenu foi detectado no projeto do qual faço parte. Não foram realizados testes no Windows, apenas no Linux (Suse 10).
O bug se dá quando abrimos o popup menu e logo em seguida sobrepomos a janela de uma outra aplicação. O resultado é que o popup menu continua aberto sobre essa outra janela, podendo até ter seus ítens selecionados.
Esse bug consta no site da sun (bug id: 5014550) e muitas soluções foram postadas pois ela alegou que a correção estará incorporada apenas na versão 6 (Mustang), claro que ninguém achou graça nessa notícia, mas paciência. Lógico que para quem não tem paciência ou realmente não pode esperar devido aos prazos de seus projetos (meu caso), segue uma solução "paleativa": Adicionar um WindowListener a janela que receberá o popup menu para quando ela for desativada, ou seja, perder o foco para outra aplicação, o menu seja fechado. Notem que o post passado é bem útil para quem não sabe muito de listeners e tiver alguma dúvida com o código abaixo.
public class MyFrame extends JFrame{
JPopupMenu menu = new JPopupMenu();
/*Window listener para fechar o popup menu quando o frame perder o foco*/
WindowListener windowListener = new WindowAdapter(){
public void windowDeactivated(WindowEvent e)(
if (menu != null || menu.isVisible()){
System.out.println("Frame desativado, o menu será fechado!");
menu.setVisible(false);
}
}
}
/*Mouse listener para abrir o popup menu*/
MouseListener mouseListener = new MouseAdapter(){
public void mousePressed(MouseEvenet e){
if (e.isPopupTrigger()){
menu.setVisible(true);
}
}
}
/*Construtor*/
public MyFrame(){
super("Teste JPopupMenu");
this.addWindowListener(this.windowListener);
this.getContentPane().addMouseListener(this.mouseListener);
}
public static void main(String[] args){
MyFrame frame = new MyFrame();
frame.setVisible(true);
}
}