Como poner una imagen de fondo en una ventana hecha en JAVA

Publicado: 13 septiembre 2011 en JAVA

Usaremos la herramienta IDE Netbeans en mi caso 7.0

Y en este crearemos un nuevo proyecto con 2 paquetes dentro quedando de esta manera para que se mas ordenado:

Si se fijan tenemos un JFRAME llamado Ventana y una clase de java llamada JPanelConFondo y mas abajo un paquete que contiene la foto que usaremos para poner en el fondo de nuestra ventana.

Ahora programaremos nuestra JPanelConFondo

package ejemplofotofondo;

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class JPanelConFondo extends JPanel {

    private Image imagen;

    public JPanelConFondo() {
    }

    //constructor con parametro para setear la imagen que queremos mostrar cargandola como ruta
    public JPanelConFondo(String nombreImagen) {
        if (nombreImagen != null) {
            imagen = new ImageIcon(getClass().getResource(nombreImagen)).getImage();
        }
    }
//constructor con parametro para setear la imagen que queremos mostrar cargandola como una imagen almacenada e algun atributo tipo Image
    public JPanelConFondo(Image imagenInicial) {
        if (imagenInicial != null) {
            imagen = imagenInicial;
        }
    }
//de la misma forma que en el primer constructor tengo mi set de la imagen desde una ruta como String  y usando el repaint para actualizar
//el componente de la imagen contenida
//  repaint(): Lo llamamos explícitamente para que cuando cambiemos la imagen esta se muestre inmediatamente.

//  Si el parámetro nuevaImagen es null, veremos el fondo por defecto.

    public void setImagen(String nombreImagen) {
        if (nombreImagen != null) {
            imagen = new ImageIcon(getClass().getResource(nombreImagen)).getImage();
        } else {
            imagen = null;
        }

        repaint();
    }
//igual como el segundo constructor tengo mi set de la imagen desde un atributo tipo Image  y usando el repaint para actualizar
//el componente de la imagen contenida
    public void setImagen(Image nuevaImagen) {
        imagen = nuevaImagen;

        repaint();
    }
//sobreecribo mi metodo paint agregandole los valores de la imagen ya seteada (imagen con su ancho y alto)
    @Override
    public void paint(Graphics g) {
        if (imagen != null) {
            //    g.drawImage: dibujamos la imagen (guardada en el atributo “imagen”) en toda la extension del panel
            g.drawImage(imagen, 0, 0, getWidth(), getHeight(), this);

            //    setOpaque(false): le indicamos al panel que no dibuje su fondo por defecto (sino este taparía la imagen)
            setOpaque(false);
        } else {

            setOpaque(true);
        }

//    super.paint(g): le indicamos al panel que continúe dibujando el resto de los componentes
        super.paint(g);
    }
}

Con esto ya tenemos casi todo el trabajo hecho ahora solo falta invocar a nuestra clase JPanelConFondo en nuestro JFrame en el constructor casteando un Jpanel que añadiremos al diseño.
Aquí el codigo que pondremos en nuestro constructor del JFrame Ventana seteando la imagen en el setImagen, esta puede ser desde el paquete como la que usaremos ahora o directamente desde una ruta de nuestro pc.

public class Ventana extends javax.swing.JFrame {

    /** Creates new form Ventana */
    public Ventana() {
        initComponents();
//aki es donde ponemos nuestra foto como fondo de nuestra ventana//
        ((JPanelConFondo) panelFondo).setImagen("foto/foto.jpg");

    }
//......

Con esto hecho ya solo ejecutamos y tenemos una ventana con un fondo editado o una imagen personalizada.
=D

El pase de diapositivas requiere JavaScript.

comentarios
  1. joel dice:

    Me manda esta exepcion cuando coloco en el metodo main la llamada al setImagen no puede comvertir un JPanel a JPanelConFondo… porque si este esta heredando de Jpanel?

    javax.swing.JPanel cannot be cast to sisconin.JPanelConFondo

  2. cesar dice:

    Gracias, buen aporte

  3. anderson montes dice:

    de donde salio ese panelFondo

  4. Richard Chamba dice:

    hola… la misma pregunta de anderson montes.
    donde ubico ese panelFondo…? no lo encuentro por ningun lado, talvez nos podrias explicar donde ubicarlo.
    Gracias

    • Estimado, no hay que ubicarlo en ningún lado, la clase JPanelConFondo es una clase creada por mi, si aprecias bien el código veras donde esta creada la clase que extiende las propiedades del JPanel normal solo que en esa clase que cree hay un método paint que sobrescribe el por defecto en un JPanel normal de ahi despues es solo cosa de utilizar esta clase JPanelConFondo casteando un Jpanel normal de esta forma ((JPanelConFondo) panelFondo).setImagen(«foto/foto.jpg»);
      donde panelFondo seria un jPanel normal arrastrado desde la paleta de elementos.

      Espero te sirva Saludos =)

  5. JaimeHere dice:

    Entonces, ese «panelFondo» es una variable de instancia dentro de la clase??
    Es decir: tendría esto:
    private javax.swing.JPanel panelFondo;

  6. mike dice:

    disculpa tengo un problema me marca error en el codigo q pusiste para la jframe, no entiendo xq

    • ((JPanelConFondo) panelFondo).setImagen(«foto/foto.jpg»); me imagino que es este código te lo explico

      lo que hago es castear un jpanel normal sacado de la paleta de contenedores swing y lo casteo a una clase JPanelConFondo que extiende de la clase jpanel pero le agrega algunos métodos para dibujar la imagen de fondo por ende al hacer esto:
      ((JPanelConFondo) panelFondo)
      obtengo en un jpanel normal los métodos y funciones de la clase JPanelConFondo y el setImagen es un método creado en la clase JPanelConFondo que solo recibe un string de la ruta de la imagen que queremos de fondo.

      Saludos cualquier duda comenta =)

  7. mike dice:

    public class Ventana extends javax.swing.JFrame {

    /** Creates new form Ventana */
    public Ventana() {
    initComponents();
    //aki es donde ponemos nuestra foto como fondo de nuestra ventana//
    ((JPanelConFondo) panelFondo).setImagen(«Volver-al-Futuro-1.jpg»);

    }

    asi lo tengo, y dice error en panelfondo, tengo la version 7.3 de netbeans

  8. Raidel dice:

    Hola como pedo cambiar el estilo de la ventana??? gracias Saludos desde Cuba

    • existen librerias (.jar) con las cuales puedes cambiar el estilo de la ventana
      de las que conozco buscalas en google asi:
      – substance look and feel
      – synthetica look and feel

      Saludos y gracias por comentar =)

  9. bluezilla dice:

    Puedo usar el JPanelConFondo como un panel normal?

    • Si, aunque estaría demás ya que podrías usar el normal, pero en cualquier caso es la misma funcionalidad salvo que en la clase JPanelConFondo puedo dibujar un fondo(cargar una imagen),en esta misma clase al extender de un panel normal quiere decir que tengo todos los métodos y funcionalidades de la clase panel mas los que agregue en la clase JPanelConFondo.

      Saludos y suerte!
      Recuerda dar like al Facebook Fans Page =)

  10. jhonny dice:

    logre ponerle fondo pero desaparecieron mis botones y demas…puedes ayudarme?

Deja un comentario