Problema com System Tray Icon

Como eu faço pra adicionar ícones ao menu popup do system tray icon que nem neste tutorial http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/systemtray/
Assim:

Atenção: Não é para criar o ícone na bandeja, mas para colocar um ícone ao lado do nome de cada MenuItem

tentei esta solução mas não deu certo! - o ícone até aparece ao lado da opção, mas quando vc clica fora o menu não desaparece. Tem como resolver?

Tentei utilizar o javax.swing.JMenuItem, mas a classe java.awt.TrayIcon aceita apenas:

TrayIcon(Image image, String tooltip, PopupMenu popup) //java.awt.PopupMenu

Você não baixou o exemplo e tentou ver se ele (realmente) funciona?
http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/systemtray/SystemTrayExample.zip

thingol[quote]Você não baixou o exemplo e tentou ver se ele (realmente) funciona?
http://java.sun.com/developer/technicalArticles/J2...stemtray/SystemTrayExample.zip[/quote]

Tentei, mas veja o código que eles dão:

/*
 * Copyright 2005 Sun Microsystems, Inc. ALL RIGHTS RESERVED 
 * Use of this software is authorized pursuant to the terms of the 
 * license found at http://developers.sun.com/berkeley_license.html
 *
 */

package systemtray;

import java.awt.*;
import java.awt.event.*;

public class SystemTrayTest
{
    
    public SystemTrayTest()
    {
        
        final TrayIcon trayIcon;

        if (SystemTray.isSupported()) {

            SystemTray tray = SystemTray.getSystemTray();
            Image image = Toolkit.getDefaultToolkit().getImage("tray.gif");

            MouseListener mouseListener = new MouseListener() {
                
                public void mouseClicked(MouseEvent e) {
                    System.out.println("Tray Icon - Mouse clicked!");                 
                }
                public void mouseEntered(MouseEvent e) {
                    System.out.println("Tray Icon - Mouse entered!");                 
                }
                public void mouseExited(MouseEvent e) {
                    System.out.println("Tray Icon - Mouse exited!");                 
                }
                public void mousePressed(MouseEvent e) {
                    System.out.println("Tray Icon - Mouse pressed!");                 
                }
                public void mouseReleased(MouseEvent e) {
                    System.out.println("Tray Icon - Mouse released!");                 
                }

            };

            ActionListener exitListener = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Exiting...");
                    System.exit(0);
                }
            };
            
            PopupMenu popup = new PopupMenu();
            MenuItem defaultItem = new MenuItem("Exit");
            defaultItem.addActionListener(exitListener);
            popup.add(defaultItem);

            trayIcon = new TrayIcon(image, "Tray Demo", popup);

            ActionListener actionListener = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    trayIcon.displayMessage("Action Event", 
                        "An Action Event Has Been Peformed!",
                        TrayIcon.MessageType.INFO);
                }
            };
            
            trayIcon.setImageAutoSize(true);
            trayIcon.addActionListener(actionListener);
            trayIcon.addMouseListener(mouseListener);

            //    Depending on which Mustang build you have, you may need to uncomment
            //    out the following code to check for an AWTException when you add 
            //    an image to the system tray.

            //    try {
                      tray.add(trayIcon);
            //    } catch (AWTException e) {
            //        System.err.println("TrayIcon could not be added.");
            //    }

        } else {
            System.err.println("System tray is currently not supported.");
        }
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        SystemTrayTest main = new SystemTrayTest();
    }
    
}

Não é como na figura. Queria que fosse assim" :idea: Both Text and Icon" ícone ao lado do texto.

Propaganda enganosa :roll: ?

Realmente é propaganda enganosa. Não tinha visto isso :frowning:

Que decepção! :shock:

E eu que tava todo empolgado com esse negócio, apesar de ter lido que ele parece que não funciona no KDE :mrgreen:.

Vou mandar um e-mail pro autor do tutorial informando o problema, talvez já tenham resolvido sei lá. :hunf:

Se consegui posto aqui.

Flw.

Testei o código do tutorial da SUN e do link(com JPopupMenu) em várias máquinas, inclusive com KDE e funcionou.
Na época utilizei o mesmo link que vc passou(para conseguir um menu com ícone). No fim dos comentários desse link com JPopuMenu tem uma pessoa que fala que resolveu os problemas e passa um link de um fórum em alemão(não testei o código desse link).

