2012-10-02 64 views
1

好的,所以我創建了一個緩衝圖像以顯示在JLabel上。當我顯示文件位置時,它需要在我想要訪問的文件夾前面有一個src /,否則會出現錯誤,並且我不會看到緩衝圖像...我知道如果將'src /'在resImg之前,BufferedImage不會顯示在IDE之外。誰能幫忙? 這是在IDE內部工作的代碼。從.jar文件向外運行時,圖像不顯示。爲什麼我的BufferedImage不會顯示在.jar文件中?

static File f = new File("src/resImg/banner.png"); 

try { 
     banner = ImageIO.read(f); 
     picLabel = new JLabel(new ImageIcon(banner)); 
     LabelPanel.add(picLabel); 
    } catch (IOException ex) { 
     Logger.getLogger(GameStart.class.getName()).log(Level.SEVERE, null, ex); 
    } 
+2

您只能引用文件系統上的「文件」。對於那些在罐子裏,你應該把它們當作資源。 –

回答

2

當資源在jar文件中時,它不是本地文件系統上的文件。您應該使用

URL imageSource = getClass().getResource("/resImg/banner.png"); 
if (imageSource == null) { 
    // Handle the resource being missing 
} 
picLabel = new JLabel(new ImageIcon(imageSource)); 

在這裏,我們從類加載器,這顯然會有權訪問文件的jar文件獲取的資源。

+0

如果我處於靜態方法,該怎麼辦?我將如何繼續?它是說getClass()是一種非靜態方法。 – Notchos

1

如果你想從罐子獲得圖像,使用水木清華這樣的:

URL imageurl = getClass().getResource("/images/imagename"); 
0

最有可能的原因是,你的形象是不是打包的jar文件內(以JAR/zip工具驗證這一點)。

如果圖像是有,但不顯示,那是因爲你試圖從相對文件系統讀取該工作目錄(它肯定是不存在)

所以,正確的解決辦法是將讀取圖像類路徑:

Thread.currentThread().getContextClassloader().getResourceAsStream(... path to your image relative to jar root ---) 
1

您無法爲JAR文件中的資源創建File對象。改用它。

URL imgurl = this.getClass().getClassLoader().getResource("resImg/banner.png"); 
picLabel - new JLabel(new ImageIcon(imgurl)); 

希望這會有所幫助。

1

你必須找到一個父目錄,relativ路徑可以從像

  • workspace目錄
  • 目錄的過程開始

的relativ路徑是「realtiv」從這裏開始java進程是從開始的,所以路徑可能會不時變化。

如果圖片放在罐子裏,你可以使用

getClass().getResource("relativ jar path") 

尋找圖像。罐子本身知道它放在哪裏。

相關問題