Question

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.

Était-ce utile?

La 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

Autres conseils

Your code is absolutely fine, probably your Image can't be found. If you're using eclipse it should be located in your project folder.

If image cannot be found (as @Leo Pflug noticed your code seems fine), try this little trick I've been using:

// place this class in the same directory as your image
public class Resources {
    private Resources() {}
}

// then to obtain Image
Image image = javax.imageio.ImageIO.read(
    Resources.class.getResourceAsStream("systemtray.png"));

It will guarantee that Java would search for a systemtray.png in EXACTLY the same directory as Resources.java (Resoures.class) file.

I suspect that Toolkit searches for it in its own directoery while you placed image in the same directory as your code, and thus the problem.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top