2008-08-27 12 views
42

Cuando ejecuto una aplicación Java desde eclipse, mi ImageIcon aparece muy bien.Java Swing: mostrar imágenes desde dentro de un tarro

Pero después de crear un contenedor, la ruta a la imagen obviamente se arruina.

¿Hay alguna manera de extraer una imagen del contenedor en tiempo de ejecución para poder abrirla? O, ¿hay una mejor manera de hacer esto?

Me gustaría distribuir un solo archivo jar si es posible.

+0

La respuesta "Tom Hawtin - tackline" es mucho mejor, solo apareció un poco tarde. Por favor considere cambiar su respuesta seleccionada. – erickson

Respuesta

31

para crear un ImageIcon de un archivo de imagen dentro de los mismos frascos se carga el código:

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

Class.getResource devuelve una URL de un recurso (o null!). ImageIcon tiene un constructor que carga desde una URL.

Para construir una URL para un recurso en un jar que no esté en su "classpath", consulte la documentación para java.net.JarURLConnection.

21

Usted puede intentar algo como:

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

En el archivo JAR, es posible que tenga una estructura de directorios de:

MyJAR.jar
- COM (archivos de clase aquí)
- images
---- image.jpg

8

Esto es trabajo para mí para cargar y configurar la imagen contenido del panel de fondo:

frasco (o construye el camino) contiene:

- com 
- img 
---- bg.png 

java contiene:

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

probado y trabajando en ambas ejecuciones jar y unjarred (es el término técnico).

BTW getClass().getClassLoader().getResourceAsStream("/img/bg.png") - que probé primero - me devolvió un InputStream nulo.

+0

getResourceAsStream return NPE ¿Tiene algo que ver con la versión java? También obtuve NPE con getResourceAsStream, pero getResource funciona perfectamente. –

0

Cargar imagen desde archivo Jar durante el tiempo de ejecución es lo mismo que cargar imagen cuando se ejecuta desde IDE. Por ejemplo netbeans. La diferencia es que al cargar imagen desde archivo JAR la ruta debe ser correcta y es sensible a (muy importante) . Esto funciona para mí

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

si p en "/Pictures/firstgame/habitat1.jpg" es en minúsculas que no funcionará. comprobar espacios, casos y ortografía

+0

Otra posible razón podría ser la extensión de la imagen. Noté que getClass(). GetResource ("/ Pictures/firstgame/habitat1.jpg") se mostrará y se cargará bien desde el IDE, incluso si guarda la imagen como "habitat1.JPG", pero no se cargará desde un archivo jar. Debe guardar la extensión con minúsculas como "habitat1.jpg" –

1

en NetBeans 8.1 lo que he hecho es incluir la carpeta de iconos y otras imágenes llamada Recursos dentro de la carpeta src en el archivo de proyecto. Entonces cada vez que construyo el archivo Jar la carpeta está incluida allí.El árbol de archivos debe ser como este:

  • src (archivos de Java en los packges de origen están aquí)
  • ** PAQUETE USTED nombrado en PROYECTO **

    • file.java
  • Recursos

    • image.jpg

El código debe ser como:

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