簡體   English   中英

如何訪問JAR文件中的資源?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM