[英]How to access resources in JAR file?
我有一個帶有工具欄的Java項目,該工具欄上帶有圖標。 這些圖標存儲在名為resources /的文件夾中,因此路徑可能是“ resources / icon1.png”。 該文件夾位於我的src目錄中,因此在編譯后,該文件夾將被復制到bin /
我正在使用以下代碼訪問資源。
protected AbstractButton makeToolbarButton(String imageName, String actionCommand, String toolTipText,
String altText, boolean toggleButton) {
String imgLocation = imageName;
InputStream imageStream = getClass().getResourceAsStream(imgLocation);
AbstractButton button;
if (toggleButton)
button = new JToggleButton();
else
button = new JButton();
button.setActionCommand(actionCommand);
button.setToolTipText(toolTipText);
button.addActionListener(listenerClass);
if (imageStream != null) { // image found
try {
byte abyte0[] = new byte[imageStream.available()];
imageStream.read(abyte0);
(button).setIcon(new ImageIcon(Toolkit.getDefaultToolkit().createImage(abyte0)));
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
imageStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} else { // no image found
(button).setText(altText);
System.err.println("Resource not found: " + imgLocation);
}
return button;
}
(imageName將為“ resources / icon1.png”等)。 在Eclipse中運行時,效果很好。 但是,當我從Eclipse導出可運行的JAR時,找不到圖標。
我打開了JAR文件,資源文件夾在那里。 我已經嘗試了所有操作,移動文件夾,更改JAR文件等,但無法顯示圖標。
有人知道我在做什么錯嗎?
(作為附帶的問題,是否有任何文件監視器可以使用JAR文件?當出現路徑問題時,我通常只是打開FileMon來查看發生了什么,但是在這種情況下,它只是顯示為訪問JAR文件)
謝謝。
我發現您的代碼有兩個問題:
getClass().getResourceAsStream(imgLocation);
這假定圖像文件與該代碼所屬類的.class文件位於同一文件夾中,而不位於單獨的資源文件夾中。 嘗試以下方法:
getClass().getClassLoader().getResourceAsStream("resources/"+imgLocation);
另一個問題:
byte abyte0[] = new byte[imageStream.available()];
InputStream.available()
方法不返回流中的字節總數! 它返回沒有阻塞的可用字節數,通常要少得多。
您必須編寫一個循環以將字節復制到臨時ByteArrayOutputStream
直到到達流的末尾。 或者,使用getResource()
和帶有URL參數的createImage()
方法。
要從JAR資源加載圖像,請使用以下代碼:
Toolkit tk = Toolkit.getDefaultToolkit();
URL url = getClass().getResource("path/to/img.png");
Image img = tk.createImage(url);
tk.prepareImage(img, -1, -1, null);
Swing教程中有關如何使用圖標的部分向您展示了如何創建URL並以兩個語句讀取圖標。
例如,在NetBeans項目中,在src文件夾中創建一個resources文件夾。 將您的圖像(jpg,...)放在那里。
無論您使用ImageIO還是Toolkit(包括getResource),都必須在映像文件的路徑中包含前導/:
Image image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/resources/agfa_icon.jpg"));
setIconImage(image);
如果此代碼位於JFrame類內,則圖像將作為標題欄中的圖標添加到框架中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.