2010-02-26 72 views
16

我想加載一個圖像作爲我的應用程序中的圖標使用。根據本tutorial適當的方法是:使用getClass()加載資源getResource()

protected ImageIcon createImageIcon(String path, String description) 
{ 
    java.net.URL imgURL = getClass().getResource(path); 
    if (imgURL != null) { 
     return new ImageIcon(imgURL, description); 
    } else { 
     System.err.println("Couldn't find file: " + path); 
     return null; 
    } 
} 

所以,我放置在文件的位置,並通過它作爲參數傳遞給該函數。這不起作用,即imgURL爲空。當我嘗試通過明確傳遞路徑創建ImageIcon時:

ImageIcon icon = new ImageIcon(path,"My Icon Image"); 

它工作得很好!因此,應用程序可以從明確定義的路徑中拾取圖像,但是沒有使用getResources()拾取圖像。在這兩種情況下,路徑變量的值都是相同的。爲什麼它不工作?如何通過類加載器找到資源?

謝謝。

+2

您使用的是IDE嗎? IDE是否設置爲將資源複製到編譯到的類中? – z5h 2010-02-26 16:45:16

+0

圖像位於相對於類和項目根目錄的位置? – willcodejavaforfood 2010-02-26 16:49:29

+0

是的,我使用Eclipse,並沒有設置複製資源。已經修復了。該課程位於root/bin//MyClass,圖像位於root/resources/images/myImage.gif 感謝您的回覆。 – Luhar 2010-02-26 16:51:50

回答

12

你可以問這個格式的路徑:

/package/path/to/the/resource.ext 

即使字節在內存中創建的類被發現是這樣的:

my.Class -> /my/Class.class 

和的getResource會給你一個網址至極能用於檢索InputStream。

但是...我建議直接使用getClass().getResourceAsStream(...)具有相同的參數,因爲它直接返回InputStream,不必擔心創建一個(可能是複雜的)URL對象,它必須知道如何創建的InputStream。

總之:嘗試使用getResourceAsStream和ImageIcon的一些構造函數,它們使用inputstream作爲參數。

類加載器

要小心,如果你的應用程序有許多類加載器。如果你有一個簡單的獨立應用程序(沒有服務器或複雜的東西),你不應該擔心。我認爲ImageIcon無法找到它。

編輯:類路徑

的getResource是-as mattb says-加載資源從類路徑(從您的.jar或路徑目錄)。如果您捆綁了一個應用程序,那麼完全可以完全使用它,因此您可以將該圖標文件包含在應用程序的jar文件中並以此方式獲取。

14

getClass().getResource(path)從classpath加載資源,而不是從文件系統路徑加載資源。

+0

哈哈!我認爲他有類路徑而不是文件路徑。我會糾正我的答案。 – helios 2010-02-26 16:49:56

3

作爲noobie我被這直到我意識到所謂的「路徑」是路徑相對到MyClass的混淆。 文件在文件系統中,而不是MyClass。 java文件。我的IDE將資源(如xx.jpg,xx.xml)複製到MyClass.class的本地目錄中。例如,在一個名爲「target/classes/pkg」的pkg目錄中,對於不同的IDE,類文件位置可能會有所不同,具體取決於應用程序構建的結構。您應該先探索文件系統並找到MyClass.class文件以及您正在提取的相關資源的複製位置。然後確定相對於MyClass.class文件的路徑,並將其寫爲帶有「點」和「斜槓」的字符串值。

例如,下面是我如何使一個app1.fxml文件可用於我的javafx應用程序,其中相關的「MyClass.class」隱含地爲「Main.class」。 Main.java文件是包含這行資源調用代碼的位置。在我的具體情況下,資源被複制到與封裝包文件夾相同級別的位置。那就是:/target/classes/pkg/Main.class和/target/classes/app1.fxml。因此,釋義......相對引用「../app1.fxml」是「從Main.class開始,向上一級目錄,現在你可以看到資源」。

FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(getClass().getResource("../app1.fxml")); 

注意,在這種相對路徑的字符串「../app1.fxml」時,第一兩個點引用包圍Main.class和單個目錄「」表示要跟隨的文件擴展名。在這些細節成爲第二性質後,你會忘記它爲什麼會令人困惑。