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.

JFrame con Imagen de Fondo

El día de ayer, revisando los proyectos de mis alumnos de Segundo Ciclo, me hicieron la pregunta ¿cómo puedo colocar una imagen de fondo en un JFrame? Y para ser sinceros era la primera vez que me enfrentaba a una tarea como esa, luego de una pequeña consulta en Internet encontré un código que me ayudó a responder la pregunta y comparto con todos la solución que planteé a la pregunta. Dedicado a mis alumnos de Segundo Ciclo de Ingeniería en Sistemas Informáticos y computación de la UTPL

Lo primero que hice es crear un paquete en donde ubicaré las imagenes, ésto nos ayuda a no utilizar rutas absolutas, las mismas que traen complicaciones cuando no se respeta los directorios por defecto, mientras que si la imagen es parte de paquete es parte de la aplicación y es independiente de la instalación del programa.

Luego debemos crear un JPanel que contendrá la imagen, un campo de texto, un campo para password y un botón. Dentro del JPanel debemos re-escribir el método paintComponent en donde utilizando el método g.drawImage se dibuja la imagen. Para hacer referencia a la imagen que se encuentra dentro de un paquete lo hacemos con el método getResource, éste mismo método es utilizado para agregar una imagen al botón.

pnlfondo.png

Una vez hecho los trabajos con el JPanel, debemos empezar a trabajar con el JFrame, únicamente lo que corresponde hacer es crear un objeto del tipo JPanel (en mi caso la clase PnlFondo) y agregarlo al JFrame dentro del cual se ha definido con Layout el BorderLayout.

Finalmente comentarles que la fotografía de fondo muestra una construcción que se conoce como Ingapirca, es una construcción Incaica, en donde se desarrollaba las festividades al dios sol.

Si lo que necesitan es poner una imagen a un JDialog, revisen este post.

Pueden revisar el código en GitHub en el siguiente link.

Powered by ScribeFire.