Estoy tratando de agregar un JPanel con una imagen en ella. Estoy usando ImageIO.leer para obtener la ruta pero me da un IOException diciendo : no puede leer el archivo de entrada

La imagen se llama TCHLogo. Es un PNG dentro de un ‘res’ carpeta dentro de mi proyecto.

Si hay alguna mejor manera de mostrar esta imagen, por favor también menciona!

Aquí está el código para mi JPanel:

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class ImagePanel extends JPanel{

    private BufferedImage image;

    public ImagePanel() {
        try {                
           //THIS LINE BELLOW WAS ADDED
           image = ImageIO.read(getClass().getResourceAsStream("res/TCHLogo.png"));
        } catch (IOException ex) {
             //handle exception...
            System.out.println(ex);
        }
     }

     @Override
     public void paintComponent(Graphics g) {
         super.paintComponent(g);  //THIS LINE WAS ADDED
         g.drawImage(image, 0, 0, null); //see javadoc for more info on the parameters
     }

}

Aquí es ¿cómo puedo añadir el JPanel en mi Subprograma:

ImagePanel appletRunningPanel;
appletRunningPanel = new ImagePanel();
appletRunningPanel.setSize(300, 300);
appletRunningPanel.validate();
add(appletRunningPanel);

EDITAR
He creado una carpeta dentro de la papelera, que la aplicación comienza a verse en la actualidad..
la carpeta se llama res y la imagen es en su interior..

Ahora me sale el siguiente IOException al ejecutar la línea:

image = ImageIO.read(getClass().getResourceAsStream("res/TCHLogo.png"));

Aquí está el registro de errores:

java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(ImageIO.java:1338)
    at surprice.applet.ImagePanel.<init>(ImagePanel.java:17)
    at surprice.applet.MainClass.init(MainClass.java:41)
    at sun.applet.AppletPanel.run(AppletPanel.java:436)
    at java.lang.Thread.run(Thread.java:679)
InformationsquelleAutor Rakso | 2011-11-13

2 Comentarios

  1. 4

    Probable es que la imagen de la ruta de acceso del archivo no es correcto relativa al directorio de usuario. Para averiguar dónde Java se está empezando a ver, donde el directorio de usuario es decir, algo parecido a esta línea de código en algún lugar en su programa:

    System.out.println(System.getProperty("user.dir"));

    Tal vez estaríamos mejor obtener la imagen como un InputStream obtenidos a partir de un recurso y no como un archivo. por ejemplo,

    image = ImageIO.read(getClass().getResourceAsStream("res/TCHLogo.png"));

    Este será el aspecto de la imagen en la ruta de acceso relativa a la ubicación de los archivos de clase, y de hecho esto es lo que debe hacer si su imagen se encuentra en el archivo jar.

    Editar 2

    Como un aparte, a menudo es necesario llamar primero al super del método paintComponent antes de hacer cualquiera de su propio dibujo, así como para permitir el necesario mantenimiento de la casa se puede hacer, tales como deshacerse de «sucio» bits de imagen. por ejemplo, cambiar esta:

     public void paintComponent(Graphics g) {
         g.drawImage(image, 0, 0, null); 
     }

    a este:

     public void paintComponent(Graphics g) {
         super.paintComponent(g); //**** added****
         g.drawImage(image, 0, 0, null); 
     }
    • Cómo iba yo a hacer eso?
    • ver editar.
    • Empieza a buscar en el espacio de trabajo/Subprograma/bin.. tal vez me puede crear una carpeta en la carpeta bin del proyecto.. Pero estas imágenes también .archivo jar cuando me exportación?
    • ellos estarán en el frasco si se les pone en el frasco. ¿Qué estás usando para editar sus programas, un IDE? Si muchos se han asistentes para ayudarle a crear un archivo jar y para agregar los archivos seleccionados y los recursos.
    • Cuando trato de usar la línea de código (imagen=ImageIO.leer(getClass().getResourceAsStream(«res/TCHLogo.png»));) me sale este mensaje de error: java.lang.IllegalArgumentException: entrada == null! en javax.imageio.ImageIO.leer(ImageIO.java:1338) en surprice.applet.ImagePanel.<init>(ImagePanel.java:17) en surprice.applet.MainClass.init(MainClass.java:41) en el sol.applet.AppletPanel.ejecutar(AppletPanel.java:436) en java.lang.Subproceso.de ejecución(Thread.java:679)
    • donde está el archivo de imagen en relación a sus archivos de clase?
    • He resuelto problema similar mediante el uso de getClass().getClassLoader().getResourceAsStream(path) lugar

  2. 2

    He escrito este ImagePanel clase que yo uso para este ámbito :

    public class ImagePanel extends JPanel {
    
        private static final long serialVersionUID = 7952119619331504986L;
        private BufferedImage image;
    
        public ImagePanel() { }
    
        public ImagePanel(String resName) throws IOException {
            loadFromResource(resName);
        }
    
        public ImagePanel(BufferedImage image) {
            this.image = image;
         }
    
        @Override
        public void paintComponent(Graphics g) {
            g.drawImage(image, 0, 0, null); //see javadoc for more info on the parameters
    
        }
    
        public BufferedImage getImage() {
            return image;
        }
    
        public void setImage(BufferedImage image) {
            this.image = image;
        }
    
        /**
         * Load the Image from a File
         * @param path image name and path
         * @throws IOException
         */
        public void loadFromFile(String path) throws IOException {
            image = ImageIO.read(new java.io.File(path));
        }
    
        /**
         * Load Image from resource item
         * @param resName name of the resource (e.g. : image.png)
         * @throws IOException
         */
        public void loadFromResource(String resName) throws IOException { 
            URL url = this.getClass().getResource(resName);
            BufferedImage img = ImageIO.read(url);
    
            image = img;
        }
    }

    Entonces yo uso el ImagePanel de esta manera :

     //Inizialization of the ImagePanel
     ImagePanel panelImage = new ImagePanel();
    //Try loading image into the image panel
            try {
                panelImage.loadFromResource("/Resources/someimage.png");
            } catch (java.io.IOException e) {
                    //Handling Exception
            }
    • como es, su paintComponent la aplicación no es válida: por defecto JPanel informes a ser opaco, como tal, garantiza a llenar cada píxel. Plus: se debe implementar getXXSize para hacer la vida de LayoutManagers más fácil 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here