Java 无法从Jar加载图像
我正在尝试从Jar文件加载图像。这是一句话:Java 无法从Jar加载图像,java,image,jar,swt,Java,Image,Jar,Swt,我正在尝试从Jar文件加载图像。这是一句话: Image imgTrayIcon = new Image(display, this.getClass().getResourceAsStream("icon.ico")); 我见过很多使用这种方法的例子,但当我尝试这样做时,我得到一个错误,说我的图像无效。以下是堆栈跟踪: [java] Exception in thread "Thread-0" org.eclipse.swt.SWTException: Invalid image [ja
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,以检查文件是否被添加到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
通常,您可以通过以下方式检索InputStream:
InputStream is = this.getClass().getClassLoader() .getResourceAsStream("yourpackage/mypackage/myfile.xml");
它将在罐子内部或外部运行
提及
另请参考以下内容
this.getClass().getClassLoader().getResourceAsStream(“icon.ico”)
或
this.getClass().getClassLoader().getResourceAsStream(“包\或\完整\路径\到\图像/icon.ico”
)
或
Name\u这个类。CLASS.getClassLoader().getResourceAsStream(“icon.ico”)
看起来您正在处理多线程应用程序。
从线程“thread-0”org.eclipse.swt.swt异常:无效图像的堆栈跟踪中,似乎您正在非ui线程中加载图像,并试图在某些ui元素中使用该图像
在UI线程中,下面的代码可以正常工作。(图标文件位于测试包中
)
您是否尝试过将该文件与类文件放在同一目录中,而不使用jar,并使用getResourceAsStream()
加载它
您是否尝试过在Jar内部和外部使用while获取流的校验和,以查看文件在这两个环境之间是否存在任何差异
它似乎不起作用。如果我尝试加载一个图像图标
,它会工作,也就是说,我看不到任何错误。我有一个SWT应用程序,不使用Swing小部件。它只是一个重要的例子,是指定getClass()的方法。getResource(“yourpackage/mypackage/image.gif”)是的,我理解这一点,但我的Jar中没有任何包结构。所有文件都在同一级别上,因此我是这样引用它的:this.getClass().getClassLoader().getResourceAsStream(“icon.ico”)代码>。我已经通过运行jartf
检查了Jar中是否存在该文件。尽管如此,我还是遇到了同样的错误。我在帖子中添加了一些示例代码来说明我正在做什么。尝试在映像名称之前添加jar应用程序名称,因为我已经创建了sampleapplication,并通过插入一个映像创建了jar。映像的文件夹结构是sampleapplication/myimage.icoHi Favonius。我想我找到了原因。它似乎与线程等无关。我的图标是一个多分辨率图标。如果直接加载,我可以很好地使用这个图标,但是从参考资料中加载多分辨率图标似乎会导致问题。你知道这件事吗?我使用一个简单的图标文件尝试了我的示例,该文件只有一个分辨率,效果很好。这是我试图使用的图标:。似乎是SWT实现中的一个bug。即使InputStream=newfileinputstream(“icon.ico”)代码>。另外,问题在于多分辨率图标。但当您执行imgTrayIcon=新图像(显示“icon.ico”)代码>然后SWT调用本机方法。。。它反过来调用本机win32 GDI+API。您可能希望查找SWT错误。。。如果找不到,那就挑一个!!
ImageIcon image = (new ImageIcon(getClass().getResource("yourpackage/mypackage/image.gif")));
InputStream is = this.getClass().getClassLoader() .getResourceAsStream("yourpackage/mypackage/myfile.xml");
package test;
import java.io.InputStream;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class IconTest
{
public static void main(String[] args)
{
final Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
shell.setSize(200, 200);
shell.setLocation(20, 20);
InputStream stream = IconTest.class.getResourceAsStream("/test/icon.ico");
Image imgTrayIcon = new Image(display, stream);
shell.setImage(imgTrayIcon);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
if(imgTrayIcon != null)
imgTrayIcon.dispose();
display.dispose();
}
}