【问题标题】:Java Swing: Displaying images from within a JarJava Swing:显示 Jar 中的图像
【发布时间】:2010-09-07 01:32:36
【问题描述】:

从 Eclipse 运行 Java 应用程序时,我的 ImageIcon 显示得很好。

但是在创建一个 jar 之后,图像的路径显然被搞砸了。

有没有办法在运行时从 jar 中提取图像,然后我可以打开它?或者,有没有更好的方法来做到这一点?

如果可能,我想分发一个 jar 文件。

【问题讨论】:

  • “Tom Hawtin - tackline”的答案要好得多,只是出现的有点晚。请考虑更改您选择的答案。

标签: java swing embedded-resource imageicon


【解决方案1】:

要从加载代码的相同 jar 中的图像文件创建 ImageIcon

new javax.swing.ImageIcon(getClass().getResource("myimage.jpeg"))

Class.getResource 返回资源的 URL(或 null!)。 ImageIcon 有一个从 URL 加载的构造函数。

要为不在“类路径”上的 jar 中的资源构建 URL,请参阅java.net.JarURLConnection 的文档。

【讨论】:

  • 这个答案没有说明将图像文件放在 jar 中的哪个位置,这是棘手的部分。
【解决方案2】:

你可以试试这样的:

InputStream stream = this.getClass().getClassLoader().getResourceAsStream("/images/image.jpg");

在您的 JAR 文件中,您的目录结构可能为:

MyJAR.jar
- com(此处的类文件)
- 图片
----图片.jpg

【讨论】:

    【解决方案3】:

    这对我来说可以加载和设置内容窗格背景图像:

    jar(或构建路径)包含:

     - com
     - img
     ---- bg.png
    

    java 包含:

    JFrame f = new JFrame("Testing load resource from jar");
    try {
        BufferedImage bg = ImageIO.read(getClass().getResource("/img/bg.png"));
        f.setContentPane(new ImagePanel(bg));
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    在 jar 和 unjarred(这是技术术语)执行中测试和工作。

    顺便说一句 getClass().getClassLoader().getResourceAsStream("/img/bg.png") - 我首先尝试过 - 返回一个空 InputStream。

    【讨论】:

    • getResourceAsStream 返回 NPE 是否与 java 版本有关?我还通过 getResourceAsStream 获得了 NPE,但 getResource 工作得很好。
    【解决方案4】:

    在 netbeans 8.1 中,我所做的是在项目文件的 src 文件夹中包含名为 Resources 的图标和其他图像文件夹。因此,每当我构建 Jar 文件时,该文件夹都会包含在那里。文件树应该是这样的:

    • src(源包中的Java文件在这里)
    • ** 您在项目中指定的包**

      • file.java
    • 资源

      • 图片.jpg

    代码应该是这样的:

    jToggleButton1.setIcon(new javax.swing.ImageIcon(this.getClass().getResource("/resources/image.jpg")));
    

    【讨论】:

      【解决方案5】:

      在运行时从 Jar 文件中加载图像与从 IDE(例如 netbeans)执行时加载图像相同,不同之处在于从 JAR 文件中加载图像时路径必须正确且区分大小写 (很重要)。 这对我有用

      image1 = new javax.swing.ImageIcon(getClass().getResource("/Pictures/firstgame/habitat1.jpg")); img = image1.getImage().getScaledInstance(lblhabitat1.getWidth(), lblhabitat1.getHeight(), Image.SCALE_SMOOTH); lblhabitat1.setIcon(new ImageIcon(img));

      如果 "/Pictures/firstgame/habitat1.jpg" 中的 p 是小写的,它将无法工作。检查空格、大小写和拼写

      【讨论】:

      • 另一个可能的原因可能是图像的扩展。我注意到 getClass().getResource("/Pictures/firstgame/habitat1.jpg") 将在 IDE 中很好地显示和加载,即使您将图像保存为“habitat1.JPG”但不会从 jar 文件加载。您必须将小写的扩展名保存为“habitat1.jpg”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      • 2021-06-08
      • 2011-11-19
      相关资源
      最近更新 更多