将图像添加到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
的顶级目录,您可以使用以下任一方法:
-
getClass().getResource("/images/icon.jpg")
或 -
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")));