Cargando recurso de imagen

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

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.(GUI.java:39) at GUI.main(GUI.java:351) 

La imagen está en el directorio correcto cuya carpeta de “recursos” es la raíz del archivo del proyecto

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

Se puede encontrar más información sobre dónde se encuentra la diferencia entre los dos enfoques en este hilo. Diferentes formas de cargar un recurso.

Para Eclipse:

  • Cómo agregar imágenes a su carpeta de recursos en el proyecto

Para NetBeans:

  • Manejo de imágenes en una aplicación GUI de Java
  • Cómo agregar imágenes al proyecto

Para IntelliJ IDEA:

  • Haga clic derecho en la carpeta src del proyecto. Seleccione Nuevo -> Paquete
  • En Nuevo diálogo de paquete , escriba el nombre del paquete, diga recursos . Haga clic en Aceptar
  • Haz clic derecho en el paquete de recursos . Seleccione Nuevo -> Paquete
  • En Nuevo diálogo de paquete , escriba el nombre del paquete, digamos imágenes . Haga clic en Aceptar
  • Ahora seleccione la imagen que desea agregar al proyecto, cópiela. Haga clic con el botón derecho en el paquete resources.images , dentro del IDE , y seleccione Pegar
  • Utilice el último enlace para comprobar cómo acceder a este archivo ahora en código Java. Aunque para este ejemplo, uno estaría usando

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

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

Si lo haces manualmente:

  • Cómo agregar imágenes a su proyecto
  • Cómo usar icons
  • Una pequeña aclaración adicional , como se muestra en el primer ejemplo de código de esta respuesta.

EJEMPLO DE CÓDIGO DE REFERENCIA RÁPIDO (aunque para más detalles considere, Un pequeño enlace de 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); } } 

Los archivos de imagen deben estar en los resources/ del directorio resources/ en su JAR, como se muestra en Cómo usar icons y este ejemplo para el directorio llamado images/ .

Hay una forma mucho más fácil de cargar y establecer una imagen como un ícono 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 ejecute su aplicación.

Si necesita verificar si la imagen está disponible, puede verificar si la URL devuelta 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());