图像在 .jar 文件中不起作用

Images will not work in a .jar file

提问人:akbiggs 提问时间:11/3/2009 最后编辑:RivieraKidakbiggs 更新时间:5/11/2012 访问量:8870

问:

创建应用的JAR后,应用中的镜像将不再显示。我们用于加载图像的代码示例如下:

ImageIcon placeHolder = new ImageIcon("src\\Cards\\hidden.png");

我们不知道为什么会这样。如果我们不将应用程序压缩为 JAR,则应用程序将按预期运行;作为 JAR,图像会消失。我们还尝试使用 URL 而不是 ImageIcons,但这只会导致程序根本无法运行。

有什么想法吗?

编辑:我们将图像文件以正确的路径放入JAR文件中,所以这不是问题。

Java 图像 Swing Jar

评论

0赞 Anthony Forloney 11/3/2009
图像的位置是否相对于 .jar 文件的位置正确设置?
1赞 jjnguy 11/3/2009
stackoverflow.com/questions/31127/......

答:

2赞 matt b 11/3/2009 #1

您应该从类路径加载资源,如下所示:

 InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("Cards/hidden.png")

当然,这假设您在创建 JAR 时,实际上是将图像文件放入其中。

还有一种方法可以将资源作为 URL 获取

评论

0赞 Grundlefleck 11/3/2009
从您链接到的 javadoc 中:“资源的名称是标识资源的 '/' 分隔路径名。您可能需要更正示例中的路径,该路径使用反斜杠 :-)
1赞 Esko 11/3/2009 #2

:jar 中是否存在该文件夹?src

提示:您可以使用任何支持ZIP的解压程序打开.jar以查看其内容。

:你引用资源的方式不正确,你应该做类似的事情。getClass().getClassLoader().getResource("Cards/hidden.png")

评论

1赞 BalusC 11/3/2009
因为您将其修改为相对磁盘文件系统路径,而不是类路径资源。
7赞 Andrzej Doyle 11/3/2009 #3

检查要调用的构造函数的 API。传入的字符串是文件路径 - 当资源打包在 JAR 中时,文件系统上没有包含映像的文件,因此您不能再使用此构造函数。

相反,您需要使用类加载器从流中加载资源,并将它们拉入字节数组:

byte[] buffer = new byte[IMAGE_MAX_SIZE];
InputStream imageStream = getClassLoader().getResourceAsStream("src\Cards\hidden.png");
imageStream.read(buffer, 0, IMAGE_MAX_SIZE);
ImageIcon placeHolder = new ImageIcon(buffer);

当然,需要更多的异常和边缘情况处理,但这就是它的要点。

评论

1赞 Tom Hawtin - tackline 11/3/2009
MyClass.class.getClassLoader().至少是首选正斜杠。并且并不总是读取完整的缓冲区(例如,这样做)。readDataInputStream.readFully
3赞 Eugene Ryzhikov 11/3/2009
有一种更简单的方法可以使用 getClass().getResource(“image.png”) 加载图像。这将返回文件系统或 jar 的正确 URL。这个 URL 可以以多种方式使用,包括新的 ImageIcon(url)