托盘图标根本没有在java中显示

时间:2015-06-25 15:36:26

标签: java trayicon

我一直在努力让我的托盘图标添加,但它不起作用。我有一个存储在netbeans src / myproject /

中的图标文件

我尝试了很多不同的路径,甚至是直接路径到我的文件,但似乎都没有。我很确定我的代码中的某些东西不起作用,我根本看不到它。

public void createSystemTrayIcon() {

if (SystemTray.isSupported()) {
    SystemTray tray = SystemTray.getSystemTray();
    Image img = Toolkit.getDefaultToolkit().getImage("smallicon.ico");

    PopupMenu popup = new PopupMenu();

    final MenuItem menuExit = new MenuItem("Quit");

    MouseListener mouseListener =
        new MouseListener() {
        public void mouseClicked(MouseEvent e) {
            show();
        }

        public void mouseEntered(MouseEvent e) {
        }

        public void mouseExited(MouseEvent e) {
        }

        public void mousePressed(MouseEvent e) {
        }

        public void mouseReleased(MouseEvent e) {
        }
    };

    ActionListener exitListener =
        new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Runtime r = Runtime.getRuntime();
            System.out.println("Exiting...");
            r.exit(0);
        }
    };

    menuExit.addActionListener(exitListener);
    popup.add(menuExit);

    final TrayIcon trayIcon = new TrayIcon(img, "ESOLeaderboards", popup);

    ActionListener actionListener =
        new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                trayIcon.displayMessage("ESOLeaderboards ","version: EU 1.0",
                        TrayIcon.MessageType.INFO);
        }
    };

    trayIcon.setImageAutoSize(true);
    trayIcon.addActionListener(actionListener);
    trayIcon.addMouseListener(mouseListener);

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

} else {
    //  System Tray is not supported
}

}

3 个答案:

答案 0 :(得分:1)

Toolkit.getDefaultToolkit().getImage("smallicon.ico");仅支持JPG,PNG和GIF图片。

它不支持ico图像。使用另一张图片。

答案 1 :(得分:1)

在Windows 10中,我已经能够以这种方式在托盘中查看16像素的PNG:

final URL resource = getClass().getResource("icon16.png");
final TrayIcon trayIcon = new TrayIcon(Toolkit.getDefaultToolkit().getImage(resource), "Application v0.1 tooltip");

它"预期"其他操作系统会缩小一个大图标,但我还没有测试过它。

答案 2 :(得分:0)

嵌入图像(以及任何其他非类资源)的标准方法是将它们放在项目中的中,例如:如果您的项目正在使用com.myproject.myapp,那么创建一个包(实际上只是一个文件夹)images(在myapp下)并将图像文件放在那里。

使用ClassLoader方法getResource(name)和/或getResourceAsStream(name)获取对这些图像(资源)的访问。为简单起见,获取正确的 ClassLoader实例,许多人更喜欢在同一个包中创建一个类(例如“Images”),并在那里定义静态常量以按名称访问资源(就像Images.CONSTANT_NAME一样简单) )。项目结构可能如下所示:

com.myproject.myapp
    images
        Images.class
        MyImage1.png

在images类中,可以为资源 handle 或资源本身定义常量:

public final static URL MY_IMAGE_1 = Images.class.getResource("MyImage1.png");

(然后可以将URL传递给Toolkit)。如果对所有内容的热切负载是可取的/可行的,那么加载的图像本身就是:

public final static Image MY_IMAGE_1 = loadImage("MyImage1.png");

private static Image loadImage(String name) {
    URL url = Images.class.getClassLoader().getResource(name);
    Image img = Toolkit.getDefaultToolkit().getImage(url);
    // possible hack to force pre-loading of (toolkit) image in next line
    // new ImageIcon(img);
    return img;
}

显然我省略了示例中的所有错误处理,加载方法应该包括详细的错误处理和报告(logging / System.out和/或抛出适当的异常)。

这些方法既可以在IDE中使用,也可以在为程序创建jar文件后使用。