提问人:akbiggs 提问时间:11/3/2009 最后编辑:RivieraKidakbiggs 更新时间:5/11/2012 访问量:8870
图像在 .jar 文件中不起作用
Images will not work in a .jar file
问:
创建应用的JAR后,应用中的镜像将不再显示。我们用于加载图像的代码示例如下:
ImageIcon placeHolder = new ImageIcon("src\\Cards\\hidden.png");
我们不知道为什么会这样。如果我们不将应用程序压缩为 JAR,则应用程序将按预期运行;作为 JAR,图像会消失。我们还尝试使用 URL 而不是 ImageIcons,但这只会导致程序根本无法运行。
有什么想法吗?
编辑:我们将图像文件以正确的路径放入JAR文件中,所以这不是问题。
答:
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()
.至少是首选正斜杠。并且并不总是读取完整的缓冲区(例如,这样做)。read
DataInputStream.readFully
3赞
Eugene Ryzhikov
11/3/2009
有一种更简单的方法可以使用 getClass().getResource(“image.png”) 加载图像。这将返回文件系统或 jar 的正确 URL。这个 URL 可以以多种方式使用,包括新的 ImageIcon(url)
评论