【问题标题】:Java Swing: Runnable JAR file does not work when including imagesJava Swing:可运行的 JAR 文件在包含图像时不起作用
【发布时间】:2014-05-13 04:18:09
【问题描述】:

下面的代码在 Eclipse 中运行良好(两种图像处理可能性)。但是,当导出为 Runnable JAR 文件并双击 .JAR 时,没有任何反应。如果我注释掉代码的图像部分,.JAR 作为导出运行良好并且框架构建。所以看起来图像的获取导致 .JAR 失败。

我的草莓.jpg 文件位于“C:\Users\sean\workspace\myApps\bin\testing”中,您能否告知问题是否与我的代码有关?

(此处首先修改代码:Java Swing: unable to load image using getResource

package testing;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.io.IOException;
import java.io.InputStream;



public class IconTest {


public static void main(String[] arguments) throws IOException {

    JFrame frame1 = new JFrame();
    frame1.setTitle("Frame1");
    frame1.setSize(500, 500);
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    FlowLayout flo = new FlowLayout();
    frame1.setLayout(flo);

    //POSSIBILITY 1 TO HANDLE IMAGE
      InputStream resourceAsStream = IconTest.class.getResourceAsStream("strawberry.jpg");
    Image image = ImageIO.read(resourceAsStream);
    JLabel label1 = new JLabel(new ImageIcon(image));

    //POSSIBILITY 2 TO HANDLE IMAGE
/*    java.net.URL url= IconTest.class.getResource("strawberry.jpg");
    BufferedImage watermarkImage = ImageIO.read(url);
    JLabel label1 = new JLabel(new ImageIcon(watermarkImage));*/


    frame1.add(label1);
    frame1.setVisible(true);
}

}

【问题讨论】:

  • 如果您在不同的系统中执行,请提取jar并检查是否包含图像。
  • 一种可能性是您可以在将JLabel 包含为ImageIcon 之前检查if ( image != null ),如果它为空,您可以使用一些替代文本创建JLabel...跨度>
  • 应用程序需要的资源不应该存储在资源目录中吗?这可能需要在 Eclipse 中配置,而不是它的用户,但这种情况一直发生
  • 是的——我设法通过创建两个包来让它工作——一个用于资源,一个用于我的代码类。然后我在 Eclipse 中的资源包上单击右键 > 导入以获取图像。我的代码中唯一需要更改的是 ....getResourceAsStream("/resources/strawberry.jpg");

标签: java eclipse swing jar embedded-resource


【解决方案1】:

把图片放在你有源文件的地方,因为它指向源目录

InputStream resourceAsStream = IconTest.class.getResourceAsStream("strawberry.jpg");

然后生成可运行的jar文件,然后右键单击该jar并作为java平台二进制运行

【讨论】:

  • 我可能是错的,但我不喜欢 eclipse 喜欢 arc 目录中的资源并且不包含 src 目录中的文件,我认为它们需要在资源目录中
【解决方案2】:

处理图像的可能性 3:

您可以检查您正在获取的资源是否存在。找不到它的资源,那么您也可以使用替代文本创建 JLabel...

JLabel label1 ;
URL imageUrl = IconTest.class.getClassLoader().getResource("strawberry.jpg");
if ( imageUrl != null ) {
    label1 = new JLabel(new ImageIcon(imageUrl));
} else {
    label1 = new JLabel("Alternative text");
}

【讨论】:

  • ImageIO 可以直接到 URL,不需要加载流,你没有关闭...
  • @Krishan - 这很有帮助 - 谢谢。我设法通过在一个新项目中创建两个包来让它工作——一个用于资源,一个用于我的代码类。然后我在 Eclipse 中的资源包上单击右键 > 导入以获取图像。我的代码中唯一需要更改的是 ....getResourceAsStream("/resources/strawberry.jpg");
【解决方案3】:

关注Maven standard directory layout 可能会有所帮助:

【讨论】:

  • 感谢 RC - 确实有帮助。
【解决方案4】:
InputStream resourceAsStream = IconTest.class.getResourceAsStream("/strawberry.jpg")

它应该从“/”开始。还要检查罐子里是否真的有图像。直接解压看看图片是不是真的加进去了。

【讨论】:

    【解决方案5】:

    此处提供的解决问题的指导帮助很大 - 感谢大家。我测试了一个导出的 JAR 的内容;我使用 Kishan 建议的诊断代码来确定我的代码是否可以“看到”图像。如果我在文件系统中移动图像而不是 Eclipse 导入功能,我相信这可能与 Eclipse 的工作/刷新方式有关。 最后,为了让它工作,我做了以下更改: 我创建了一个新项目和两个子包——一个用于“资源”,一个用于我的代码类。然后我在 Eclipse 中的资源包上单击右键 > 导入以获取图像。

    我的代码中唯一需要更改的是 ....getResourceAsStream("/resources/strawberry.jpg");

    【讨论】:

      猜你喜欢
      • 2014-03-26
      • 1970-01-01
      • 2011-02-25
      • 2013-06-03
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      • 2013-06-08
      相关资源
      最近更新 更多