Добавить изображения в банку - PullRequest
6 голосов
/ 30 марта 2011

Я хочу установить иконку для моего 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: Спасибо всем, проблема была решена путем указания изображения как

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

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

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

Ответы [ 8 ]

3 голосов
/ 30 марта 2011

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

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

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

Могу поспорить, что проблема в том, что вы ошиблись в пути.

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


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

3 голосов
/ 30 марта 2011

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

  1. getClass().getResource("/images/icon.jpg") или
  2. getClass().getClassLoader().getResource("images/icon.jpg")
2 голосов
/ 30 марта 2011

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

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

0 голосов
/ 29 января 2015
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")));
0 голосов
/ 14 мая 2014

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

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

0 голосов
/ 30 марта 2011

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

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

0 голосов
/ 30 марта 2011
.."/src/images/icon.jpg"..  

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

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

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

0 голосов
/ 30 марта 2011

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

Image icon = ImageIO.read(this.getClass().getResource("/src/images/icon.jpg"));
this.setIconImage(icon);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...