Eclipse匯出的jar包無法顯示圖片?
阿新 • • 發佈:2018-10-31
在用java開發桌面應用程式時(雖然現在很少有人用),如果將專案匯出成jar包而專案中包含圖片等資源時,可能會無法正確載入這些資源。這主要是因為jar包是一個單獨的檔案而非資料夾,絕對不可能通過 “file:/e:/…/ResourceJar.jar/resource/123.jpg” 這種形式的檔案URL來定位 123.jpg 。所以即使是相對路徑,也無法定位到jar檔案內的圖片資源。解決方法有如下兩種。
將圖片資源分離出來(不打包)
如果你的專案結構圖是這樣的:
而程式碼是這樣寫的:
package com.xiaoli.tank;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.ImageIcon;
public class River {
int x,y;
ImageIcon river = new ImageIcon("images/river.gif");
public River(int x,int y){
this.x=x;
this.y=y;
}
public void draw(Graphics g){
g.drawImage(river.getImage(),x, y,null);
}
public Rectangle getRect() {
return new Rectangle(x, y,river.getIconWidth(),river.getIconHeight());
}
}
那麼將專案打包後的jar檔案和images檔案放在同一目錄下即可,如圖所示:
整體打包
很多時候放置兩個檔案很變扭,那麼我們可以將整個專案進行打包。在專案的 src
目錄下新建 package images
,將圖片資源放入 images
包下,如下圖所示:
這時候對應的程式碼應該寫為:
package com.xiaoli.tank;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.ImageIcon;
public class River {
int x,y;
ImageIcon river = new ImageIcon(this.getClass().getClassLoader().getResource("images/river.gif"));
public River(int x,int y){
this.x=x;
this.y=y;
}
public void draw(Graphics g){
g.drawImage(river.getImage(),x, y,null);
}
public Rectangle getRect() {
return new Rectangle(x, y,river.getIconWidth(),river.getIconHeight());
}
}
ClassLoader
是類載入器的抽象類。它可以在執行時動態的獲取載入類的執行資訊。可以這樣說,當我們呼叫jar包中的River
類時,JVM載入進River
類,並記錄下River
執行時資訊(包括River
所在jar包的路徑資訊)。而ClassLoader
類中的方法可以幫助我們動態的獲取這些資訊:
●public URL getResource(String name);
查詢具有給定名稱的資源。資源是可以通過類程式碼以與程式碼基無關的方式訪問的一些資料(影象、聲音、文字等)。並返回資源的URL物件。
●public InputStream getResourceAsStream(String name);
返回讀取指定資源的輸入流。這個方法很重要,可以直接獲得jar包中檔案的內容。ClassLoader
是abstract
的,不可能例項化物件,更加不可能通過ClassLoader
呼叫上面兩個方法。所以我們真正寫程式碼的時候,是通過Class
類中的getResource()
和getResourceAsStream()
方法,這兩個方法會委託ClassLoader
中的getResource()
和getResourceAsStream()
方法。