我一直在努力让我的托盘图标添加,但它不起作用。我有一个存储在netbeans src / myproject /
中的图标文件我尝试了很多不同的路径,甚至是直接路径到我的文件,但似乎都没有。我很确定我的代码中的某些东西不起作用,我根本看不到它。
public void createSystemTrayIcon() {
if (SystemTray.isSupported()) {
SystemTray tray = SystemTray.getSystemTray();
Image img = Toolkit.getDefaultToolkit().getImage("smallicon.ico");
PopupMenu popup = new PopupMenu();
final MenuItem menuExit = new MenuItem("Quit");
MouseListener mouseListener =
new MouseListener() {
public void mouseClicked(MouseEvent e) {
show();
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
};
ActionListener exitListener =
new ActionListener() {
public void actionPerformed(ActionEvent e) {
Runtime r = Runtime.getRuntime();
System.out.println("Exiting...");
r.exit(0);
}
};
menuExit.addActionListener(exitListener);
popup.add(menuExit);
final TrayIcon trayIcon = new TrayIcon(img, "ESOLeaderboards", popup);
ActionListener actionListener =
new ActionListener() {
public void actionPerformed(ActionEvent e) {
trayIcon.displayMessage("ESOLeaderboards ","version: EU 1.0",
TrayIcon.MessageType.INFO);
}
};
trayIcon.setImageAutoSize(true);
trayIcon.addActionListener(actionListener);
trayIcon.addMouseListener(mouseListener);
try {
tray.add(trayIcon);
} catch (AWTException e) {
System.err.println("TrayIcon could not be added.");
}
} else {
// System Tray is not supported
}
}
答案 0 :(得分:1)
Toolkit.getDefaultToolkit().getImage("smallicon.ico");
仅支持JPG,PNG和GIF图片。
它不支持ico图像。使用另一张图片。
答案 1 :(得分:1)
在Windows 10中,我已经能够以这种方式在托盘中查看16像素的PNG:
final URL resource = getClass().getResource("icon16.png");
final TrayIcon trayIcon = new TrayIcon(Toolkit.getDefaultToolkit().getImage(resource), "Application v0.1 tooltip");
它"预期"其他操作系统会缩小一个大图标,但我还没有测试过它。
答案 2 :(得分:0)
嵌入图像(以及任何其他非类资源)的标准方法是将它们放在项目中的包中,例如:如果您的项目正在使用com.myproject.myapp
,那么创建一个包(实际上只是一个文件夹)images
(在myapp下)并将图像文件放在那里。
使用ClassLoader
方法getResource(name)和/或getResourceAsStream(name)获取对这些图像(资源)的访问。为简单起见,获取正确的 ClassLoader实例,许多人更喜欢在同一个包中创建一个类(例如“Images”),并在那里定义静态常量以按名称访问资源(就像Images.CONSTANT_NAME一样简单) )。项目结构可能如下所示:
com.myproject.myapp
images
Images.class
MyImage1.png
在images类中,可以为资源 handle 或资源本身定义常量:
public final static URL MY_IMAGE_1 = Images.class.getResource("MyImage1.png");
(然后可以将URL传递给Toolkit)。如果对所有内容的热切负载是可取的/可行的,那么加载的图像本身就是:
public final static Image MY_IMAGE_1 = loadImage("MyImage1.png");
private static Image loadImage(String name) {
URL url = Images.class.getClassLoader().getResource(name);
Image img = Toolkit.getDefaultToolkit().getImage(url);
// possible hack to force pre-loading of (toolkit) image in next line
// new ImageIcon(img);
return img;
}
显然我省略了示例中的所有错误处理,加载方法应该包括详细的错误处理和报告(logging / System.out和/或抛出适当的异常)。
这些方法既可以在IDE中使用,也可以在为程序创建jar文件后使用。