У меня есть проект 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 в этом случае),
Спасибо.
Чтобы загрузить изображение из ресурса 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-адрес и прочитать значок в двух инструкциях.
Я вижу две проблемы с вашим кодом:
getClass().getResourceAsStream(imgLocation);
Предполагается, что файл изображения находится в той же папке, что и файл .class этого класса. находится из, а не в отдельной папке ресурсов. Попробуйте вместо этого:
getClass().getClassLoader().getResourceAsStream("resources/"+imgLocation);
Другая проблема:
byte abyte0[] = new byte[imageStream.available()];
Метод InputStream.available ()
не возвращает , а не общее количество байтов в потоке! Он возвращает количество байтов, доступных без блокировки, которое часто намного меньше.
Вы должны написать цикл для копирования байтов во временный ByteArrayOutputStream
, пока не будет достигнут конец потока. В качестве альтернативы можно использовать getResource ()
и метод createImage ()
, который принимает параметр URL.