2011-03-30 74 views
6

我想将图标设置为我的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

什么是你的JAR文件的结构,即在JAR文件到底在哪图像放在哪里? – 2011-03-30 10:53:11

回答

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文件。 (这对我来说似乎相当不可能......)

+1

jar tvf显示icon.jpg位于images/icon.jpg,但不是getClass()。getResource(“/ images/icon.jpg”)也不是getClass()。getResource(“images/icon.jpg”)doesn没有工作。但getClass()。getClassLoader()。getResource(“images/icon.jpg”)正常工作。 – maks 2011-03-30 14:45:48

+0

我有同样的问题,但我正在做一个主要的方法,所以“getClass()”不起作用。我应该放什么而不是那个?我试图创建一个主类的新实例,但是当我尝试它时,它给了我一个Exception。 – Ephraim 2011-07-24 20:33:34

+1

尝试'YourMainClass.class.getClassLoader()。getResource(resourePath)'。 – 2011-07-24 22:07:43

0

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

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

它无法在指定的位置找到这样的文件,但它在那里 – maks 2011-03-30 10:43:01

+0

嗯..可以尝试将图像文件移动到外部文件夹,但与src目录处于同一级别。像:“/resources/images/icon.jpg”? – jberg 2011-03-30 10:53:47

2

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

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

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

该地址的'/ src'前缀似乎是可疑的。许多应用。将提供单独的'src'和'build'目录,但通常结果是'src'前缀不在结果Jar中使用。我建议尝试..

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

&也三重检查该图像是在代码是希望找到它的Jar的位置。

3

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

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

对于这个工作,你应该从访问图像一个相对于某个固定类的目录。 例如,如果图像文件都在同一水平保存在目录中的“图像”作为Toolkit.class,然后

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

0

解决方法在这篇文章中解释here。只要看看!

干杯

0

您可以简单地创建的主要来源里面包,此包incluse图像。然后,只需调用图像在你的主类,如:

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

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