Добавить изображения в jar

Я хочу установить значок на свой JFrame. Я делаю следующее:

Image icon = Toolkit.getDefaultToolkit().getImage("src/images/icon.jpg");
this.setIconImage(icon);

он отлично работает, когда я запускаю этот код из netbeans, но когда я пытаюсь запустить этот код из jar-файла, изображения не отображаются в моем JFrame. Я попытался загрузить изображения в качестве ресурсов:

this.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/src/images/icon.jpg")));

но когда я запускаю этот код, он выдает NullPointerException

 Uncaught error fetching image:
java.lang.NullPointerException
        at sun.awt.image.URLImageSource.getConnection(URLImageSource.java:99)
        at sun.awt.image.URLImageSource.getDecoder(URLImageSource.java:113)
        at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:240)
        at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
        at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)

как я могу сделать эту работу?

edit: Благодарить всех, проблема была решена путем указания изображения as

Toolkit.getDefaultToolkit().getImage(getClass().getClassLoader().getResource("images/icon.JPG"))

как это кажется довольно странным, и было бы лучше, если было бы

this.setIconImage(new ImageIcon(pathToIcon).getImage());

9 ответов


глядя на исходный код URLImageSource, кажется, что причина в том, что getConnection бросает NPE, что он имеет null для url. И это заставляет меня подозревать, что

getClass().getResource("/src/images/icon.jpg")

возвращается null. Он сделал бы это, если бы не смог найти ресурс с этим именем пути.

держу пари, что проблема в том, что вы неправильно выбрали путь.

чтобы доказать / опровергнуть это, необходимо запустить jar tvf в файле JAR и найдите строку, которая спички "icon.jpg". Является ли соответствующий путь таким же, как и то, что вы используете? Если нет, используйте путь из соответствующей строки в getResource звонок и он должен работать. Кроме того, если файл вообще не отображается, посмотрите на конфигурации сборки NetBeans, которые говорят ему, что поместить в файл JAR. (Я не пользователь NetBeans, поэтому я не могу сказать, где вам нужно искать ...)


если это ведет вас абсолютно никуда, другая возможность заключается в том, что getClass().getResource(...) использует загрузчик классов, который не знает о файле JAR, содержащем изображение. (Мне это кажется совершенно невероятным ...)


предполагая, что ваш файл JAR имеет каталог верхнего уровня под названием images, вы можете использовать:

  1. getClass().getResource("/images/icon.jpg") или
  2. getClass().getClassLoader().getResource("images/icon.jpg")

getResource() загружает ресурс из classpath, а не путь к ОС, и после компиляции ваш classpath не будет включать /src папка, а точнее только ее содержимое. Так что вам лучше попробовать /images/icon.jpg.

можно найти эта дискуссия несколько полезные.


Это должно сделать это, предполагая, что вы можете импортировать javax.imageio.ImageIO:

Image icon = ImageIO.read(this.getClass().getResource("/src/images/icon.jpg"));
this.setIconImage(icon);

.."/src/images/icon.jpg"..  

префикс '/src' адреса кажется подозрительным. Многие приложения. предоставит отдельные каталоги " src " и "build", но обычно заканчивается тем, что префикс " src " не используется в результирующей банке. Я рекомендую попробовать..

.."/images/icon.jpg".. 

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


чтобы это работало, вы должны получить доступ к изображениям из каталога относительно некоторого фиксированного класса. Например, если файлы сохраняются в папку "Изображения" на том же уровне, как Toolkit.class, потом

this.setIconImage(Toolkit.getDefaultToolkit().getImage(Toolkit.class.getResource("images/icon.jpg"))); должен работать.


решение объясняется в этом посте здесь. Только посмотрите!

Ура


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

ImageIcon a = new ImageIcon(MainClass.class.getResource("/Package/Image.jpg"));


JFrame f = new JFrame("Edit Configure File");
//Image image = ImageIO.read(getClass().getResource("images/ctx.Icon"));
f.setIconImage(new ImageIcon("images/ctx.PNG").getImage());//this works for me finally
//f.setIconImage(image);
//f.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/ctx.PNG")));