Добавить иконки изображений на кнопки/этикетки Swing
Я знаю, что этот вопрос уже опубликован, но я пробовал все, что нашел, и ничего не работало.
У меня есть проект Maven, и я хочу использовать изображения на кнопках. Я помещал изображения в src/main/res folder
. После установки Maven clean/Maven все мои изображения находятся в папке target/classes
. Я хочу, чтобы изображения находились внутри файла .jar
, поэтому мне не нужно создавать отдельную папку при ее использовании.
Это код, который я пытаюсь использовать для загрузки изображения для нового значка на моей кнопке:
JButton button = new JButton();
try {
Image img = ImageIO.read(getClass().getResource("cross_icon.jpg"));
button.setIcon(new ImageIcon(img));
} catch (Exception ex) {
System.out.println(ex);
}
subsPanel.add(button);
но я получаю input == null
. Я попытался использовать main/res/cross_icon.jpg
или res/cross_icon.jpg
, но ничего не получилось.
Ответы
Ответ 1
Вы должны положить /
в начале пути ресурса, если это абсолютный путь при загрузке ресурса через Class.getResource
.
Image img = ImageIO.read(getClass().getResource("/cross_icon.jpg"));
См. javadoc Class.getResource
Перед делегированием по имени данного ресурса создается имя абсолютного ресурса с использованием этого алгоритма:
- Если имя начинается с '/' ('\ u002f'), то абсолютное имя ресурсa > является частью имени, следующего за '/'.
-
В противном случае абсолютное имя имеет следующую форму:
modified_package_name/name
Если имя modified_package_name является именем пакета этого объекта с заменой '/' > на '.' ( '\ U002e').
PS
Если вы используете ClassLoader.getResource
, имя ресурса всегда интерпретируется как абсолютный путь. Например.
Image img = ImageIO.read(getClass()
.getClassLoader()
.getResource("cross_icon.jpg"));
Ответ 2
URL url = getClass().getResource(".");
System.out.println(url);
url = getClass().getResource("cross_icon.jpg");
System.out.println(url);
Image img = ImageIO.read(url);
System.out.println(img);
button.setIcon(new ImageIcon(img));
getResource() создаст url, добавив данный путь с базовым путем (путь вашего .class)