JAVA – Añadir background a JPanel

[notice]Desde que este post fue creado han pasado 10 años así que puede que hayan cambiado cosas.[/notice]

Si estamos desarrollando una aplicacion en java y queremos darle algo mas de vida nos encontramos que tanto JFrame como JPanel solo tienen un metodo setBackground(Color), por lo que solo podemos añadirle un color de background pero no la imagen.

Login

Para ello vamos a crear nuestra propia clase y añadir lo necesario para que podamos poner de fondo una imagen.

package Utilities;

import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

/**
 * 
 * Clase que extiende de JPanel y permite poner una imagen como fondo.
 * 
 * @author Guille Rodriguez Gonzalez ( http://www.driverlandia.com )
 * @version 1.0 | 05-2014
 * 
 */

public class JPanelBackground extends JPanel {

	// Atributo que guardara la imagen de Background que le pasemos.
	private Image background;

	// Metodo que es llamado automaticamente por la maquina virtual Java cada vez que repinta
	public void paintComponent(Graphics g) {

		/* Obtenemos el tamaño del panel para hacer que se ajuste a este
		cada vez que redimensionemos la ventana y se lo pasamos al drawImage */
		int width = this.getSize().width;
		int height = this.getSize().height;

		// Mandamos que pinte la imagen en el panel
		if (this.background != null) {
			g.drawImage(this.background, 0, 0, width, height, null);
		}

		super.paintComponent(g);
	}

	// Metodo donde le pasaremos la dirección de la imagen a cargar.
	public void setBackground(String imagePath) {
		
		// Construimos la imagen y se la asignamos al atributo background.
		this.setOpaque(false);
		this.background = new ImageIcon(imagePath).getImage();
		repaint();
	}

}

Ahora cuando vayamos a crear un nuevo JPanel simplemente cambiamos JPanel por JPanelBackground (nombre que le he dado a esta clase) y le ponemos un background. Podemos ponerle un GIF animado, JPG, PNG… pero cuidado con poner imagenes de demasiada resolucion (6000x…) porque depende en que maquina se ejecute puede tardar mas o menos en hacer el repintado.

30 comentarios

