我有一个程序,运行时会在系统托盘中显示一个图标。我正在使用以下代码在系统托盘区域中显示图标:
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#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
是存储图像的包名称...
关于java - 系统托盘图像未加载java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29026776/