2010-03-06 66 views
10

我有一個帶有工具欄的Java項目,工具欄上有圖標。這些圖標存儲在名爲resources /的文件夾中,因此例如路徑可能爲「resources/icon1.png」。此文件夾位於我的src目錄中,因此編譯時將該文件夾複製到bin中。我正在使用以下代碼來訪問資源。如何訪問JAR文件中的資源?

protected AbstractButton makeToolbarButton(String imageName, String actionCommand, String toolTipText, 
     String altText, boolean toggleButton) { 

    String imgLocation = imageName; 
    InputStream imageStream = getClass().getResourceAsStream(imgLocation); 

    AbstractButton button; 
    if (toggleButton) 
     button = new JToggleButton(); 
    else 
     button = new JButton(); 

    button.setActionCommand(actionCommand); 
    button.setToolTipText(toolTipText); 
    button.addActionListener(listenerClass); 

    if (imageStream != null) { // image found 
     try { 
      byte abyte0[] = new byte[imageStream.available()]; 
      imageStream.read(abyte0); 

      (button).setIcon(new ImageIcon(Toolkit.getDefaultToolkit().createImage(abyte0))); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       imageStream.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } else { // no image found 
     (button).setText(altText); 
     System.err.println("Resource not found: " + imgLocation); 
    } 

    return button; 
} 

(imageName將是「resources/icon1.png」等)。這在Eclipse中運行時工作正常。但是,當我從Eclipse中導出可運行的JAR時,找不到圖標。

我打開了JAR文件,資源文件夾就在那裏。我試過了所有的東西,移動文件夾,改變JAR文件等,但我無法看到圖標。

有誰知道我在做什麼錯? (作爲一個側面的問題,是否有任何文件監視器可以與JAR文件一起工作?當出現路徑問題時,我通常只需打開FileMon以查看正在發生的事情,但在本例中它只是顯示爲訪問JAR文件)

謝謝。

+1

所以5行代碼加載圖標比較好,然後是2行代碼?當然要找出使用2行代碼的祕密,你實際上必須自己做一些閱讀。我猜這個祕密會隱藏起來。 – camickr 2010-03-06 22:55:02

回答

5

要從JAR資源利用加載圖像下面的代碼:

Toolkit tk = Toolkit.getDefaultToolkit(); 
URL url = getClass().getResource("path/to/img.png"); 
Image img = tk.createImage(url); 
tk.prepareImage(img, -1, -1, null); 
+0

Toolkit包含哪些內容? – tomasb 2012-08-07 10:02:29

+0

@tomasb java.awt.Toolkit – Christian 2012-08-16 16:17:16

10

我看到兩個問題與您的代碼:

getClass().getResourceAsStream(imgLocation); 

這假設圖像文件在同一文件夾中的類此代碼是從,而不是在一個單獨的資源文件夾的.class文件。試試這個:

getClass().getClassLoader().getResourceAsStream("resources/"+imgLocation); 

另一個問題:

byte abyte0[] = new byte[imageStream.available()]; 

InputStream.available()返回流中的字節總數的方法!它返回無阻塞的可用字節數,通常少得多。

您必須編寫一個循環才能將字節複製到臨時ByteArrayOutputStream,直到到達流的末尾。或者,使用帶有URL參數的getResource()createImage()方法。

4

來自How to Use Icons的Swing教程的部分向您展示瞭如何創建URL並在兩條語句中讀取圖標。

0

例如,在NetBeans項目,建立src文件夾中的資源文件夾。把你的圖像(jpg,...)放在那裏。

無論您使用的ImageIO或工具包(包括的getResource),你必須包括前/在你的路徑映像文件:

Image image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/resources/agfa_icon.jpg")); 
setIconImage(image); 

如果此代碼是你的JFrame類裏面,圖像被添加到該框架作爲標題欄中的圖標。