ichiba.ch Download the KAYWA Reader!
En | De | Fr

Feed2Mobile

Le Funes - 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

Note: this is how this feed will look on your mobile device.

Get mobile!

This QR Code will let any user whose mobile phone is equipped with a QR Code Reader to easily reach and bookmark the mobile version of «Le Funes»

To add this QR Code to your Blog or Website, simply copy-paste the following Javascript blurb into your Blog template.

Feed2Mobile v1.0-BETA3 CONTACT US: KAYWA // TECHNOPARKSTRASSE 1 // 8005 ZUERICH // SWITZERLAND // Support