【问题标题】:images not showing up when running JAR运行 JAR 时不显示图像
【发布时间】:2015-07-27 13:21:02
【问题描述】:

我已经花了 5 个小时,不知道为什么运行 Jar 时没有加载图像。

项目结构:

Blackjack_Game
 - Source Packages
   - Images
   - blackjack
        .... classes...

在项目属性中,我默认添加了 src - Source Packages 文件夹。试图将图像直接放入项目的文件夹并删除 /Images/,但仍然没有帮助。

在我拥有的代码中:

dealer_url = getClass().getResource("/Images/4_of_hearts.jpg");
File img = new File(dealerCardGenerator.dealer_url.getPath());
BufferedImage bufferedImage = ImageIO.read(img);
dealerCardGenerator.imageIcon = new ImageIcon(bufferedImage);

所以在 NetBeans IDE 中一切正常。全力工作。但是在构建和清理之后,我看不到任何图像,但所有操作都已完成。

您能否提出问题所在?因为这个而生气((((

【问题讨论】:

  • jar 是 zip,所以请检查其中的路径。特别是它必须区分大小写,Windows 不区分大小写,所以它可能会在 IDE 中解压运行。
  • JAR 中的文件名区分大小写"/Images/4_of_hearts.jpg" 是一个不同的文件,例如"/Images/4_of_hearts.JPG"
  • 如前所述,请务必检查是否区分大小写。还要确保将文件放在正确的子文件夹中。我大二的时候也有同样的任务,这是我遇到的一个问题。
  • 感谢您的回复。JAR 中的Images 文件夹的路径位于根目录:所以用winrar 打开JAR 会显示3 个文件夹:blackjack_game、Images、META_INF。我还检查了所有文件名,一切似乎都是正确的。

标签: java image jar embedded-resource


【解决方案1】:

jar 条目不是文件。 java.io.File 只能识别文件,不能识别 jar 条目。 java.net.URL 但是可以使用jar: 方案识别jar 条目,使用file: 方案识别文件。这就是 Class.getResource() 返回 URL 而不是 File 的原因。

两种解决方案:

  • 使用URLImageIO.read(getClass().getResource("whatever"))

  • ImageIO 也可以使用已经打开的流,类加载器可以提供: ImageIO.read(getClass().getResourceAsStream("whatever"))

至少有 #2-4 个问题被自动建议为相关:

【讨论】:

  • 所以我是否正确,您建议更换例如Dealer_url = getClass().getResource("/Images/7_of_clubs.jpg");使用 ImageIO.read 之类的东西.....我会试一试,但真的不明白为什么这在 IDE 中有效,但在可执行 JAR 中无效
  • “真的不明白为什么这在 IDE 中有效,但在可执行 JAR 中无效” 在 IDE 中,资源可用File,一旦在罐子里,它就不是了。或者,从我的“复制/粘贴评论”中......应用程序资源将在部署时成为嵌入式资源,因此明智的做法是立即开始访问它们。 embedded-resource 必须通过 URL 而不是文件访问。请参阅info. page for embedded resource 了解如何形成 URL。
  • .. 但基本上,@dave_thompson_085 已经完全搞定了。注意:我总是通过原始InputStream 获取 URL。此处可能不相关,但某些 API 需要可重新定位的输入流,而 getResourceAsStream(..) 方法通常会返回不可重新定位的流。它可以通过将输入流包装在缓冲的输入流中来解决,但是直接使用 URL,我们不需要担心它。另一个因素是(例如)Java 的图像加载能力会缓存来自 URL 的资源,但不能对原始流执行此操作。
【解决方案2】:

感谢大家澄清问题。我已经意识到为什么某些功能不起作用。

所以解决办法是用ImageIcon替换URL:

ImageIcon i2 = new javax.swing.ImageIcon(getClass().getResource("whatever"));

然后将图标设置为标签图标:

jLabel1.setIcon(i2);

JAR 以这种方式工作。之前这个图标设置操作后的所有方法都不起作用,因为程序实际上已经停止了,现在一切正常。

【讨论】:

    猜你喜欢
    • 2014-03-26
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 2012-03-01
    • 1970-01-01
    相关资源
    最近更新 更多