在Java中更改系统托盘图标

3
我想要为我的应用程序更改系统托盘图标。我做了两件事——
只需更改默认程序中的URL——
final TrayIcon trayIcon = new TrayIcon(createImage("images/Graph.png", "tray icon"));

第二次尝试 -
Image img = Toolkit.getDefaultToolkit().getImage("images/Graph.png");
final TrayIcon trayIcon = new TrayIcon(img, "Application Name", popup);

应用程序在两种情况下都启动,但没有显示图像。它只是一个空的占位符。我做错了什么?

原始程序能正常工作吗?你只是更改了图标的路径吗? - Rayf
原始程序中的灯泡可以工作。是的,我只是在第一次尝试中更改了图标的路径。 - Dan
你的路径似乎有问题。如果你正在使用灯泡示例,只需更改图标即可使其正常工作。是否缺少文件?尝试其他文件类型?大小写问题可能吗? - Rayf
3个回答

4

images/Graph.png 不是位于您的JAR文件中的有效图像URL。因此,我猜测在第二次调用时 img 是空的。

我建议您这样做:

//Get the URL with method class.getResource("/path/to/image.png")
URL url = System.class.getResource("/images/Graph.png");

//Use it to get the image
Image img = Toolkit.getDefaultToolkit().getImage(url);

final TrayIcon trayIcon = new TrayIcon(img, "Application Name", popup);

你还需确保 images/ 在你的类路径中。

你不需要使用JAR文件来启动应用程序,而且运行"java someClass"和"java -jar someJar.jar"的路径是不同的。 - Rayf
这个可以工作,但是没有将任何内容添加到类路径中。但是为什么第一次尝试没有成功呢? - Dan
1
@Dan,它是路径中的 /。 - Rayf
1
在我看来,这是一个路径问题。你可以尝试使用 new File(".").getAbsolutePath() 来了解搜索图像时的当前目录。使用我给出的方法,实际上是从类路径的根目录给出图像的路径。这就是为什么即使图像在 jar 包内部,它也能正常工作的原因。 - Arnaud Denoyelle

2
问题在于你包含图像文件的方式,因为图像位于你的 .jar 内部,所以请使用 getResource()getResourceAsStream(),尝试以下代码:
 try {
    InputStream inputStream= ClassLoader.getSystemClassLoader().getResourceAsStream("/images/Graph.png");
//or getResourceAsStream("/images/Graph.png"); also returns inputstream

  BufferedImage img = ImageIO.read(inputStream);
    final TrayIcon trayIcon = new TrayIcon(img, "Application Name", popup);
}
   catch (IOException e) {}

0

对我来说,下面的方法可行:

// URL: MyProject/src/MyGUI/check.png   
// Small icon on secondary taskbar
Image image= ImageIO.read(getClass().getResource("/MyGUI/check.png"));
trayIcon = new TrayIcon(image, "App name", popup);
trayIcon.setImageAutoSize(true);

结果

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接