Java Swing: отображение изображений изнутри Jar
При запуске приложения Java из eclipse мой ImageIcon отображается просто отлично.
Но после создания банки путь к изображению явно завинчивается.
Есть ли способ извлечь изображение из банки во время выполнения, чтобы затем открыть его? Или, есть ли лучший способ сделать это?
Я хотел бы распространять один файл jar, если это возможно.
Ответы
Ответ 1
Чтобы создать ImageIcon
из файла изображения в тех же банках, ваш код загружен:
new javax.swing.ImageIcon(getClass().getResource("myimage.jpeg"))
Class.getResource
возвращает URL-адрес ресурса (или null
!). ImageIcon
имеет конструкторы, которые загружаются с URL-адреса.
Чтобы создать URL-адрес ресурса в банке не в вашем "пути к классам", см. документацию для java.net.JarURLConnection
.
Ответ 2
Вы можете попробовать что-то вроде:
InputStream stream = this.getClass().getClassLoader().getResourceAsStream("/images/image.jpg");
В вашем JAR файле у вас может быть структура каталогов:
myJar.jar
- com (файлы классов здесь)
- изображения
---- image.jpg
Ответ 3
Это работает для загрузки и установки фонового изображения панели содержимого:
jar (или путь сборки) содержит:
- com
- img
---- bg.png
java содержит:
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 (это технический термин).
BTW getClass().getClassLoader().getResourceAsStream("/img/bg.png")
- который я попробовал в первую очередь - вернул мне пустой InputStream.
Ответ 4
В netbeans 8.1 я сделал, чтобы включить папку значков и других изображений, называемых Ресурсы внутри папки src в файле проекта. Поэтому всякий раз, когда я создаю файл Jar, папка будет добавлена туда. Дерево файлов должно быть таким:
- src (файлы Java в исходных пакетах здесь)
Код должен выглядеть следующим образом:
jToggleButton1.setIcon(new javax.swing.ImageIcon(this.getClass().getResource("/resources/image.jpg")));
Ответ 5
Загрузка изображения из файла Jar во время выполнения такая же, как загрузка изображения при выполнении из IDE, например netbeans, разница заключается в том, что при загрузке изображения из JAR файла путь должен быть правильным и чувствителен к регистру (очень важно).
Это работает для меня
image1 = new javax.swing.ImageIcon(getClass().getResource("/Pictures/firstgame/habitat1.jpg"));
img = image1.getImage().getScaledInstance(lblhabitat1.getWidth(), lblhabitat1.getHeight(), Image.SCALE_SMOOTH);
lblhabitat1.setIcon(new ImageIcon(img));
если p в "/Pictures/firstgame/habitat1.jpg" находится в нижнем регистре, он не будет работать. проверки пробелов, случаев и орфографии