Si necesitas un código de programación en específico, escríbeme al formulario de contacto.

BUSCA TU CÓDIGO


BUSCA MÁS CÓDIGOS DE PROGRAMACIÓN AQUÍ:

Código JAVA: Cargar una imagen en un JLabel de un formulario, utilizando JFileChooser


El presente código es usado para poder cargar y mostrar una imagen y/o foto (guardada en nuestra PC), en un JLabel ubicado en nuestro formulario.
En esta ocasión se usarán 2 formularios, el primer formulario lo llamaremos Formulario1, en este se ubica el label al cual llamaremos "lblFoto", y un botón cuyo nombre será "btnCargarfoto", y por último; el segundo formulario el cual llamaremos "CargarFoto", a este formulario le agregaremos un JFileChooser, y lo llamaremos "jfchCargarfoto". 
Ya teniendo todo claro entremos en materia: 

File fichero; 
Método del botón btnCargarfoto:
private void btnCargarfotoActionPerformed(java.awt.event.ActionEvent evt) {                                              

    int resultado;

    CargarFoto ventana = new CargarFoto();

    FileNameExtensionFilter filtro = 
    new FileNameExtensionFilter("JPG y PNG","jpg","png");

    ventana.jfchCargarfoto.setFileFilter(filtro);

    resultado= ventana.jfchCargarfoto.showOpenDialog(null);


    if (JFileChooser.APPROVE_OPTION == resultado){


        fichero = ventana.jfchCargarfoto.getSelectedFile();

        
        try{

                ImageIcon icon = new ImageIcon(fichero.toString());

                Icon icono = new ImageIcon(icon.getImage().
                getScaledInstance(lblFoto.getWidth(), lblFoto.getHeight(), 
                Image.SCALE_DEFAULT));

                lblFoto.setText(null);

                lblFoto.setIcon( icono );



        }catch(Exception ex){


                JOptionPane.showMessageDialog(null, 
                "Error abriendo la imagen "+ ex);


        }


    } 
 
}                                             


Instrucciones y Recomendaciones 

1- Copia y pega el código resaltado en amarillo, dentro del método del botón "btnCargarfoto" (botón que usarás para realizar la operación de buscar, seleccionar y abrir la imagen que deseas mostrar en la etiqueta), y el código resaltado en azul, lo debes copiar y pegar encima del método del botón "btnCargarfoto"; es decir que quede por fuera de dicho método.




NOTA: Para evitar que te salga algún error en el código, deberás importar las librerías necesarias, en este caso:
import javax.swing.filechooser.FileNameExtensionFilter;
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.ImageIcon;
import javax.swing.Icon;
import java.awt.Image;
Ten presente que estas líneas de código deben ir ubicadas, debajo de la línea que define el nombre del paquete (package Formularios;), y por encima de la línea que define el nombre de nuestra Clase (public class Formulario...).

2- En el código resaltado en azul, lo que hacemos es crear una variable de tipo File, y la razón por la que se coloca afuera del método del botón es porque la utilizaremos cuando necesitemos guardar la imagen en una base de datos, ya que si se crea adentro del método no la podremos usar en otros métodos:
File fichero;

3- Concentrándonos en el código resaltado en amarillo, lo primero que se realiza es crear una variable de tipo int:

int resultado;

4- Luego proseguimos instanciando un objeto de la clase "CargarFoto", y que corresponde al formulario donde se encuentra nuestro JFileChooser:

CargarFoto ventana = new CargarFoto();

5- Ahora instanciamos un objeto de la clase "FileNameExtensionFilter", la cual trae JAVA por defecto; con esto lo que hacemos es crear un filtro para decirle a nuestro JFileChooser que tipo de archivos debe cargar, si observamos bien esta línea de código en la parte ("JPG y PNG","jpg","png"), lo que hacemos es darle una descripción o nombre al filtro y seguidamente separadas por comas declaramos las extensiones que se pueden cargar:

