我试图从Jar文件加载图像。这里的行:无法从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)
我使用的图标是绝对有效的。我使用图标工具检查了这一点。我也试着放置在同一个目录的图标为我的代码(不是瓶子-ING它),并使用它像这样:
Image imgTrayIcon = new Image(display, "icon.ico");
这一切正常,但是当我试图把它放在罐子,它没有。我似乎无法弄清楚为什么会发生这种情况。我已经解压缩了我的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
Hi Favonius。我想我找到了原因。它似乎与线程无关,等等。我的图标是一个多分辨率图标。我可以使用这个图标就好,如果我加载它直接加载它,但似乎从资源加载多分辨率图标会导致问题。你知道这件事吗?我用一个简单的图标文件来测试我的例子,该文件只有一个分辨率,并且工作得很好。这是我尝试使用的图标:http://findicons.com/icon/64852/download_box?id=345962。 –
看起来像SWT实施中的错误。即使InputStream stream = new FileInputStream(“icon.ico”);代码也会失败。附:问题出在多分辨率图标上。 **但是,当你执行'imgTrayIcon = new Image(display,“icon.ico”);'然后SWT调用一个本地方法......这又调用一个本地的win32 GDI + API。你可能希望寻找一个SWT错误...如果找不到,然后提出一个! – Favonius