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



У меня есть проект 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. Однако, когда я экспортирую работающую банку из Затмение, значки не найдены.



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



Кто-нибудь знает, что я делаю не так?

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



Спасибо.

983   4  

4 ответов:

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

Toolkit tk = Toolkit.getDefaultToolkit();
URL url = getClass().getResource("path/to/img.png");
Image img = tk.createImage(url);
tk.prepareImage(img, -1, -1, null);

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

getClass().getResourceAsStream(imgLocation);

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

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

Еще одна проблема:

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

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

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

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

Например, в проекте NetBeans создайте папку resources в папке src. Поместите свои изображения (jpg, ...) туда.

Независимо от того, используете ли вы ImageIO или Toolkit (включая getResource), вы должны включить ведущий / в свой путь к файлу изображения:

Image image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/resources/agfa_icon.jpg"));
setIconImage(image);

Если этот код находится внутри класса JFrame, изображение добавляется в кадр в виде значка в строке заголовка.

Comments

    Ничего не найдено.