2008-08-27 2 views
42

При запуске приложения Java из eclipse мой ImageIcon отображается просто отлично.Java Swing: отображение изображений из Jar

Но после создания банки путь к изображению явно завинчивается.

Есть ли способ извлечь изображение из банки во время выполнения, чтобы затем открыть его? Или, есть ли лучший способ сделать это?

Я бы хотел, если возможно, распространять один файл jar.

+0

Ответ «Tom Hawtin - tackline» намного лучше, он просто появился немного поздно. Пожалуйста, подумайте об изменении выбранного ответа. – erickson 2008-09-11 04:59:36

ответ

31

Чтобы создать ImageIcon из файла образа в тех же банках код загружается:

new javax.swing.ImageIcon(getClass().getResource("myimage.jpeg")) 

Class.getResource возвращает URL ресурса (или null!). ImageIcon имеет конструкторы, которые загружаются с URL-адреса.

Чтобы создать URL-адрес ресурса в банке, не относящийся к вашему «пути к классам», см. Документацию для java.net.JarURLConnection.

21

Вы можете попробовать что-то вроде:

InputStream stream = this.getClass().getClassLoader().getResourceAsStream("/images/image.jpg"); 

В файле JAR, вы можете иметь структуру каталогов:

myJar.jar
- ком (файлы классов здесь)
- images
---- image.jpg

8

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

банки (или построить путь) содержит:

- 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(); 
} 

Испытан и работая как в банке, так и в незапертом (это технический термин).

BTW getClass().getClassLoader().getResourceAsStream("/img/bg.png") - который я пробовал в первую очередь - возвратил мне значение InputStream.

+0

getResourceAsStream, возвращающий NPE, это как-то связано с версией java? Я также получил NPE с getResourceAsStream, но getResource работает отлично. – 2015-09-08 07:24:03

0

Загрузить изображение из файла 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)); 

, если р в «/Pictures/firstgame/habitat1.jpg» в нижнем регистре она не будет работать. проверить пробелы, случаи и написание

+0

Другой возможной причиной может быть расширение изображения. Я заметил, что getClass(). GetResource («/ Pictures/firstgame/habitat1.jpg») будет отображаться и загружаться из среды IDE, даже если вы сохраните изображение как «habitat1.JPG», но не загрузится из файла jar. Вы должны сохранить расширение с нижним регистром как "habitat1.jpg" – 2015-12-29 10:35:38

1

В NetBeans 8.1, что я сделал это, чтобы включить папку икон и других изображений под названием Ресурсы внутри Src папке в файле проекта. Поэтому всякий раз, когда я строю Jar файл, там папка включена.Файл дерево должно быть так:

  • ГКЗ (Java-файлы в исходной packges здесь)
  • ** ПАКЕТ ВЫ ИМЯ В ПРОЕКТЕ **

    • file.java
  • Ресурсы

    • Image.jpg

Код должен быть как:

jToggleButton1.setIcon(new javax.swing.ImageIcon(this.getClass().getResource("/resources/image.jpg")));