我正在尝试从一个Jar文件中加载图片。这是代码行:
Image imgTrayIcon = new Image(display, this.getClass().getResourceAsStream("icon.ico"));
我看过很多使用这种方法的例子,但是当我尝试这么做时,会收到一个错误,说我的图像无效。以下是堆栈跟踪:
[java] Exception in thread "Thread-0" org.eclipse.swt.SWTException: Invalid image
[java] at org.eclipse.swt.SWT.error(SWT.java:4083)
[java] at org.eclipse.swt.SWT.error(SWT.java:3998)
[java] at org.eclipse.swt.SWT.error(SWT.java:3969)
[java] at org.eclipse.swt.internal.image.WinICOFileFormat.loadInfoHeader(WinICOFileFormat.java:200)
[java] at org.eclipse.swt.internal.image.WinICOFileFormat.loadIcon(WinICOFileFormat.java:127)
[java] at org.eclipse.swt.internal.image.WinICOFileFormat.loadFromByteStream(WinICOFileFormat.java:119)
[java] at org.eclipse.swt.internal.image.FileFormat.loadFromStream(FileFormat.java:48)
[java] at org.eclipse.swt.internal.image.FileFormat.load(FileFormat.java:84)
[java] at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:130)
[java] at org.eclipse.swt.graphics.ImageDataLoader.load(ImageDataLoader.java:22)
[java] at org.eclipse.swt.graphics.ImageData.<init>(ImageData.java:331)
[java] at org.eclipse.swt.graphics.Image.<init>(Image.java:545)
[java] at SysTray.run(Unknown Source)
我正在使用的图标是有效的。我已经使用图标工具进行了检查。我还尝试将图标放在与我的代码相同的目录中(而不是将其打包成Jar文件),并像这样使用它:
Image imgTrayIcon = new Image(display, "icon.ico");
这段代码在正常情况下可以正常工作,但是当我尝试将其放入Jar文件时,却无法运行。我不知道为什么会出现这种情况。我已经解压了我的Jar文件,以检查文件是否已添加到Jar文件中,看起来它确实存在。我的Jar文件没有任何复杂的文件夹结构,所有的文件和资源都在同一层级的树中。
有什么想法吗?谢谢!
以下是用于重现此问题的示例代码:
Example.java
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.graphics.*;
class Example {
public static void main(String[] args) {
Display display = Display.getDefault();
Image imgTrayIcon = new Image(display, Example.class.getClassLoader().getResourceAsStream("icon.ico"));
}
}
命令:
javac -cp "SWT.jar" Example.java
jar cf Example.jar *.class *.ico
java -cp "Example.jar;SWT.jar" Example