java - 系统托盘图像未加载java

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

我在这里做错了什么?

最佳答案

image is in the same package where my java files are

如果您查看 Toolkit#getImage 的 JavaDocs你会发现它说...

Returns an image which gets pixel data from the specified file

这很重要。您还应该知道 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 是存储图像的包名称...

关于java - 系统托盘图像未加载java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29026776/

相关文章:

Java双链表,交换节点

Java 泛型类型参数 Project 不在类型变量 E 的范围内

java - PKIX 路径构建失败,但证书在 cacerts 中

java - 使用 Gson lib 将 Json 转换为 Java 对象

java - 如何在 concurrentHashMap 中突破 foreach

java - 这种取消/中止异步 servlet 处理的方法存在任何问题

java - 如何在Java配置中正确定义Spring Integration JpaOutboundGateway?

java - 使用 Spark(Soot -Eclipse 框架)生成调用图 - 内存问题

java - 如何识别单击了哪个按钮并更改图片?

java - ClassNotFoundException : org. hibernate .bytecode.instrumentation.internal.FieldInterceptionHelper