Aplicación MDI (JDesktopPanel) con imagen de fondo
Para conseguir colocar una imagen de fondo en una aplicación MDI (que utiliza JDesktopPane) realizamos un proceso similar al que realizamos para hacer lo mismo con un JPanel, es decir, sobrescribir el método paint, dibujando la imagen del tamaño del desktop panel, y luego sobre esta imagen el resto de las ventanas internas (JInternalFrame)
Código:
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JPanel;
//...
public class DesktopConFondo extends JDesktopPane {
private Image imagen;
//...
@Override
public void paint(Graphics g) {
g.drawImage(imagen, 0, 0, getWidth(), getHeight(),
this);
setOpaque(false);
super.paint(g);
}
//...
}
Como podemos ver en el método paint hemos especificado tres lineas:
- g.drawImage: dibujamos la imagen (guardada en el atributo “imagen”) en toda la extension del panel
- setOpaque(false): le indicamos al panel que no dibuje su fondo por defecto (sino este taparía la imagen)
- super.paint(g): le indicamos al panel que continúe dibujando el resto de los componentes

JDesktopPanel con imagen de fondo
Redimensionado
Una cosa importante a la hora de dibujar la imagen es que lo hacemos desde el pixel [0,0] hasta el pixel [getWidth(), getHeight()], esto indica que cubrirá toda la extensión del panel en ese momento, permitiéndonos que la imagen acompañe una redimension del panel.

Redimensionando MDI
Algunas Variaciones
Una variación puede ser que el panel dibuje la imagen solo si está asignada a la variable “imagen”, en caso contrario (imagen == null) se dibujara el fondo por defecto:
//...
@Override
public void paint(Graphics g) {
if (imagen != null) {
g.drawImage(imagen, 0, 0, getWidth(), getHeight(),
this);
setOpaque(false);
} else {
setOpaque(true);
}
super.paint(g);
}
//...
La carga de la imagen la podemos realizar en el constructor:
//...
public DesktopConFondo(Image imagenInicial) {
if (imagenInicial != null) {
imagen = imagenInicial;
}
}
//...
o que la misma pueda ir variando:
//...
public void setImagen(Image nuevaImagen) {
imagen = nuevaImagen;
repaint();
}
//...

Cambiando la imagen dinámicamente
De este método podemos observar dos cosas:
- 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.

Fondo por defecto (imagen == null)
Código
Este es el código del panel completo:
package ar.lefunes.mdiconimagen;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JDesktopPane;
public class DesktopConFondo extends JDesktopPane {
private Image imagen;
public DesktopConFondo() {
}
public DesktopConFondo(String nombreImagen) {
if (nombreImagen != null) {
imagen = new ImageIcon(
getClass().getResource(nombreImagen)
).getImage();
}
}
public DesktopConFondo(Image imagenInicial) {
if (imagenInicial != null) {
imagen = imagenInicial;
}
}
public void setImagen(String nombreImagen) {
if (nombreImagen != null) {
imagen = new ImageIcon(
getClass().getResource(nombreImagen)
).getImage();
} else {
imagen = null;
}
repaint();
}
public void setImagen(Image nuevaImagen) {
imagen = nuevaImagen;
repaint();
}
@Override
public void paint(Graphics g) {
if (imagen != null) {
g.drawImage(imagen, 0, 0, getWidth(), getHeight(),
this);
setOpaque(false);
} else{
setOpaque(true);
}
super.paint(g);
}
}
Ejemplo Descargable
Puedes descargar el ejemplo completo desde (aprox. 38,3 KB): http://lefunes.googlecode.com/files/MDI_imagen_fondo.zip
Posted in Java, Swing Tagged: image, imagen, Java, jdesktoppanel, Swing