我有一个程序,在运行时会在系统托盘中显示一个图标。我使用以下代码在系统托盘区域中显示一个图标:
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文件所在的包在同一个包中。
我在这里做错了什么?
答案 0 :(得分:2)
图像位于我的java文件所在的同一个包中
如果你看一下Toolkit#getImage
的JavaDocs,你会发现它说...
返回从指定文件
获取像素数据的图像
这很重要。您还应该知道getImage
在背景线程中加载物理图像,这意味着如果它无法加载图像,它将默默地这样做...
好。核心问题是,一旦将图像放置在应用程序的上下文中(使用类文件),它就变成了通常所知的嵌入式资源。
无法通过任何需要访问文件系统上文件的方式加载这些资源。
相反,您需要使用Class#getResource
或Class#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
是存储图像的包名...