将图像添加到jar中

时间:2011-03-30 10:21:48

标签: java jar

我想将图标设置为我的JFrame。我做了以下事情:

Image icon = Toolkit.getDefaultToolkit().getImage("src/images/icon.jpg");
this.setIconImage(icon);

当我从netbeans运行此代码时它工作正常,但是当我尝试从jar文件运行此代码时,图像不会显示在我的JFrame中。我试图将图像作为资源加载:

this.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/src/images/icon.jpg")));

但是当我运行此代码时,它会失败并显示NullPointerException

 Uncaught error fetching image:
java.lang.NullPointerException
        at sun.awt.image.URLImageSource.getConnection(URLImageSource.java:99)
        at sun.awt.image.URLImageSource.getDecoder(URLImageSource.java:113)
        at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:240)
        at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
        at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)

我该怎么做才能做到这一点?

修改 谢谢大家, 通过将图像指定为

来解决问题
Toolkit.getDefaultToolkit().getImage(getClass().getClassLoader().getResource("images/icon.JPG"))

至于它看起来很奇怪,如果它像

那样会更好
this.setIconImage(new ImageIcon(pathToIcon).getImage());

8 个答案:

答案 0 :(得分:3)

假设您的JAR文件有一个名为images的顶级目录,您可以使用:

  1. getClass().getResource("/images/icon.jpg")
  2. getClass().getClassLoader().getResource("images/icon.jpg")

答案 1 :(得分:3)

查看URLImageSource的源代码,看来getConnection抛出NPE的原因是它有一个null的url。这导致我怀疑

getClass().getResource("/src/images/icon.jpg")

正在返回null。如果找不到具有该路径名的资源,它就会这样做。

我敢打赌,问题是你的路径错了。

要证明/反驳这一点,您应该在JAR文件上运行jar tvf,并查找与"icon.jpg"匹配的行。相应的路径名是否与您使用的路径名相同?如果没有,请使用getResource调用中匹配行的路径名,它应该有效。或者,如果文件根本没有显示,请查看NetBeans构建配置,告诉它将什么放入JAR文件中。 (我不是NetBeans用户,所以我不能说你需要在哪里看......)


如果这导致你无处可去,另一种可能性是getClass().getResource(...)正在使用不知道包含图像的JAR文件的类加载器。 (这对我来说似乎很不可能......)

答案 2 :(得分:2)

getResource()从类路径加载资源,而不是OS路径,并且在编译之后,您的类路径将不包含/src文件夹,而只包含其内容。所以你最好试试/images/icon.jpg

另外,您可能会发现this discussion有点用处。

答案 3 :(得分:0)

这应该是假设您可以导入javax.imageio.ImageIO:

Image icon = ImageIO.read(this.getClass().getResource("/src/images/icon.jpg"));
this.setIconImage(icon);

答案 4 :(得分:0)

.."/src/images/icon.jpg"..  

地址的'/ src'前缀似乎很可疑。很多应用。将提供单独的'src'和'build'目录,但通常最终会在生成的Jar中使用'src'前缀。我建议尝试..

.."/images/icon.jpg".. 

&安培;也三重检查图像是否在代码期望找到它的Jar的位置。

答案 5 :(得分:0)

为此,您应该从相对于某个固定类的目录访问图像。 例如,如果图像文件保存在与Toolkit.class相同级别的“图像”目录中,则

this.setIconImage(Toolkit.getDefaultToolkit().getImage(Toolkit.class.getResource("images/icon.jpg"))); 应该管用。

答案 6 :(得分:0)

您只需在主源中创建一个包,并将图像包含在此包中。然后,只需调用主类中的图像,如:

ImageIcon a = new ImageIcon(MainClass.class.getResource("/Package/Image.jpg"));

答案 7 :(得分:0)

JFrame f = new JFrame("Edit Configure File");
//Image image = ImageIO.read(getClass().getResource("images/ctx.Icon"));
f.setIconImage(new ImageIcon("images/ctx.PNG").getImage());//this works for me finally
//f.setIconImage(image);
//f.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/ctx.PNG")));