JDialog con imagen de fondo

Luego de varias preguntas relacionadas al tema (ubicar una imagen de fondo a un JDialog) me puse a trabajar en el tema y les presento una solución, la misma que sigue lo explicado en el post JFrame con Imagen de Fondo.

El proyecto está estructurado como muestra la imagen a continuación:

Imagen con la estructura del proyecto en NetBeans
Imagen con la estructura del proyecto en NetBeans

La descripción de la misma es la siguiente:

  • El JFrame – FrmPrincipal.java tiene un botón cuya función es mostrar el JDialog.
  • El JDialog – JDiFondo.java, muestra un JPanel
  • Un JPanel – PnlFondoJDialog.java, que muestra la imagen y un botón.

Veamos el código más importante de cada uno de los elementos, empecemos por el JFrame –  FrmPrincipal.java

public class FrmPrincipal extends javax.swing.JFrame {
   /** Creates new form FrmPrincipal */
   public FrmPrincipal() {
      initComponents();
   }

   private void btnMostrarActionPerformed(java.awt.event.ActionEvent evt) {
      int ancho = 300;
      int alto = 300;
      JDiFondo jdiFondo = new JDiFondo(this, true);
      jdiFondo.setSize(ancho, alto);
      jdiFondo.setPreferredSize(new Dimension(ancho, alto));
      jdiFondo.configurar();
      jdiFondo.setVisible(true);
   }
   ...
}

Usamos setSize y jdiFondo.setPreferredSize, el primero nos permite que la imagen y la ventana del JDialog tengan el mismo tamaño, también se invoca la método configurar del JDialog que lo explicaremos más adelante.

Ahora veremos el JDialog – JDiFondo.java

public class JDiFondo extends javax.swing.JDialog {
   /** Creates new form JDiFondo */
   public JDiFondo(java.awt.Frame parent, boolean modal) {
      super(parent, modal);
      initComponents();
   }

   public void configurar(){
      PnlFondoJDialog pnlFondo = new PnlFondoJDialog();
      pnlFondo.setSize(this.getSize());
      this.add(pnlFondo, BorderLayout.CENTER);
      this.pack();
   }
   ...
}

Lo que debemos destacar de está clase es el método configurar, que no existía cuando trabajamos en el post anterior (ubicar la imagen en un JFrame – JFrame con Imagen de Fondo) es necesario éste método por que si ubicamos sus líneas de código en el constructor el panel toma la medida por defecto del JDialog ya que hasta ese momento no le asignamos un tamaño al JDialog (Ver el método btnMostrarActionPerformed del JFrame).

Finalmente el JPanel – PnlFondoJDialog.java este no ha cambiado y sigue el mismo principio que se mencionó en el post: JFrame con Imagen de Fondo.

public class PnlFondoJDialog extends javax.swing.JPanel {
   /** Creates new form PnlFondo */
   public PnlFondoJDialog() {
      initComponents();
   }

   @Override
   public void paintComponent(Graphics g){
      Dimension tamanio = getSize();
      ImageIcon imagenFondo = new ImageIcon(getClass().
      getResource("/los/imagen/DSC00857.jpg"));
      g.drawImage(imagenFondo.getImage(), 0, 0,
      tamanio.width, tamanio.height, null);
      setOpaque(false);
      super.paintComponent(g);
   }
   ...
}

El resultado final lo pueden ver en la siguiente imagen:

Ejemplo de un JDialog con imagen de Fondo
El resultado final

El código completo lo pueden descargar aquí.

Espero que les ayude

Obtener imagenes desde una base datos

Hace algún tiempo escribí el post JFrame con Imagen de Fondo y surgieron varios comentarios en donde se preguntaban ¿cómo obtener, desde una base de datos, las imágenes? Hace una semana respondí a ésta pregunta, pero creo que es necesario hacer un nuevo post con éste tema.

Imaginemos que tenemos una base de datos que contiene una tabla llamada IMAGENES, que tiene una columna tipo BLOB (denominada FOTO) y un identificador (denominado ID). Para consultar desde la base datos la foto podemos hacer la siguiente consulta:

ResultSet rs = stmt.executeQuery(«SELECT FOTO FROM IMAGENES WHERE ID = 1»);

rs.next(); //Esto hacía falta

byte[] img = rs.getBytes(«FOTO»);

Debido a que un campo tipo BLOB almacena información en formato binario utilizamos un arreglo de bytes para leerlo. Hasta aquí he leído desde la base de datos una imagen con bytes, pero ¿qué debo hacer para convertirla en imagen y agregarla a un botón?

Para responder a ésta pregunta utilizaré un código que encontré en un artículo publicado en el sitio oficial de NetBeansEnd-to-End Web Service Creation and Consumption in NetBeans IDE 6.0

private Image getImage(byte[] bytes, boolean isThumbnail) throws IOException {

ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
Iterator readers = ImageIO.getImageReadersByFormatName(”jpeg”);
ImageReader reader = (ImageReader) readers.next();
Object source = bis; // File or InputStream
ImageInputStream iis = ImageIO.createImageInputStream(source);
reader.setInput(iis, true);
ImageReadParam param = reader.getDefaultReadParam();
if (isThumbnail) {

param.setSourceSubsampling(4, 4, 0, 0);

}
return reader.read(0, param);

}
El código anterior recibe como uno de sus parámetros, un arreglo de bytes y devuelve un objeto tipo Image. Entonces se podría completar el código así:

Image imagen = getImage(img, false);
Icon icon = new ImageIcon(imagen);
btnBoton.setIcon(icon);

Y con ésto tendríamos un botón con un icono que se obtuvo de una base de datos. Espero que sea de su ayuda.

Powered by ScribeFire.