Para agregar una imagen de fondo a nuestro JFrame lo que hacemos es reemplazar el contenedor de componentes por defecto por uno propio.

El contenedor que utilizaremos será el JPanel con una imagen de fondo que vimos, y el gestionará la imagen de fondo (jpg, png, gif, etc.) que queramos utilizar, quedándonos el código muy simple:

package ar.lefunes.jframeconfondo;

import java.awt.Image;
import javax.swing.JFrame;

public class JFrameConFondo extends JFrame {

    private final JPanelConFondo contenedor = new JPanelConFondo();

    public JFrameConFondo() {
        setContentPane(contenedor);
    }

    public void setImagen(String nombreImagen) {
        contenedor.setImagen(nombreImagen);
    }

    public void setImagen(Image nuevaImagen) {
        contenedor.setImagen(nuevaImagen);
    }
}
JFrame con una imagen de fondo

JFrame con una imagen de fondo

La imagen se redimensionará junto con el JFrame:

JFrame redimensionado

JFrame redimensionado

La imagen de fondo puede ir cambiando cuando deseemos mediante los métodos setImagen()

Cambiando la imagen de fondo

Cambiando la imagen de fondo

En caso de que no cargemos ninguna imagen (o cargemos un null como imagen), el panel contenedor mostrará su fondo por defecto:

JFrame con fondo por defecto

JFrame con fondo por defecto

Se puede descargar el ejemplo de este post de la siguiente dirección (aprox. 38.7 KB): http://lefunes.googlecode.com/files/JFrame_con_imagen_fondo.zip

Espero les sirva.
Saludos



17 Responses to “Incluyendo una imagen de fondo en un JFrame”  

  1. 1 Leonix

    Hola me parece muy intersante tu código pero seria mucho mas visible si pones o cuelgas todo el codigo fuente.

  2. 2 kumenny

    permite decirte que eres la merga en vida atte kuman y benny xD…hiciste un mega parote :)

  3. Post actualizado el 22 de Noviembre del 2008

    @Leonix he dejado el ejemplo para descargar, con el proyecto de NetBeans inclusive

  4. 4 Liv

    no entiendo por que , pero aun no me salen esto:
    at javax.swing.ImageIcon.(ImageIcon.java:138)
    at ar.lefunes.jframeconfondo.JPanelConFondo.setImagen(JPanelConFondo.java:29)
    at ar.lefunes.jframeconfondo.JFrameConFondo.setImagen(JFrameConFondo.java:15)
    at ar.lefunes.jframeconfondo.EjemploJFrameConFondo.btFondo1ActionPerformed(EjemploJFrameConFondo.java:158)
    at ar.lefunes.jframeconfondo.EjemploJFrameConFondo.access$200(EjemploJFrameConFondo.java:4)
    at ar.lefunes.jframeconfondo.EjemploJFrameConFondo$3.actionPerformed(EjemploJFrameConFondo.java:91)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)

  5. @Liv añadí la primera linea de la excepción que me pasas para poder saber cual es la misma

    Saludos

  6. 6 Youssef

    yo he hecho lo mismo, pero de otra manera, incluyendo el codigo en mis clases, pero tengo un problemilla, que no me carga la imagen de fondo, en este caso quiero tener una nada mas, de forma automatica, hay alguna manera de hacerlo sin tener que recurrir a un Botton (en mi caso uso un JRadioButton), y que se cargue la foto directamente como fondo al correr el main.
    gracias por responder.
    saludos.

  7. 7 darko

    El mejor ejemplo q halla podido encontrar. Muchisimas gracias.

  8. @Youssef lo único que tienes que hacer es asignarle la imagen por defecto en el constructor y nada más:

    public class JFrameConFondo extends JFrame {
        public JFrameConFondo() {
            JPanelConFondo contenedor = new JPanelConFondo();
            contenedor.setImagen("path.a.la.imagen.png");
            setContentPane(contenedor);
        }  
    
      //...
    }
    

    Saludos

    • 9 jose

      Muy interesante tu proyecto Le funes, pero tengo un problema, existe la manera de que cargue al mismo la imagen de fondo cuando hago correr el main sin necesidad de botones?.
      Por favor podras poner el codigo completo o el proyecto para descargarlo, soy estudiante de sistemas.

      Saludos.

  9. 10 Youssef

    gracias por responder, pero el mio es un JDesktopPane situado dentro de un JFrame, y no le puedo aplicar el metodo setImagen(..).

  10. 12 Istvan

    hola!!
    aplique tu codigo y funciona a la perfeccion..
    Pero, una pregunta!?.
    como le hago si quiero imagenes de fondo que se encuentra originalmente en disco?.
    por lo visto, no puedo pasarle dicha ruta como parametro al setimagen.
    Ayudame!!

  11. @Istvan tenes que usar el método para pasarle la imagen directamente (que previamente cargaste del disco).

    Si queres modificar el setImagen para pasarle la ruta, dale una mirada al articulo para cargar imágenes para que te dé una idea como realizar modificaciones.

    Saludos

  12. 14 jose

    hola Le funes , tengo un problema, cuando lo convierto a .JAR tu proyecto con netbeans 6.5 , se ubica en la siguiente direccion de mi disco: D:\Descarga Firefox\imagen\JFrame_con_imagen_fondo\dist\JFrame_con_imagen_de_fondo.jar no se me ejecuta el proyecto, ¿a que se debera?

  13. 15 carlos

    realmente muchas gracias…estuve buscando esto por un buen rato….pq lo q yo acostumbraba era a poner una imagen en un jpanel y luego el panel pegarlo al jframe.

  14. sos un diossssssssssss!!!

  15. 17 josw

    hola, ninguno de todos tus codigos con imagenes me sirve me saca exepciones, lo probe en netbeans el ultimo, ayudame porfavor estoy en un proyecto.


Leave a Reply