Saltar al formulario de comentarios

  1. Disculpa, podrías mandarme tu código?

    1. Si te refieres al código de la aplicación donde use esto, es lo que está aquí colgado.

      Si te refieres a toda la aplicación, lo siento eso no es posible.

  2. ola amigo y en donde pongo la ruta de la imagen que quiero poner

    1. Perdona la tardanza, para ello puedes ponerlo algo asi

      String imagepath = «./bin/Imagenes/imagen.png»;

      Luego solo deberías instanciar una clase del tipo del objeto y pasarle al metodo el imagePath.

  3. y si tengo el jpanel dentro de otro jpanel, en este caso como lo podría hacer

    1. El JPanel que está más adentro, al crearlo renombrás donde pusiste JPanel como JPanelBackground y luego llamás al método .setBackground(«ruta_del_archivo»);
      Sólo hay que agregar una cosa más y es el método .setOpaque(false); para que te deje ver la imagen y no te la tape el fondo del panel.

  4. Saludos amigo, justamente estaba buscando algo así. Sin embargo, a pesar de que se ejecuta sin error, el panel no agarra la imagen, copie tu código tal cual, lo probé aparte, y no me funciona.¿Que podría ser? Ya que no me da error alguno y la imagen esta en el proyecto…
    Gracias de antemano.

    1. Como se puede ver un par de comentarios arriba, indico de donde cargar la imagen.

    2. Puede ser que te falte llamar al método .setOpaque(false);

  5. Guille, sos un genio, mil gracias por este artículo!!! Fue copiarlo, crear una clase JPanelBackground y pegar la clase que vos hiciste tal cual y ya sólo me quedó hacer tres cambios en la clase en la cual había hecho mi JPanel.

    1º Donde generaba mi JPanel, que en mi caso era
    JPanel titulares = new JPanel();
    pasó a llamarse
    JPanelBackground titulares = new JPanelBackground();

    2º Para que se pueda ver la imagen poner en falso el fondo del panel con
    titulares.setOpaque(false);

    3º Llamar al método setBackground y pasarle la ruta de mi imagen
    titulares.setBackground(«campo_de_futbol.jpg»);

    Y me funcionó de maravilla!!! Había visto mil tutoriales por ahí que hacían muy complicado el poder poner una imagen a un JPanel que ya tuviese creado de antemano, pero con el tuyo fue todo muy sencillo.

    Mil gracias por tu artículo nuevamente!!!

    1. Hola! Me alegro que te haya servido. Seguramente se me olvido añadir que se tenia que poner el setOpaque a false al pasarlo del proyecto aquí al blog (copiandolo a mano). Ahora con tu comentario ya esta completo.

      1. ¡Hola! Disculpa la molestia, pero no tengo mucha experiencia en esto de java y he tenido algunos problemas para hacer que aparezca la imagen de fondo. Hice los mismos pasos que Ucha y de todos modos no aparece la imágen que estoy pasando como parametro. El código que hice es una clase sencilla con un main donde creo un JFrame, el panel y dos botones.

        1. Hola, perdona que tarde tanto en contestarte. A ver, estaría bien que subieras el código a algun site donde podamos verlo. La parte de JPanelBackground y donde lo instancias.

          Pastebin puede ser un buen sitio donde colgarlo. Otra opción es hacer un .zip / .tar.gz y subirlo a alguna web tipo Mega.co.nz para que pueda descargarlo y verlo.

  6. http://pastebin.com/cWu7Pk4u
    Esta es la clase que hice.

  7. Buenas, use parte de tu codigo para crear un JPanel con fondo, y funciona de diez, mi unica duda es que no lo puedo hacer andar con una direccion que en vez que sea del disco, sea de un paquete de java donde se encuentra la imagen, ojala puedo ayudarme con esto ultimo.
    Saludos!

  8. Me gustaria saber como pasarle una direccion de una imagen que se encuentra dentro de un paquete de java. Ya he probado casi todas las formas y no logro hacerlo. Gracias

      • Nichttot Gutshäuser el 21/04/2019 a las 0:32
      • Responder

      Simplemente cambia el parámetro String del método setBackground por un URL

      public void setBackground(URL imagePath)

      comprobado!! y grcias a Guille por este aporte.

  9. Muchas gracias por el ejemplo me sirvio perfectamente :D

    1. ^^ me alegro que te haya servido.

  10. Qué tal? vale, he hecho lo que has hecho tu, ahora como hago para que este fondopanel salga en mi pantalla principal(de login por ejemplo)? un saludo y muchas gracias

    1. Tu pantalla principal seguramente sea un JPanel, pues simplemente en vez de JPanel haces que sea un JPanelBackground y le añades la imagen (desde la ruta del disco duro relativa a los .class)

  11. Amigo, el enlace esta caido.
    He intentando de varias formas implementar la clase que construiste pero no obtengo la imagen de fondo y no me arroja ningún error. Puedes subir la implementación de la clase que hiciste? Si puedes muchas gracias amigo

    1. Hola Fernando, perdona la tardanza. La implementación que hice de la clase es la que ves en el post. Como puedes en ver los comentarios, a mucha gente le ha funcionando. También es cierto que cuando cree este post, la versión de Java creo que era la 6. Quizá haya algún método que haya cambiado en el JPanel original del que esta clase hereda, pero no creo que sea eso.

  12. A mi me sale un NullPointer con el Graphics, de donde debería cogerlo?

  13. Hola, después de mucho batallar, y de crear la clase JPanelBackground copiando todo tu código, he conseguido que funcionara introduciendo las líneas que siguen, dentro del método public void run(), que a su vez está dentro del main:

    JPanelBackground panelFondo = new JPanelBackground();
    ventana.setContentPane(panelFondo);
    panelFondo.setBackground(«src/recursos/praga.jpg»);
    panelFondo.setOpaque(false);

    ¡ Muchas gracias por tu tutorial, me ha sido muy útil !

    1. Gracias. Que version de Java usas? Porque en su momento (el del tutorial) creo que estaba hecho con Java 6.

      • Day Herrera el 02/06/2018 a las 0:33
      • Responder

      Brother tendras la aplicacion? ya hice todo y por mas no me genera el background

      1. Por desgracia después de tanto tiempo ya no dispongo de ella. Pero si lees los comentarios, veras que hay a mucha gente que le funciona o dicen si hace falta añadirle algo. Podría deberse a las versiones de Java (cuando yo hice esto, creo que era Java 1.6) que aunque dudo que haya cambiado mucho la cosa, haya que retocar algo del código. Lo dicho, mirate los comentarios que han dejado otros visitantes, quizá te ayuden.

  14. Hola Guille, gracias, la clase me ha funcionado perfecto, pero hasta que he hecho unos cambios. Me explico, en principio he creado un objeto JPanelBackground, le he pasado la imagen y lo he hecho opaco. Funcionaba perfecto cuando JPanelBackground estaba dentro del marco del Frame. Pero ahora he hecho cambios y el JPanelBackground lo he metido en un JPanel que a su vez está en una pestaña JTabbedPane, el problema es que todo se hace y se ve perfecto a excepción de la imagen que se ve pequeñita (10 x 10) y no se despliega por el fondo. Haciendo alguna traza he llegado a la conclusión que las instrucciones del JPanelBackground: (int width = this.getSize().width; y int height = this.getSize().height;) por algún motivo no toma el tamaño del contenedor correcto y queda en un extraño 10 x 10. Si puedes orientarme un poco te agradeceré.

    1. Hola Pablo pues hace mucho tiempo que no me dedico a la parte frontend de Java (mas bien programo backend web y algo de frontend web).

      Supongo que el JTabbedPane tiene algo que ver, prueba a que cuando se muestre esta tab (justo despues de hacer que aparezca (show) pille el tamaño del panel.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.