Search code examples
javaimageswingsystem-traytrayicon

Why TrayIcon doesn't appear?


I'm trying to add a TrayIcon inside a Tray that already appears. I'm new in Java so i can be calling wrong methods. Could someone help me please? The code i use is:

if (!SystemTray.isSupported()) {
    System.out.println("SystemTray is not supported");
    return;
}

final SystemTray tray = SystemTray.getSystemTray();
Image image = Toolkit.getDefaultToolkit().getImage("systemtray.png");
PopupMenu popup = new PopupMenu();
final TrayIcon trayIcon = new TrayIcon(image, "The Tip Text", popup);
trayIcon.setImageAutoSize(true);
try {
    tray.add(trayIcon);
} catch (AWTException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

ps.: image is in the same package of code.


Solution

  • Here's an example. Look to see where you may be going wrong.

    • Get Image enter image description here

      Image image= ImageIO.read(getClass().getResource("/resources/stackoverflow1.png"));
      

    • File structure

    enter image description here


    • Complete running program

    Here

    import java.awt.*;
    import java.awt.event.*;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.JFrame;
    import javax.swing.UIManager;
    
    public class HideToSystemTray extends JFrame {
    
        TrayIcon trayIcon;
        SystemTray tray;
    
        HideToSystemTray() throws IOException {
            super("SystemTray test");
            System.out.println("creating instance");
            try {
                System.out.println("setting look and feel");
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception e) {
                System.out.println("Unable to set LookAndFeel");
            }
            if (SystemTray.isSupported()) {
                System.out.println("system tray supported");
                tray = SystemTray.getSystemTray();
    
                Image image = ImageIO.read(getClass().getResource("/resources/stackoverflow1.png"));
                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);
                defaultItem = new MenuItem("Open");
                defaultItem.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        setVisible(true);
                        setExtendedState(JFrame.NORMAL);
                    }
                });
                popup.add(defaultItem);
                trayIcon = new TrayIcon(image, "SystemTray Demo", popup);
                trayIcon.setImageAutoSize(true);
            } else {
                System.out.println("system tray not supported");
            }
            addWindowStateListener(new WindowStateListener() {
                public void windowStateChanged(WindowEvent e) {
                    if (e.getNewState() == ICONIFIED) {
                        try {
                            tray.add(trayIcon);
                            setVisible(false);
                            System.out.println("added to SystemTray");
                        } catch (AWTException ex) {
                            System.out.println("unable to add to tray");
                        }
                    }
                    if (e.getNewState() == 7) {
                        try {
                            tray.add(trayIcon);
                            setVisible(false);
                            System.out.println("added to SystemTray");
                        } catch (AWTException ex) {
                            System.out.println("unable to add to system tray");
                        }
                    }
                    if (e.getNewState() == MAXIMIZED_BOTH) {
                        tray.remove(trayIcon);
                        setVisible(true);
                        System.out.println("Tray icon removed");
                    }
                    if (e.getNewState() == NORMAL) {
                        tray.remove(trayIcon);
                        setVisible(true);
                        System.out.println("Tray icon removed");
                    }
                }
            });
            setIconImage(ImageIO.read(getClass().getResource("/resources/stackoverflow1.png")));
    
            setVisible(true);
            setSize(300, 200);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    
        public static void main(String[] args) throws IOException {
            new HideToSystemTray();
        }
    }
    

    • Result

    enter image description here