【问题标题】:Images will not work in a .jar file图像在 .jar 文件中不起作用
【发布时间】:2010-12-12 08:55:06
【问题描述】:

创建应用程序的 JAR 后,应用程序中的图像不再出现。我们加载图像的代码示例如下:

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

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

有什么想法吗?

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

【问题讨论】:

标签: java image swing jar


【解决方案1】:

您应该像这样从类路径加载资源:

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

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

还有getting the resource as a URL的方法。

【讨论】:

  • 来自您链接到的 javadoc:“资源的名称是一个 '/' 分隔的路径名,用于标识资源。”您可能需要更正示例中的路径,该路径使用反斜杠:-)
【解决方案2】:

检查您正在调用的 constructor 的 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);

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

【讨论】:

  • MyClass.class.getClassLoader()。正斜杠至少是首选。而read 并不总是读取完整的缓冲区(例如,DataInputStream.readFully 就是这样做的)。
  • 有一种更简单的方法可以使用 getClass().getResource("image.png") 来加载图像。这将为文件系统或 jar 返回正确的 URL。然后可以通过多种方式使用此 URL,包括 new ImageIcon(url)
【解决方案3】:

问题:jar中是否存在文件夹src

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

回答:你引用资源的方式不正确,你应该改用getClass().getClassLoader().getResource("Cards/hidden.png")之类的东西。

【讨论】:

  • 因为您将其修改为相对磁盘文件系统路径,而不是作为类路径资源。
猜你喜欢
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 2017-08-01
  • 1970-01-01
相关资源
最近更新 更多