2012-03-25 11 views
45

Tengo un error para mi GUI. Al intentar establecer el icono de la barra de título, se incluirá en un JAR ejecutable.Cargando el recurso de imagen

BufferedImage image = null; 
try { 
    image = ImageIO.read(getClass().getClassLoader().getResource("resources/icon.gif")); 
} 
catch (IOException e) { 
    e.printStackTrace(); 
} 

frame.setIconImage(image); 

Aquí está el error que estoy recibiendo:

Exception in thread "main" java.lang.IllegalArgumentException: input == null! 
    at javax.imageio.ImageIO.read(Unknown Source) 
    at GUI.<init>(GUI.java:39) 
    at GUI.main(GUI.java:351) 

La imagen está en el directorio correcto, que "los recursos" carpeta es la raíz del archivo proyecto

+2

Creo que se necesita un '/' delante de recursos, compruebe que complacer – Coffee

+2

@Adel Gracias por eso. Estoy recibiendo otro error. Excepción en el hilo "main" java.lang.IllegalArgumentException: input == null! Mismo error con el cambio – exlux15

+3

Pruebe eliminar .getClassLoader() –

Respuesta

56

En primer lugar, cambie esta línea:

image = ImageIO.read(getClass().getClassLoader().getResource("resources/icon.gif")); 

a esto:

image = ImageIO.read(getClass().getResource("/resources/icon.gif")); 

Más información, en cuanto a donde se encuentra la diferencia entre los dos enfoques, se pueden encontrar en este hilo - Different ways of loading a Resource

Para Eclipse:

Para NetBeans:

Para IntelliJ IDE R:

  • Haga clic en la src Carpeta del Proyecto . Seleccionar Nuevo -> Paquete
  • Bajo Nuevo paquete de diálogo, el nombre del tipo de paquete, por ejemplo recursos. Haga clic en Aceptar
  • Derecho Haga clic en el paquete de recursos. Seleccionar Nuevo -> Paquete
  • Bajo Nuevo paquete de diálogo, el nombre del tipo de paquete, por ejemplo imágenes. Haga clic en Aceptar
  • Ahora seleccione la imagen que desea agregar al proyecto, cópielo. Haga clic derecho en los recursos.Imágenes Oferta, dentro del IDE , y seleccione Pegar
  • Usar el último eslabón para comprobar cómo acceder a este archivo ahora en código Java. Aunque para este ejemplo, se podría estar utilizando

    getClass().getResource("/resources/images/myImage.imageExtension");

  • Prensa Shift +F10, para realizar y ejecutar el proyecto. Las carpetas de recursos e imágenes se crearán automáticamente dentro de la carpeta .

Si lo están haciendo de forma manual:

REFERENCIA RÁPIDA EJEMPLO DE CÓDIGO (aunque para más detalle en cuenta, un poco de enlace aclaración adicional):

package swingtest; 

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

/** 
* Created with IntelliJ IDEA. 
* User: Gagandeep Bali 
* Date: 7/1/14 
* Time: 9:44 AM 
* To change this template use File | Settings | File Templates. 
*/ 
public class ImageExample { 

    private MyPanel contentPane; 

    private void displayGUI() { 
     JFrame frame = new JFrame("Image Example"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     contentPane = new MyPanel(); 

     frame.setContentPane(contentPane); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    private class MyPanel extends JPanel { 

     private BufferedImage image; 

     public MyPanel() { 
      try { 
       image = ImageIO.read(MyPanel.class.getResource("/resources/images/planetbackground.jpg")); 
      } catch (IOException ioe) { 
       ioe.printStackTrace(); 
      } 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return image == null ? new Dimension(400, 300): new Dimension(image.getWidth(), image.getHeight()); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawImage(image, 0, 0, this); 
     } 
    } 

    public static void main(String[] args) { 
     Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
       new ImageExample().displayGUI(); 
      } 
     }; 
     EventQueue.invokeLater(runnable); 
    } 
} 
+1

Muchas gracias. Funcionó perfectamente. Estaba usando Eclipse. – exlux15

+0

@trashgod: Gracias por la edición, pero será mejor si agrega su edición encima de la mía, ya que el Java Doc explicó que, de una manera mucho mejor que, lo que hice en mi respuesta, parece que:) –

+0

@nIcEcOw: Honestamente, creo que su arte ASCII es más legible. :-) – trashgod

6

Los archivos de imagen deben estar en el directorio resources/ en su JAR, como se muestra en How to Use Icons y este example para el directorio llamado images/.

5

hay forma en que un mucho más fácil para cargar y configurar una imagen como un icono de marco :

frame.setIconImage(
    new ImageIcon(getClass().getResource("/resources/icon.gif")).getImage()); 

Y eso es todo :)! Ni siquiera tiene que usar un bloque try-catch porque ImageIcon no arroja ninguna excepción declarada. Y debido a getClass().getResource(), funciona tanto desde el sistema de archivos como desde un jar dependiendo de cómo se ejecuta la aplicación.

Si es necesario comprobar si la imagen está disponible, se puede comprobar si la URL devuelto por getResource() es null:

URL url = getClass().getResource("/resources/icon.gif"); 
if (url == null) 
    System.out.println("Could not find image!"); 
else 
    frame.setIconImage(new ImageIcon(url).getImage()); 
Cuestiones relacionadas