¿Cómo acceder a los recursos en el archivo JAR?

Tengo un proyecto de Java con una barra de herramientas, y la barra de herramientas tiene icons en él. Estos icons se almacenan en una carpeta llamada recursos /, por lo que la ruta podría ser “resources / icon1.png”. Esta carpeta se encuentra en mi directorio src, por lo que cuando se comstack, la carpeta se copia en bin /

Estoy usando el siguiente código para acceder a los recursos.

protected AbstractButton makeToolbarButton(String imageName, String actionCommand, String toolTipText, String altText, boolean toggleButton) { String imgLocation = imageName; InputStream imageStream = getClass().getResourceAsStream(imgLocation); AbstractButton button; if (toggleButton) button = new JToggleButton(); else button = new JButton(); button.setActionCommand(actionCommand); button.setToolTipText(toolTipText); button.addActionListener(listenerClass); if (imageStream != null) { // image found try { byte abyte0[] = new byte[imageStream.available()]; imageStream.read(abyte0); (button).setIcon(new ImageIcon(Toolkit.getDefaultToolkit().createImage(abyte0))); } catch (IOException e) { e.printStackTrace(); } finally { try { imageStream.close(); } catch (IOException e) { e.printStackTrace(); } } } else { // no image found (button).setText(altText); System.err.println("Resource not found: " + imgLocation); } return button; } 

(imageName será “resources / icon1.png”, etc.). Esto funciona bien cuando se ejecuta en Eclipse. Sin embargo, cuando exporto un JAR ejecutable desde Eclipse, no se encuentran los íconos.

Abrí el archivo JAR y la carpeta de recursos está allí. He intentado todo, moviendo la carpeta, alterando el archivo JAR, etc., pero no puedo mostrar los íconos.

¿Alguien sabe lo que estoy haciendo mal?

(Como una pregunta complementaria, ¿hay algún monitor de archivos que pueda funcionar con los archivos JAR? Cuando surgen problemas de ruta, normalmente solo abro FileMon para ver qué está sucediendo, pero simplemente aparece como accediendo al archivo JAR en este caso)

Gracias.

Para cargar una imagen desde un recurso JAR use el siguiente código:

 Toolkit tk = Toolkit.getDefaultToolkit(); URL url = getClass().getResource("path/to/img.png"); Image img = tk.createImage(url); tk.prepareImage(img, -1, -1, null); 

Veo dos problemas con tu código:

 getClass().getResourceAsStream(imgLocation); 

Esto supone que el archivo de imagen está en la misma carpeta que el archivo .class de la clase de la que proviene este código, no en una carpeta de recursos separada. Pruebe esto en su lugar:

 getClass().getClassLoader().getResourceAsStream("resources/"+imgLocation); 

Otro problema:

 byte abyte0[] = new byte[imageStream.available()]; 

El método InputStream.available() no devuelve la cantidad total de bytes en la secuencia. Devuelve la cantidad de bytes disponibles sin locking, que a menudo es mucho menor.

Debe escribir un bucle para copiar los bytes en un ByteArrayOutputStream temporal hasta que se llegue al final de la secuencia. Alternativamente, use getResource() y el método createImage() que toma un parámetro de URL.

La sección del tutorial de Swing sobre Cómo usar los icons le muestra cómo crear una URL y leer el icono en dos instrucciones.

Por ejemplo, en un proyecto de NetBeans, cree una carpeta de recursos en la carpeta src. Pon tus imágenes (jpg, …) allí.

Ya sea que utilice ImageIO o Toolkit (incluido getResource), debe incluir una ruta principal / en su camino hacia el archivo de imagen:

 Image image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/resources/agfa_icon.jpg")); setIconImage(image); 

Si este código está dentro de su clase JFrame, la imagen se agrega al marco como un icono en su barra de título.