系统托盘图像无法加载java

时间:2015-03-13 07:19:27

标签: java

我有一个程序,在运行时会在系统托盘中显示一个图标。我使用以下代码在系统托盘区域中显示一个图标:

public static void showTrayIcon() {
        if (java.awt.SystemTray.isSupported()) {
            st = java.awt.SystemTray.getSystemTray();

             image = Toolkit.getDefaultToolkit().getImage(PongeeUtil.class.getClass().getResource("export.png"));



            ActionListener listener = new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(null, "Hello");
                }
            };

            PopupMenu popup = new PopupMenu();

            MenuItem defaultItem = new MenuItem("sdf");
            defaultItem.addActionListener(listener);
            popup.add(defaultItem);

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

            trayIcon.addActionListener(listener);
            try {
                st.add(trayIcon);

            } catch (AWTException e) {
                System.err.println(e);
            }
        } 
    }

当我在main()中调用此方法时,我的系统托盘中出现了一些内容,但图标丢失了。我认为图像无法加载。 image与我的java文件所在的包在同一个包中。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

  

图像位于我的java文件所在的同一个包中

如果你看一下Toolkit#getImage的JavaDocs,你会发现它说...

  

返回从指定文件

获取像素数据的图像

这很重要。您还应该知道getImage在背景线程中加载物理图像,这意味着如果它无法加载图像,它将默默地这样做...

好。核心问题是,一旦将图像放置在应用程序的上下文中(使用类文件),它就变成了通常所知的嵌入式资源。

无法通过任何需要访问文件系统上文件的方式加载这些资源。

相反,您需要使用Class#getResourceClass#getResourceAsStream来加载它们,例如

image = Toolkit.getDefaultToolkit().getImage(YourClass.class.getResource("/package/path/to/classes/export.png"));

或者更优先......

BufferedImage img = ImageIO.read(YourClass.class.getResource("/package/path/to/classes/export.png"));
image = new ImageIcon(img);

ImageIO因某种原因无法加载图片时会抛出IOException,这样可以提供更多诊断信息来解决问题

注意:

  • YourClass是您的类,其中包含showTrayIcon方法...
  • /package/path/to/classes是存储图像的包名...