FileNameExtensionFilter filtro = 
new FileNameExtensionFilter("JPG y PNG","jpg","png");

6- Usaremos el objeto "ventana" que instanciamos al principio del código, para así acceder al JFileChooser (este debe tener la característica de public static) del formulario "CargarFoto", y seguidamente le asignamos el filtro que creamos en el punto anterior:

ventana.jfchCargarfoto.setFileFilter(filtro);

7- Seguidamente procedemos a acceder nuevamente a nuestro JFileChooser y hacerlo visible al usuario, dicho usuario tendrá la posibilidad de abrir o no un archivo, por lo cual cuando se dé clic sobre el botón "Abrir" o "Cancelar" esto devolverá un número entero el cual guardaremos en nuestra variable "resultado" de tipo int que creamos al iniciar este código:

resultado= ventana.jfchCargarfoto.showOpenDialog(null);

8- Crearemos un condicional "if", cuya condición será verificar que el valor almacenado en nuestra variable "resultado", sea igual al valor que devuelve el trozo de código JFileChooser.APPROVE_OPTION, este código equivale cuando el usuario carga un archivo y da clic en el botón "Abrir":

if (JFileChooser.APPROVE_OPTION == resultado){
 
 
}

9- Guardaremos en nuestra variable "fichero" de tipo File, el archivo que el usuario haya cargado o seleccionado desde el JFileChooser (este código va dentro del condicional if del punto anterior):

fichero = ventana.jfchCargarfoto.getSelectedFile();

10- Creamos un try/catch para ejecutar una serie de códigos que podrían causar alguna excepción y/o error ya sea por fallas del sistema o del archivo que se haya seleccionado (este código va dentro del condicional if que se mencionó en el punto 8):

try{
 
}catch(Exception ex){
 
}

11- Instanciamos un objeto de la clase "ImageIcon", que trae JAVA por defecto, y le pasaremos como parámetro nuestra variable "fichero", la cual debemos convertir a String fichero.toString() (este código va dentro del try que se mencionó en el punto anterior):

ImageIcon icon = new ImageIcon(fichero.toString());

12- Instanciamos un objeto de la clase "Icon", que trae JAVA por defecto; aunque esta línea de código es un poco extensa, lo que se hace en ella básicamente es coger la imagen que guardamos en la variable "icon" (mencionada en el punto anterior) y redimensionar su tamaño, para ello nos basamos en el tamaño del JLabel "lblFoto"; ya que si observamos bien el código lo que hacemos es obtener el ancho lblFoto.getWidth() y el alto lblFoto.getHeight() de dicho JLabel, y además se emplea un algoritmo de remuestreo  Image.SCALE_DEFAULT (este código va dentro del try que se mencionó en el punto 10):

Icon icono = new ImageIcon(icon.getImage().
             getScaledInstance(lblFoto.getWidth(),lblFoto.getHeight(), 
             Image.SCALE_DEFAULT));

13- Procederemos a quitar cualquier texto que haya en nuestro JLabel "lblFoto", y en la siguiente línea de código le asignaremos la imagen que el usuario haya cargado a través del JFileChooser (este código va dentro del try que se mencionó en el punto 10):

lblFoto.setText(null);

lblFoto.setIcon( icono );

14- En el dado caso de que ocurra algún error o excepción al tratar de cargar la imagen, procederemos a mostrar a través de una ventana de aviso el error que se produjo (este código va dentro del catch que se mencionó en el punto 10):

JOptionPane.showMessageDialog(null, 
"Error abriendo la imagen "+ ex);

15- Ahora sólo basta con ejecutar tu proyecto y hacer las respectivas pruebas.
 
16- Si deseas saber cómo emplear el código anterior, usando un entorno gráfico como Netbeans IDE, puedes visitar el siguiente enlace: 


Si te fue de gran ayuda esta información, no olvides compartirla con tus amigos.
Si tienes dudas o sugerencias al respecto; puedes dejarnos tus comentarios.

