Dúvida com JPopupMenu > Rolando Exceção

3 respostas
paolobacci

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:
/**
   * 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);
  }

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.

3 Respostas

Gobain
E ae! Eu tenho um TrayIcon aqui e não da problema... tem algumas coisas diferentes no código.
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);
        }
    }
paolobacci

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.

paolobacci

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

Criado 24 de outubro de 2008
Ultima resposta 24 de out. de 2008
Respostas 3
Participantes 2