Добавить изображения в 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
, вы можете использовать:
-
getClass().getResource("/images/icon.jpg")
или 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")));