JavaSwing:在Jar中显示图像

JavaSwing:在Jar中显示图像,java,swing,embedded-resource,imageicon,Java,Swing,Embedded Resource,Imageicon,从eclipse运行Java应用程序时,我的ImageIcon显示得很好 但是在创建了一个jar之后,图像的路径显然被搞砸了 有没有办法在运行时从jar中提取一个图像,这样我就可以打开它?或者,有没有更好的方法 如果可能的话,我想分发一个jar文件。您可以尝试以下方法: InputStream stream = this.getClass().getClassLoader().getResourceAsStream("/images/image.jpg"); 在JAR文件中,您的目录结构可能为

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

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

有没有办法在运行时从jar中提取一个图像,这样我就可以打开它?或者,有没有更好的方法


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

您可以尝试以下方法:

InputStream stream = this.getClass().getClassLoader().getResourceAsStream("/images/image.jpg");
在JAR文件中,您的目录结构可能为:

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


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

new javax.swing.ImageIcon(getClass().getResource("myimage.jpeg"))
Class.getResource
返回资源的URL(或
null
!)
ImageIcon
具有从URL加载的构造函数


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

的文档,这对我来说是加载和设置内容窗格背景图像的有效方法:

jar(或构建路径)包含:

 - com
 - img
 ---- bg.png
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();
}
java包含:

 - com
 - img
 ---- bg.png
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和uncarred(这是技术术语)执行中测试和工作


顺便说一句,getClass().getClassLoader().getResourceAsStream(“/img/bg.png”)-我首先尝试了它-返回了一个空的InputStream。

在运行时从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)); image1=newjavax.swing.ImageIcon(getClass().getResource(“/Pictures/firstgame/habitat1.jpg”); img=image1.getImage().getScaledInstance(lblhabitat1.getWidth(),lblhabitat1.getHeight(),Image.SCALE\u平滑); lblhabitat1.setIcon(新图像图标(img));
如果“/Pictures/firstgame/habitat1.jpg”中的p是小写,则它将不起作用。检查netbeans 8.1中的空格、大小写和拼写我所做的是在项目文件的src文件夹中包含图标文件夹和其他名为Resources的图像。因此,每当我构建Jar文件时,文件夹都包含在其中。文件树应该如下所示:

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

    • file.java
  • 资源

    • image.jpg
代码应该如下所示:

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

“汤姆·霍丁-铲球线”的答案要好得多,只是出现得有点晚。请考虑更改您选择的答案。GETRealSu水流返回NPE与java版本有什么关系吗?我还通过getResourceAsStream获得了NPE,但是getResource工作得非常好。另一个可能的原因可能是图像的扩展。我注意到getClass().getResource(“/Pictures/firstgame/habitat1.jpg”)可以从IDE中很好地显示和加载,即使您将图像保存为“habitat1.jpg”,但不会从jar文件加载。您必须将扩展名以小写形式保存为“habitat1.jpg”。这个答案没有说明将图像文件放在jar中的什么位置,这是一个棘手的部分。