[英]ImageIcon Loading in Java
我搜索了Google,SE和Oracle的文檔,以獲取有關如何執行此操作的信息,但我似乎無法使其工作。
我找到了幾個關於是否使用getResource()
或getResourceAsStream()
以及如何格式化文件名的帖子,但沒有我可以應用於我的情況。
我的目錄結構如下所示(資源文件夾中有一些額外的級別):
Root Folder
|
|_____ bin (compiled .class files go here)
|
|_____ src
| |
| |_____ packageA
| | |
| | |_____ packageAa
| | |
| | |_____ images.java
| | |
| | |_____ resources
| | |
| | |_____ icon1.gif
| |
| |_____ packageB
| |
| ... (More packages with sub-packages)
|
|_____ resources (should it go here?)
|
|_____ icon2.gif
在我的實際程序中,我有107個gif圖像,文件名可以從對象值派生。 這些圖像目前位於兩個資源文件夾中,因為我一直在玩這兩個圖片以試圖讓它們工作。
我當前的代碼試試這個:
String imageFileName = getFileName(obj); // returns a string such as "/resources/cardImages/acespades.gif"
URL imageURL = getClass().getClassLoader().getResource(imageFileName);
ImageIcon icon = new ImageIcon(imageURL);
無論前導反斜杠如何,我都會得到一個空指針異常。
我應該如何格式化文件名和/或創建一個URL對象來獲取圖像?
注意:我使用Sublime Text 3和Javatar來編譯我的代碼。 文件夾結構(bin文件夾)由Javatar創建。 我的“源文件夾”設置為src
,上面顯示的“根文件夾”是我的閃存驅動器。
================================================== ==
編輯:
我嘗試了彼得的建議,結果如下:
URL imageURL = getClass().getResource("resources/cardImages/back1.gif");
System.out.println(imageURL);
ImageIcon icon = new ImageIcon("resources/cardImages/back1.gif");
println語句打印出null,但ImageIcon會正確顯示圖像。 據我所知,這會從.java文件旁邊的文件夾中加載圖像。
URL imageURL = getClass().getResource("/resources/cardImages/back1.gif");
System.out.println(imageURL);
ImageIcon icon = new ImageIcon("/resources/cardImages/back1.gif");
println仍然打印null,但現在不顯示圖像。 我復制並粘貼了整個資源文件夾,以確保它們在兩個位置都相同。
在類上加載資源時,路徑相對於包路徑,除非您有一個前導斜杠/。
至於你的icon1.gif,使用
URL url = getClass().getResource("resources/icon1.gif");
應該返回正確的URL。
我建議將Java源和資源分開。 如果resources是源文件夾(其輸出文件夾是bin / JAR的根目錄),請使用:
URL url = getClass().getResource("/icon2.gif");
(注意前面的斜線)。
編輯 (問題更新):
更正了第二個URL(資源是源文件夾,icon2.gif位於其根目錄中)。
我剛剛在Eclipse中驗證了它,並且我得到了兩個變體的正確(非空)URL。 使用ImageIcon
的URL也可以得到正確的結果,並顯示圖像。
resources
是源文件夾。 並非所有項目文件都位於輸出文件夾(通常是bin
)和稍后的JAR中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.