2010-03-06 22 views
10

Tengo un proyecto de Java con una barra de herramientas, y la barra de herramientas tiene iconos en él. Estos iconos 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 compila, la carpeta se copia en bin/¿Cómo acceder a los recursos en el archivo JAR?

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á "recursos/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 archivos JAR? Cuando surgen problemas de ruta, suelo abrir FileMon para ver lo que está pasando, pero simplemente aparece como accediendo al archivo JAR en este caso)

Gracias.

+1

Entonces, ¿5 líneas de código para cargar el ícono son mejores, luego 2 líneas de código?Por supuesto, para descubrir el secreto para usar 2 líneas de código, en realidad tendrías que leer por tu cuenta. Supongo que el secreto permanecerá oculto. – camickr

Respuesta

5

Para cargar una imagen de un uso de los recursos JAR 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); 
+0

qué paquete es que Toolkit dentro? – tomasb

+0

@tomasb java.awt.Toolkit – Christian

10

veo dos problemas con su código:

getClass().getResourceAsStream(imgLocation); 

Esto supone que el archivo de imagen se encuentra en la misma carpeta que el archivo .class de la clase de este código es, no en una carpeta separada recursos. Tal vez puedas probar:

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

Otro problema:

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

El método InputStream.available() hace no retorno el número total de bytes de la corriente! Devuelve la cantidad de bytes disponibles sin bloqueo, que a menudo es mucho menor.

Tiene que 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.

4

La sección del tutorial de Swing en How to Use Icons le muestra cómo crear una URL y leer el icono en dos instrucciones.

0

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 (incluyendo getResource), debe incluir un líder/en su ruta de acceso al archivo de imagen:

Si el código está dentro de su clase JFrame, se añade
Image image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/resources/agfa_icon.jpg")); 
setIconImage(image); 

la imagen para el marco como un icono en la barra de título.

Cuestiones relacionadas