2011-03-30 82 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")));