将图像添加到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()); 

查看URLImageSource的源代码,看来getConnection抛出NPE的原因是它的url为null 。 这让我怀疑

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

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

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

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


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

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

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

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

您也可能会发现这个讨论有点用处。

假设您可以导入javax.imageio.ImageIO,这应该这样做:

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

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

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

并且三重检查图像是否在代码期望找到它的Jar的位置。

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

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

这篇文章解释了解决方案。 看看吧!

干杯

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

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

 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")));