Java Swing: visualización de imágenes desde dentro de un tarro

Cuando ejecuto una aplicación Java desde eclipse, mi ImageIcon aparece muy bien.

Pero después de crear un flask, 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.

Para crear un ImageIcon partir de un archivo de imagen dentro de los mismos jarrones, se carga su código:

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

Class.getResource devuelve una URL de un recurso (¡o null !). ImageIcon tiene constructores que se cargan desde una URL.

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

Puedes probar algo como:

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

En su archivo JAR, puede tener una estructura de directorios de:

MyJAR.jar
– com (archivos de clase aquí)
– imágenes
—- image.jpg

Esto me funciona para cargar y configurar la imagen de fondo del panel de contenido:

jar (o ruta de comstackción) 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 tanto en ejecución jar y sin enmarañar (es el término técnico).

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

En netbeans 8.1, lo que he hecho es incluir la carpeta de icons y otras imágenes llamadas Recursos dentro de la carpeta src en el archivo del proyecto. Entonces cada vez que construyo el archivo Jar , la carpeta se incluye allí. El árbol de archivos debería ser así:

  • src (los archivos Java en paquetes de origen están aquí)
  • ** PAQUETE QUE HA NOMBRADO EN EL PROYECTO **

    • archivo.java
  • Recursos

    • image.jpg

El código debería ser como:

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

Cargar imagen desde el archivo Jar durante el tiempo de ejecución es lo mismo que cargar la imagen cuando se ejecuta desde IDE, por ejemplo, netbeans, la diferencia es que al cargar la imagen del archivo JAR la ruta debe ser correcta y sensible a mayúsculas (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” está en minúscula, no funcionará. verificar espacios, casos y ortografía