martes, 24 de enero de 2012

Imagen de fondo en un JDesktopPane

Si trabajamos con objetos JDesktopPane, talvez deseamos poner una imagen personalizada como fondo.
Como la que se ve en la siguiente imagen de muestra de mi aplicación JSivet.



Para lograr ese efecto, podemos crear una clase que herede a JDesktopPane como la siguiente:

public class Escritorio extends JDesktopPane{

       private static Image IMG=new ImageIcon(getClass().getResource("img/logojsivet.png")).getImage();

        public void paintChildren(Graphics g){
            g.drawImage(IMG, 0, 0, getWidth(), getHeight(), this);
            super.paintChildren(g);
        }
    }

He decidido crear un objeto Image de tipo statico privado, aunque se puede crear como un objeto de clase, este representará la imagen que deseamos dibujar como fondo.
Debemos sobreescribir el método paintChildren
  1. Dibujamos la imagen sobre el componente que inicie en las coordenadas x=0, y=0 y se extienda por todo el ancho ("getWitdh()") y el alto ("getHeight()"), 
  2. Invocamos al método paintChildren mediante la palabra reservada super, haciendo referencia al paintChlidren de su super clase la cual es JDesktopPane.

8 comentarios:

  1. muy padre y todo, pero me gustaría saber exactamente a donde hace referencia esto:"img/logojsivet.png", ¿es dentro del paquete, o creas un paquete llamado img?

    ResponderEliminar
  2. si, en realidad "img" es un sub paquete y dentro de este se ubica la imagen "logojsivet.png", en realidad con getClass().getResource(), obtienes la ruta absoluta dentro del paquete, por lo tanto, tienes acceso a todos los recursos dentro de un archivo jar.
    Si la imagen se encontrase en un super paquete (directorio superior a la clase actual), podrias hacerlo como un ../ antes del "img/logojsivet.png".
    Pruebalo y cualquier cosa me avisas.

    ResponderEliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  4. me gustaria ver un ejemplo de su aplicacion... si fuera posible

    ResponderEliminar
  5. Disculpa mi ignorancia pero cual o donde es el evento donde esto se manda a ejecutar?

    ResponderEliminar
    Respuestas
    1. En realidad no existe ningún evento, el secreto está en sobreescribir el método public void paintChildren(Graphics g) dónde primero se dibuja la imagen y luego sus componentes o ventanas hijas (super.paintChildren(g))

      Eliminar
  6. trate de hacer tu codigo pero no me funciono, ya llevo dos semanas y nada. si puedes enviame un ejemplo a edjburgos@hotmail.com, saludos desde ecuador. gracias

    ResponderEliminar