Incluyendo una imagen de fondo en un JFrame

14May08

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



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

  1. tengo una duda de novato jejejeje x k en el pack pones (lefunes) cual es su funcion alguna clase u es el panel

  2. 2 victor

    pero que no se borren los bottones

  3. 3 victor

    hola amiga interesnte codigo necesito de su ayuda
    por favor me puede decir como pongo una imagen al iniciar el programa
    solo eso0

  4. INTERESANTE SU APORTE GRACIAS, ME HA SERVIDO, una pregunta, se podra llamar jpanel desde los botones para mostrar las imaganes, bueno lo que me interesa es incluir los paneles en el jframe, pero que se adapte al tamaño maximizado, he estado batallando, porque cuando mando a llamarlo, si tenia el JFrame maximizado se reduce al tamaño del JPanel…Espero contar con su ayuda…Gracias y buen aporte

  5. 5 Robinson

    ME SALEE ERROR PORFAVOR AYUDAAAAAAAAA:
    ESTE ES EL ERROR:

    Exception in thread «AWT-EventQueue-0» java.lang.NullPointerException
    at javax.swing.ImageIcon.(ImageIcon.java:167)
    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)
    at java.awt.Component.processMouseEvent(Component.java:6289)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:6054)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4652)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4482)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
    at java.awt.Container.dispatchEventImpl(Container.java:2085)
    at java.awt.Window.dispatchEventImpl(Window.java:2478)
    at java.awt.Component.dispatchEvent(Component.java:4482)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644)
    at java.awt.EventQueue.access$000(EventQueue.java:85)
    at java.awt.EventQueue$1.run(EventQueue.java:603)
    at java.awt.EventQueue$1.run(EventQueue.java:601)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
    at java.awt.EventQueue$2.run(EventQueue.java:617)
    at java.awt.EventQueue$2.run(EventQueue.java:615)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:614)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

  6. 6 patuleco el mas petateco

    muchas gracias por el ejemplo, he encontrado varios aportes respecto al tema, pero el tuyo es el más completo y fácil de entender. 😀

  7. 7 DobleJ

    Este aporte que hicistes en su día me acaba de venir de perlas.
    Me ha llevado un ratillo pero pasito a pasito de codigo ya rula perfecto.
    Menuda ventanuca mas maja que me ha quedauuu 😉

    Gracias!

  8. 8 Pinwii

    ke tal da lo mismo korrerlo en eclipse ????? x ke me bota error en el setimagen :S no c x kee

  9. 9 maricruz

    hola me gusto tu trabajo
    es justo lo que necesito
    pero como le hago
    no me sale la imagen
    ayuda pasame tu codigo descarge el k tenias pero
    no me corre
    ayuda porfis
    me urge

  10. hey muchas gracias por
    el aporte y me da mucho gusto que
    el post este tan activo desde hace tanto tiempo
    ::gracias desde chihuahua

  11. 11 ZeRo

    por ke me sale eze error respondan pliz me urge «cannot find symbol method setImagen(javax.swing.ImageIcon)»

  12. 12 ZeRo

    maaannnn!!
    ayudame me urge trato de poner una imagen
    sin usar un boton sino ke me cargue la imagen automaticamente
    al ejecutar el main pero me da el sig error:
    cannot find symbol method setImagen(java.lang.String)
    aka el codigo de mi programa
    package Fx;
    import java.awt.Image;
    import javax.swing.JFrame;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    public class ventana extends JFrame {

    JPanel ventana=new JPanel();
    JToolBar barradmenu=new JToolBar();
    JButton bsuma=new JButton();
    JButton bresta=new JButton();
    JButton bmulti=new JButton();
    JButton bdiv=new JButton();
    JLabel label1=new JLabel();
    JLabel label2=new JLabel();
    JLabel resultao=new JLabel();
    JTextField caja1=new JTextField();
    JTextField caja2=new JTextField();
    JTextField result=new JTextField();
    JButton bSalir=new JButton();

    public ventana ()
    {
    //Titulo y tamaño de la ventana
    ventana contenedor = new ventana();
    contenedor.setImagen(«knk.gif»);
    setContentPane(contenedor);
    setSize(300,300);
    setTitle(«Operaciones Basicas»);
    InicializaVentana();
    getContentPane().add(ventana);
    ventana.setLayout(null);
    //Configurar botones
    bsuma.setToolTipText(«Este boton suma»);
    bresta.setToolTipText(«Este boton resta»);
    bmulti.setToolTipText(«waaaaa… ya sabez lo que hace este botón «);
    bdiv.setToolTipText(«waaaaaaaa»);
    bSalir.setToolTipText(«Cierra el programa»);

    bsuma.setFocusPainted(false);
    bresta.setFocusPainted(false);
    bmulti.setFocusPainted(false);
    bdiv.setFocusPainted(false);
    bSalir.setFocusPainted(false);

    barradmenu.add(bsuma);
    barradmenu.add(bresta);
    barradmenu.add(bmulti);
    barradmenu.add(bdiv);
    barradmenu.add(bSalir);

    ventana.add(barradmenu);
    barradmenu.setBounds(0,0,299,30);
    label1.setText(«Teclea el número 1»);
    label2.setText(«Teclea el número 2»);
    resultao.setText(«Resultado»);
    label1.setBounds(10,30,90,30);
    caja1.setBounds(10,60,90,30);
    label2.setBounds(10,90,90,30);
    caja2.setBounds(10,120,90,30);
    resultao.setBounds(10,150,90,30);
    result.setBounds(10,180,90,30);

    InicializaComponentes();
    ventana.add(label1);
    ventana.add(caja1);
    ventana.add(label2);
    ventana.add(caja2);
    ventana.add(resultao);
    ventana.add(result);
    setVisible(true);
    //CAMBIO DE CURSOR…
    bsuma.setCursor(new Cursor(Cursor.HAND_CURSOR));
    bresta.setCursor(new Cursor(Cursor.HAND_CURSOR));
    bmulti.setCursor(new Cursor(Cursor.HAND_CURSOR));
    bdiv.setCursor(new Cursor(Cursor.HAND_CURSOR));
    bSalir.setCursor(new Cursor(Cursor.HAND_CURSOR));
    //Iconoz…
    bsuma.setIcon(new ImageIcon(«suma.gif»));
    bresta.setIcon(new ImageIcon(«resta.gif»));
    bmulti.setIcon(new ImageIcon(«multi.gif»));
    bdiv.setIcon(new ImageIcon(«div.gif»));
    bSalir.setIcon(new ImageIcon(«out.gif»));

    }
    private void InicializaComponentes()
    {
    //Manejador de eventos
    java.awt.event.ActionListener ME = new java.awt.event.ActionListener()
    {
    public void actionPerformed(java.awt.event.ActionEvent evt)
    {
    Object Componente = evt.getSource();
    if(Componente==bsuma)
    bsumaActionPerformed(evt);
    if(Componente==bresta)
    brestaActionPerformed(evt);
    if(Componente==bmulti)
    bmultiActionPerformed(evt);
    if(Componente==bdiv)
    bdivActionPerformed(evt);
    if(Componente==bSalir)
    bSalirActionPerformed(evt);
    }
    };
    bsuma.addActionListener(ME);
    bresta.addActionListener(ME);
    bmulti.addActionListener(ME);
    bdiv.addActionListener(ME);
    bSalir.addActionListener(ME);

    }
    private void bsumaActionPerformed(java.awt.event.ActionEvent evt)
    {
    int n1,n2,s;
    n1= Integer.parseInt(caja1.getText());
    n2=Integer.parseInt(caja2.getText());
    s=n1+n2;
    result.setText(«»+s);
    }
    private void brestaActionPerformed(java.awt.event.ActionEvent evt)
    {
    int n1,n2,s;
    n1= Integer.parseInt(caja1.getText());
    n2=Integer.parseInt(caja2.getText());
    s=n1-n2;
    result.setText(«»+s);
    }
    private void bmultiActionPerformed(java.awt.event.ActionEvent evt)
    {
    int n1,n2,s;
    n1= Integer.parseInt(caja1.getText());
    n2=Integer.parseInt(caja2.getText());
    s=n1*n2;
    result.setText(«»+s);
    }
    private void bdivActionPerformed(java.awt.event.ActionEvent evt)
    {
    double n1,n2,s;
    n1= Double.parseDouble(caja1.getText());
    n2=Double.parseDouble(caja2.getText());
    s=n1/n2;
    result.setText(«»+s);
    }
    private void bSalirActionPerformed(java.awt.event.ActionEvent evt)
    {
    //Codigo a ejecutar al dar clic en salir
    this.SalirVentana(null);
    }

    private void InicializaVentana()
    {
    addWindowListener(new WindowAdapter()
    {
    public void windowClosing(WindowEvent evt)
    {
    SalirVentana(evt);
    }
    }
    );
    }
    private void SalirVentana(WindowEvent evt)
    {
    System.exit(0);
    dispose();
    }
    }

  13. 13 Jonathan

    A mi me daba el mismo erros peo lo que tienes que hacer es darle Clean and Built y ya funciona.

    Lefunes de verdad hemano me salvo la vida no sabe todo lo que he luchado por hacer esto.
    GRACIAS!!!

  14. 14 jade

    hola corri el programa en netbeans y me arroja la siguiente exceptio ojala puedas ayudarme, al parecer esta mal ruta de la imagen
    Exception in thread «AWT-EventQueue-0» java.lang.NullPointerException
    at javax.swing.ImageIcon.(ImageIcon.java:138)
    at ar.lefunes.jframeconfondo.JPanelConFondo.setImagen(JPanelConFondo.java:29)
    at ar.lefunes.jframeconfondo.JFrameConFondo.(JFrameConFondo.java:12)
    at ar.lefunes.jframeconfondo.EjemploJFrameConFondo.(EjemploJFrameConFondo.java:6)
    at ar.lefunes.jframeconfondo.EjemploJFrameConFondo$4.run(EjemploJFrameConFondo.java:165)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)

  15. 15 Gabriel

    Cuando abre el proyecto en netbeans tiene un error. lo corregi el error es de los layout

    les asigno absolute desing y caso resuelto. pero si le cambio el nombre al paquete el codigo se explota no se porque tengo una par de dias analizando el codigo y no encuentro la logica el porque da error al asignar la imagen al Jframe cuando le hace click al boton. puedes contestar gracias

  16. 16 Geronimo

    NOMBRE BIEJO, EL QUE SABE SABE. MUY BUENA APORTACION AHORA MIS FRAMES SE VEN MAS BONITOS, MUCHISIMAS GRACIAS

  17. 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.

  18. sos un diossssssssssss!!!

  19. 19 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.

  20. 20 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?

  21. @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

  22. 22 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!!

  23. 23 Youssef

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

  24. @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

    • 26 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.

  25. 27 darko

    El mejor ejemplo q halla podido encontrar. Muchisimas gracias.

  26. 28 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.

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

    Saludos

  28. 30 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)

  29. Post actualizado el 22 de Noviembre del 2008

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

  30. 32 kumenny

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

  31. 33 Leonix

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