Bendiciones...





Comparte este código


12 comentarios:

  1. disculpa me aparece un error aqui ?
    Icon icono = new ImageIcon(icon.getImage().getScaledInstance(lblFoto.getWidth(), lblFoto.getHeight(), Image.SCALE_DEFAULT));
    //ajustar el tamaño de la imagen para que quede del mismo tamaño del laber "importar todos los archivos"
    // lblfoto nos mostrara la imagen obtendremos el ancho lo alto y el parametro sera un algoritmo de remoestreo

    lblFoto.setText(null);

    lblFoto.setIcon( icono );

    }catch(Exception es){
    //esto es por si producce algun error si se ejecuta
    //para que nos avise que error se produce

    JOptionPane.showMessageDialog(null, "UPS!! Error abriendo la imagen "+ ex);
    }
    }


    """"aun no se programar y la verdad ando aprendiendo unos me dicen que me falta una clase o no tengo una variable me podrias ayudar ?""""

    ResponderEliminar
    Respuestas
    1. Saludos estimado, ya actualizamos la entrada, verifica el paso #1, ya que lo más probable es que te falte hacer el importe de las librerías que necesitas para realizar esta operación.
      Bendiciones...

      Eliminar
  2. Disculpa me aparece en rojo y este texto
    Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Uncompilable source code - Erroneous sym type: JOptionPane.showMessageDialog
    at aplicaccion1.Formulario1.jButton1ActionPerformed(Formulario1.java:137)
    at aplicaccion1.Formulario1.access$100(Formulario1.java:20)
    at aplicaccion1.Formulario1$2.actionPerformed(Formulario1.java:54)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6527)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    at java.awt.Component.processEvent(Component.java:6292)
    at java.awt.Container.processEvent(Container.java:2234)
    at java.awt.Component.dispatchEventImpl(Component.java:4883)
    at java.awt.Container.dispatchEventImpl(Container.java:2292)
    at java.awt.Component.dispatchEvent(Component.java:4705)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
    at java.awt.Container.dispatchEventImpl(Container.java:2278)
    at java.awt.Window.dispatchEventImpl(Window.java:2739)
    at java.awt.Component.dispatchEvent(Component.java:4705)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
    at java.awt.EventQueue.access$400(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:697)
    at java.awt.EventQueue$3.run(EventQueue.java:691)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:719)
    at java.awt.EventQueue$4.run(EventQueue.java:717)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at ----mi profesor no me ayuda ademas que no se ingles porfa ayudame :3-----

    ResponderEliminar
  3. ESTA ES LA CONTINUACCION
    java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:109)
    at java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:184)
    at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:229)
    at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:227)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:227)
    at java.awt.Dialog.show(Dialog.java:1084)
    at java.awt.Component.show(Component.java:1656)
    at java.awt.Component.setVisible(Component.java:1608)
    at java.awt.Window.setVisible(Window.java:1014)
    at java.awt.Dialog.setVisible(Dialog.java:1005)
    at aplicaccion1.Formulario1$3.run(Formulario1.java:187)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
    at java.awt.EventQueue.access$400(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:697)
    at java.awt.EventQueue$3.run(EventQueue.java:691)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

    ResponderEliminar
  4. Disculpa, yo tengo un código así aplicado en un "proyecto" en netbeans, solo que ocupo varios frames conectados entre sí formando mi "menú", quería saber si hay alguna forma de que la imagen cargada en el jlabel se quede ahí hasta que vuelvan a "cargar imagen", ya que al cambiar de frame y volver al que contiene el jlabel este se encuentra vacío de nuevo, gracias de antemano, te agradeceré cualquier ayuda que puedas proporcionarme :)

    ResponderEliminar
    Respuestas
    1. Saludo Cordial.

      Un par de preguntas:
      Cuando regresas al frame, ¿los demás campos que este posee también se encuentran vacíos? o
      ¿Sólo sucede con el JLabel?

      Si te sucede lo que planteo en el primer interrogante, lo más probable es que estés instanciando nuevamente tu JFrame.
      En el caso de que sólo te pase con el JLabel, verifica que no haya una línea de código en el Frame anterior, la cual te esté "seteando" tu Etiqueta.

      Me avisas para saber cómo te fue, si sigues con el inconveniente o si lo solucionaste me comentas :)

      Bendiciones...

      Eliminar
    2. Saludos, gracias por contestar & de hecho solo tiene el jlabel, esta muy sencillo ese frame pero pues solo ocurre con el label, este es el código de como agrego y cargo la imagen...

      File fichero;


      private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

      int resultado;
      CargarConvocatoria ventana = new CargarConvocatoria();
      FileNameExtensionFilter filtro = new FileNameExtensionFilter("JPG y PNG", "jpg", "png");
      ventana.jfchCargarConvocatoria.setFileFilter(filtro);
      resultado = ventana.jfchCargarConvocatoria.showOpenDialog(null);

      if (JFileChooser.APPROVE_OPTION == resultado){

      fichero = ventana.jfchCargarConvocatoria.getSelectedFile();

      try{

      ImageIcon icon = new ImageIcon(fichero.toString());
      Icon icono = new ImageIcon(icon.getImage().getScaledInstance(Convocatoria.getWidth(), Convocatoria.getHeight(), Image.SCALE_DEFAULT));

      //BORRAR TEXTO
      Convocatoria.setText(null);
      //MOSTRAR IMAGEN
      Convocatoria.setIcon(icono);

      }//TRY
      catch (Exception ex){

      JOptionPane.showMessageDialog(null, "¡ERROR AL CARGAR LA IMAGEN!"+ex, "-CARGAR CONVOCATORIA-", JOptionPane.ERROR_MESSAGE);

      }//CATCH



      }//IF

      }

      Eliminar
    3. Pero al cargar la imagen ¿si te la muestra en el JLabel?, necesitaría ver cómo estás haciendo el paso de un JFrame a otro, allí es donde debe estar el inconveniente.
      Si quieres envíame el proyecto completo al correo: desarrollouh@hotmail.com

      Eliminar
  5. Pues si muestra la imagen en el label, solo que al regresar al frame anterior y volver a abrir el frame con el label ya esta vacío, este es el código del botón que regresa al frame "principal"...

    MenuPrincipal obj = new MenuPrincipal();
    obj.setVisible(true);
    dispose();

    ResponderEliminar
    Respuestas
    1. Revisando un poco tu proyecto, te doy los siguientes consejos:

      En la parte de tu ComboBox (ubicado en MenuPrincipal) desde el cual abres el formulario de Mostrar convocatoria, el condicional if debe quedar así:

      if(x.getSelectedItem().equals(mos2)){

      obj.setVisible(true);

      }

      Ahora la línea:
      MostrarConvocatoria obj = new MostrarConvocatoria();

      Debes colocarla fuera del método de tu ComboBox; es decir, encima de la línea de código:
      private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {

      En el caso de tu formulario "MostrarConvocatoria", en el método del botón Salir, sólo debes colocar lo siguiente:

      dispose();

      Eliminar
    2. Gracias pero el detalle esta en el funcionamiento del frame"Mostrar Convocatoria" ya que todo funcionaba bien antes de que hiciera eso, de no ser posible el lograr lo que quiero de label, no hay otra forma de que el usuario suba una imagen y esta permanezca durante el tiempo de ejecucion?
      Gracias :)

      Eliminar
    3. Hola, ¿realizaste los cambios que te sugerí y no te funciona el formulario? o que problema se te está presentando.
      Yo hice pruebas acá y funciona de maravilla :)
      Tú me enviaste los archivos de tu proyecto, pero necesito que me envíes el proyecto completo; es decir, los paquetes y todo, para realizar el cambio y devolverte el proyecto para que lo ejecutes y hagas las pruebas y luego te explico que fue lo que hice.

      Eliminar