2012-06-04 114 views
2

我目前正在閱讀一本關於java的書,並且我正在研究swing圖形用戶界面組件。當我這樣做,我偶然發現了一個代碼示例,在這裏筆者被設置在一個JButton的圖像與一個非常不尋常的方式,如下圖所示:關於JButton和ImageIcon

Icon bug1 = new ImageIcon(getClass().getResource("bug1.gif")); 

爲了使上述工作,你需要將圖像放在.class文件所在的文件夾中。有人可以向我解釋爲什麼他使用這個特定的代碼(據我所知,它必須是反射代碼,但是再次,我對此不太確定),如果有一種方法可以做到這一點同樣的事情,沒有像他那樣把事情弄得那麼複雜?

回答

4

只有當你不理解它們時,事情纔會變得複雜。一旦你理解了上面的代碼的作用,它將非常簡單。

getClass()返回當前對象的類對象(this)。使用上面的相對路徑調用getResource(),在類路徑中查找名爲bug1.gif的文件,並在與被調用的Class對象相同的包中查找。所以它在與包含上面代碼的類相同的包中尋找bug1.gif。 getResource()返回一個URL。 ImageIcon構造函數將URL作爲參數,從此URL加載圖像字節,並從這些字節構造一個ImageIcon。

因此,整個事情只是從類路徑中的一個文件中創建一個ImageIcon,與調用此代碼的類在同一個包中。這是有道理的:您將給定類使用的圖像放在與該類相同的包中,然後釋放一個包含類和應用程序圖像的jar。

你會想通過閱讀所有這些方法的javadoc自己想出這一切。

+0

您好,感謝您的回答,我已經理解了上面的代碼做了什麼,至少在某種意義上,但是我希望有人比我更好地向我解釋這一點,因爲我知道我是否得到了它從一開始就是正確的。再次感謝您的澄清答覆。 – NlightNFotis

+1

我意識到我沒有真正回答你的疑惑和幻想:沒有更簡單或更簡單的方法來做到這一點(但我不明白它如何可能更簡單),而且它並不是一種不尋常的方式:那是典型的這樣做的方式。 –

2

Class#getResource(String)從類路徑返回資源的URL。這是加載存儲在應用程序JAR文件中的資源的一種簡便方法。如果圖像位於硬盤的地方,您可以使用加載:

new ImageIcon(new File("/path/to/the/image").toURI().toURL()); 

它創建File對象,並得到它的路徑作爲URL(這看起來像file:///path/to/the/image)。

甚至更​​容易,因爲ImageIcon有一個構造器是一個文件名:

new ImageIcon("/path/to/the/image"); 
+0

*「JButton上的圖像」*暗示是嵌入式資源。 'File'對象不適合訪問Jar中的資源。 –

+0

這就是爲什麼我特別寫了_IF圖像位於HDD_上。在Java中從類路徑中打開文件(資源)過於複雜,對初學者來說很難理解(我花了一些時間),我只是想簡化案例,通過展示它如何與外部文件一起工作 - 在我看來 - 更容易理解。 – npe

+0

我認爲使用'toURI()。toURL()'是你的文件名包含需要爲URL轉義的字符的情況。這種情況很少。或者你能解釋一下嗎? – npe

2

Java的鞦韆可以克服複雜的真快,我認爲他實際上使用這種簡單的代碼。

如果圖像路徑是相對的(在您的示例中是路徑),則圖像必須位於與程序的編譯字節代碼(.class文件)相同的位置。如果圖像是其他任何地方,你的程序根本找不到它。

像這樣的相對路徑是非常有用的,特別是當你想把你的完成項目編譯成一個JAR文件時。您的圖像將包含在JAR中,包含所有.CLASS文件。你將能夠下載你的編譯程序,運行它,並且你的圖像就像你期望的那樣在你的GUI中。