Добавить иконки изображений на кнопки/этикетки 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)