我想将图标设置为我的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());
答案 0 :(得分:3)
假设您的JAR文件有一个名为images
的顶级目录,您可以使用:
getClass().getResource("/images/icon.jpg")
或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")));