Dúvida com JPopupMenu > Rolando Exceção

Olá,
tenho duas dúvidas
A primeira é sobre o jpopupmenu, criei um trayicon e um jpopupmenu para ele. Ao clicar a primeira vez ele funciona perfeitamente mas se eu clico no trayicon de novo, ou seja, o jpopupmenu estava visivel, rola exceção para mim e isso não estou sabendo resolver.

A exceção:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.awt.TrayIcon cannot be cast to java.awt.Component at javax.swing.plaf.basic.BasicPopupMenuUI$MouseGrabber.eventDispatched(Unknown Source) at java.awt.Toolkit$SelectiveAWTEventListener.eventDispatched(Unknown Source) at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source) at java.awt.Toolkit.notifyAWTEventListeners(Unknown Source) at java.awt.TrayIcon.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

Estou criando o jpopupmenu desta forma:

[code]/**

  • construtor
    */
    public TrayIconConstructor() {
    this.popupMenu = new JPopupMenu();
    Image img =
    Toolkit.getDefaultToolkit().getImage(“client/desktop/img/java.gif”);
    this.trayIcon = new TrayIcon(img, “5PTray”, null);
createPopUpMenu(popupMenu);

this.trayIcon.addMouseListener(new MouseAdapter() {
  @Override
  public void mouseClicked(MouseEvent e) {
    if (!e.isPopupTrigger() && e.getButton() == MouseEvent.BUTTON3) {
      popupMenu.setLocation(e.getX(), e.getY());
      popupMenu.setInvoker(popupMenu);
      popupMenu.setVisible(true);
    }
    else {
      popupMenu.setVisible(false);
    }
  }
});

}

/**

  • @param popupMenu
    */
    private void createPopUpMenu(JPopupMenu popupMenu) {
    this.popupMenu = popupMenu;
JMenuItem exit = new JMenuItem("Exit");
exit.addActionListener(new ActionListener() {

  @Override
  public void actionPerformed(ActionEvent e) {
    if (JOptionPane.showConfirmDialog(null, "Confirm Quit?",
      "Quit Message", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
      System.exit(0);
  }
});

items = new JMenu("Items");

this.popupMenu.add(items);
items.setEnabled(false);
this.popupMenu.addSeparator();
this.popupMenu.add(exit);
this.popupMenu.setLightWeightPopupEnabled(true);

}[/code]

Minha segunda dúvida seria em relação aos items do jpopupmenu. Eu gostaria que ao clicar fora ou o mouse saisse do campo visível dele, ele sumisse fazendo nenhuma ação. Isso não acontece ainda. Tentei colocar um focuslistener mas ao mover o mouse um centímetro o jpopupmenu sumia e não esperava ver se o mouse saiu da parte visível dele. Isso incluiria o menu items que possui submenu com 5 opções.
Como faço isso?

Obrigado a todos pela leitura.

E ae! Eu tenho um TrayIcon aqui e não da problema… tem algumas coisas diferentes no código.

[code]private PopupMenu trayMenu = new PopupMenu();

private void configurarBandeja() throws Exception {
if (!SystemTray.isSupported()) {
throw new ExceptionInInitializerError(“O sistema nao suporta icones na bandeja.”);
} else {
MenuItem desligarMItem = new MenuItem(“Desligar”);

        final TrayIcon trayIcon = new TrayIcon(new ImageIcon(this.getClass()
                .getClassLoader().getResource("tray.png")).getImage(), "Sistema", trayMenu);
        
        trayIcon.setImageAutoSize(true);
        
        desligarMItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt) {
                trayIcon.displayMessage("Sistema.", "Desligando o servidor",
                        TrayIcon.MessageType.INFO);
                
                System.exit(0);
            }
        });

        trayMenu.add(desligarMItem);

        SystemTray.getSystemTray().add(trayIcon);
        trayIcon.displayMessage("Sistema", "O servidor terminou de ser carregado em " + DataUtils.getNacional()
            .format(new Date(System.currentTimeMillis())), TrayIcon.MessageType.INFO);
    }
}[/code]

eu fiz com swing e vc com AWT.
Entao eu troquei aqui o meu popupmenu para swt e ele funciona sem os problemas acima.
Mas ele nao esta pegando as strings, ou esta mas nao esta colocando no menu items em awt.

Irei testar!

Obrigado.

Opa, consegui resolver o problema do popupmenu, muito obrigado. Usar AWT ajudou muito!

agora tenho somente esse problema: http://www.guj.com.br/posts/list/107426.java