Enfrentei problemas com KDE foi utilizando a biblioteca Jdic, o clique do mouse no trayicon fazia o menu apenas piscar. :frowning:
Na época enviei um email pro tutorial também e até hoje nada, talvez vc tenha mais sorte… :thumbup:

O problema desta solução com JPopupMenu é que o menu não desaparece até que vc clique em alguma opção.

Visitei este fórum tá em alemão mesmo (aí eu no language_tools do google: Alemão >> English >> Portuguese) :smiley: Tinha lá um moderador mac_systems, que estava fazendo um código lá (bem grandinho por sinal) pra resolver estes problemas … mas que não tinha resolvido ainda. Vi também que haviam comentado sobre ClassCastExceptions que ocorriam mas não entendi bem. E sobre um possível bug (que tava até duplicado na base de dados de bugs do java :D) Mas não encontrei nenhuma pista de como resolver.

[]'s

Olha só que arte,

A foto que tem no tutorial do java na verdade é deste programinha aqui que usa a biblioteca jdic neste url: https://jdic.dev.java.net/

Pelo que vi no javadoc desta biblioteca ela contém no pacote org.jdesktop.jdic.tray as Classes
SystemTray - "The SystemTray class represents the System Tray for a desktop."
TrayIcon - "The TrayIcon class represents a tray Icon that can be added to a System tray."
E a classe TrayIcon suporta o JPopupMenu que pode conter ícone e texto.

TrayIcon(javax.swing.Icon icon, java.lang.String caption, javax.swing.JPopupMenu popup) 

Isto teoricamente resolve meu problema, vou fazer alguns testes.

O código fonte do programinha da foto está anexo neste post.

No Gtk (Gnome) consegui resolver usando um Jwinodw. Mas quando fui testar no Windows não funcionou :/.
Segue o fonte do que fiz pro Gtk.

import java.awt.AWTException;
import java.awt.Image;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JWindow;

/**
 *
 * @author Andrey M. Bruggemann
 */
public class JTrayIcon {
	
	private final TrayIcon trayIcon;
	private JWindow trayWindow;
	private JPopupMenu popupMenu;
	private boolean visible;
	private JFrame mainFrame;
	
	public JTrayIcon(JFrame mainFrame, Image icon) throws UnsupportedOperationException
	{
		if (SystemTray.isSupported()) {
			this.mainFrame = mainFrame;
			trayIcon = new TrayIcon(icon);
			trayIcon.setImageAutoSize(true);
		} else {
			throw new UnsupportedOperationException ("Tray icon is not supported.");
		}
	}
	
	public JTrayIcon(JFrame mainFrame, Image icon, boolean autoSize) throws UnsupportedOperationException
	{
		this(mainFrame, icon);
		trayIcon.setImageAutoSize(autoSize);
	}
	
	public JTrayIcon(JFrame mainFrame, Image icon, String toolTipText)
	{
		this(mainFrame, icon);
		trayIcon.setToolTip(toolTipText);
	}
	
	public JTrayIcon(JFrame mainFrame, Image icon, String toolTipText, JPopupMenu popupMenu)
	{
		this(mainFrame, icon, toolTipText);
		trayWindow = new JWindow();
		trayWindow.add(popupMenu);
		trayWindow.setVisible(true);
		this.popupMenu = popupMenu;
		trayIcon.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent arg0)
			{
				System.out.println(arg0.getActionCommand());
			}
		});
		
		trayIcon.addMouseListener(new MouseAdapter()
		{
			@Override
			public void mousePressed(MouseEvent ev)
			{
				if (ev.isPopupTrigger()) {
					
					JTrayIcon.this.popupMenu.show(trayWindow,
							ev.getX(),
							ev.getY());
				}
			}
		});
	}
	
	public void setVisible(boolean visible)
	{
		try {
			if (visible) {
				SystemTray.getSystemTray().add(trayIcon);
			} else {
				SystemTray.getSystemTray().remove(trayIcon);
			}
			trayWindow.setVisible(visible);
			this.visible = visible;
		} catch (AWTException ex) {
			//Nothing to do, this should never occur
			ex.printStackTrace();
		}
	}

}