Как получить доступ к ресурсам в файле JAR?

У меня есть проект Java с панелью инструментов, и панель инструментов имеет значки на нем. Эти значки хранятся в папке, названной ресурсами/, таким образом, например, путь мог бы быть "resources/icon1.png". Эта папка расположена в моем src каталоге, поэтому когда это компилируется, папка копируется в мусорное ведро /

Я использую следующий код для доступа к ресурсам.

    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. Однако, когда я экспортирую выполнимый JAR из Eclipse, значки не найдены.

Я открыл файл JAR, и папка ресурсов там. Я попробовал все, переместив папку, изменив файл JAR и т.д., но я не могу заставить значки обнаруживаться.

Кто-либо знает то, что я делаю неправильно?

(Как вопрос о стороне, там какой-либо монитор файла, который может работать с файлами JAR? Когда проблемы пути возникают, я обычно просто открываю FileMon для наблюдения то, что продолжается, но он просто обнаруживается как доступ к файлу JAR в этом случае),

Спасибо.

15
задан bcoughlan 6 March 2010 в 16:31
поделиться

3 ответа

Чтобы загрузить изображение из ресурса JAR, используйте следующий код:

Toolkit tk = Toolkit.getDefaultToolkit();
URL url = getClass().getResource("path/to/img.png");
Image img = tk.createImage(url);
tk.prepareImage(img, -1, -1, null);
5
ответ дан 1 December 2019 в 03:43
поделиться

Раздел из учебника Swing на Как использовать значки показывает вам, как создать URL-адрес и прочитать значок в двух инструкциях.

4
ответ дан 1 December 2019 в 03:43
поделиться

Я вижу две проблемы с вашим кодом:

getClass().getResourceAsStream(imgLocation);

Предполагается, что файл изображения находится в той же папке, что и файл .class этого класса. находится из, а не в отдельной папке ресурсов. Попробуйте вместо этого:

getClass().getClassLoader().getResourceAsStream("resources/"+imgLocation);

Другая проблема:

byte abyte0[] = new byte[imageStream.available()];

Метод InputStream.available () не возвращает , а не общее количество байтов в потоке! Он возвращает количество байтов, доступных без блокировки, которое часто намного меньше.

Вы должны написать цикл для копирования байтов во временный ByteArrayOutputStream , пока не будет достигнут конец потока. В качестве альтернативы можно использовать getResource () и метод createImage () , который принимает параметр URL.

11
ответ дан 1 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: