Java Swing: отображение изображений внутри Jar
При запуске Java-приложения из Eclipse мой ImageIcon обнаруживается просто отлично.
Но после создания банки путь к изображению, очевидно, искажается.
Есть ли способ извлечь изображение из банки во время выполнения, чтобы я мог открыть его? Или есть лучший способ сделать это?
Я хотел бы распространять один файл JAR, если это возможно.
5 ответов
Чтобы создать ImageIcon
из файла изображения в том же банке загружается ваш код:
new javax.swing.ImageIcon(getClass().getResource("myimage.jpeg"))
Class.getResource
возвращает URL ресурса (или null
!). ImageIcon
имеет конструкторы, которые загружаются из URL.
Чтобы создать URL для ресурса в банке, находящейся не в вашем "classpath", см. Документацию для java.net.JarURLConnection
,
Вы можете попробовать что-то вроде:
InputStream stream = this.getClass().getClassLoader().getResourceAsStream("/images/image.jpg");
В вашем JAR-файле вы можете иметь структуру каталогов:
myJar.jar
- com (файлы классов здесь)
- изображений
----image.jpg
Это работает для меня, чтобы загрузить и установить фоновое изображение панели содержимого:
jar (или путь сборки) содержит:
- com
- img
---- bg.png
Ява содержит:
JFrame f = new JFrame("Testing load resource from jar");
try {
BufferedImage bg = ImageIO.read(getClass().getResource("/img/bg.png"));
f.setContentPane(new ImagePanel(bg));
} catch (IOException e) {
e.printStackTrace();
}
Протестировано и работает как в jar, так и в unjarred (это технический термин) исполнении.
КСТАТИ getClass().getClassLoader().getResourceAsStream("/img/bg.png")
- который я попробовал первым - вернул мне пустой InputStream.
В netbeans 8.1 я включил папку с иконками и другими изображениями под названием Resources в папку src в файле проекта. Поэтому всякий раз, когда я собираю Jar- файл, папка включается туда. Дерево файлов должно выглядеть так:
- src (файлы Java в исходных пакетах здесь)
** УПАКОВКА, которую вы назвали в проекте **
- file.java
Ресурсы
- image.jpg
Код должен быть таким:
jToggleButton1.setIcon(new javax.swing.ImageIcon(this.getClass().getResource("/resources/image.jpg")));
Загрузка изображения из файла Jar во время выполнения аналогична загрузке изображения при выполнении из IDE, например, netbeans, разница в том, что при загрузке изображения из файла JAR путь должен быть правильным и учитывать регистр (очень важно). Это работает для меня
image1 = новый javax.swing.ImageIcon(getClass().getResource("/Pictures/firstgame/ привычка1.jpg")); img = image1.getImage().getScaledInstance(lblhabitat1.getWidth(), lblhabitat1.getHeight(), Image.SCALE_SMOOTH); lblhabitat1.setIcon(новый ImageIcon(img));
если p в "/Pictures/firstgame/habitat1.jpg" в нижнем регистре, оно не будет работать. проверить пробелы, случаи и правописание