【问题标题】:System Tray image not loading java系统托盘图像未加载java
【发布时间】:2015-03-13 18:17:25
【问题描述】:

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

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() 中调用此方法时,我的系统托盘中有一些东西,但图标不见了。我认为图像无法加载。图像位于我的 java 文件所在的同一包中。

我在这里做错了什么?

【问题讨论】:

  • export.png 在源上下文中位于何处?考虑使用ImageIO.read 加载图像,当它无法加载它们时会抛出错误。更多详情请见Reading/Loading an Image
  • 图像与我的 java 文件在同一个包中。

标签: java


【解决方案1】:

图像在我的 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 是存储图片的包名...

【讨论】:

  • 我正在使用 Class#getResource 加载图像,但没有图像。查看我的编辑
  • 类和图像所在的包名是什么?
  • 而你只需要PongeeUtil.class.getResource
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多