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

Combinando JavaFX y Swing

Como ya lo mencionó Charles Ditzel en su post What’s Wrong With JavaFX and What Needs Fixing? una de las falencias de JavaFX es la ausencia de ciertos controles (ejemplo: árboles y tablas), ésta debilidad se acrecienta cuando lo comparamos con Swing que cuenta con muchos más. (Para ver una lista de los componentes JavaFX visiten: Top 5 most Important Features in JavaFX 1.2).

Para cubrir de cierta forma ésta debilidad, es posible utilizar dentro de una aplicación JavaFX componentes Swing; también se lo puede hacer en sentido contrario, en una aplicación Swing usar JavaFX, pero a través del hacking lo que no garantiza que siga funcionando en versiones posteriores. Para conocer más visiten: How to use JavaFX in Your Swing aplicaciones. Ésta característica, la capacidad de JavaFX de soportar componentes Swing, ha sido explotada en el JavaOne en las conocidas sesiones “Extreme GUI Make Over”, en donde se hace un cambio extremo a una aplicación Swing, ésta vez, para las mejoras se ha utilizado JavaFX dando como resultado una aplicación hibrida entre JavaFX y Swing.

Amy Fowler ha colaborado en el cambio extremo de GUI y ha elaborado un post resumen, en el cual muestra una lista de 10 + 1 pasos necesarios para incluir controles Swing dentro de una aplicación JavaFX. Los 10 pasos son los siguientes:

  • Tocar las bases del lenguaje
  • Descargar el SDK JavaFX
  • Crear un proyecto en NetBeans
  • Crear el “Stage”
  • Definir el layout
  • Embeber los componentes Swing
  • Enganchar los Listeners
  • Agregar efectos
  • Agregar movimiento
  • Hacer tus conclusiones

Para leer el post completamente lee el post: Insider’s Guide to Mixing Swing and JavaFX

Macwidgets – widgets Java al estilo Mac

Gracias a la aparición de la nueva versión del Mac Os X llamada snow leopard y a un post de JavaHispano me enteré de la existencia de una iniciativa denominada Macwidgets que se ha planteado como objetivo crear en Java algunos widgets con el estilo Mac. Para muestra un botón:

Un elemento de ejemplo [Tomado desde: http://code.google.com/p/macwidgets/wiki/Examples]

Un elemento de ejemplo (Tomado desde: http://code.google.com/p/macwidgets/wiki/Examples)

En éste enlace pueden encontrar un página en dónde se muestran ejemplos de los elementos que existen. Según he leído en el sitio, los componentes no son exclusivos para la plataforma Mac.

Lo única que resta por decir es “a jugar” con los componentes.

Algunos componentes de SwingX estarán en JDK 7

Revisando un vídeo en dónde Danny Coward (Chief Architect for Client Software at Sun Microsystems) habla sobre algunas de las características que tendrá del JDK 7, que verá la luz más allá del mes de Febrero de 2010, me encontré con la grata noticia que algunos componentes de SwingX estarán incluidos dentro del API; los componentes son: JXDatePicker y JXLayer.

Éstos componentes permitirán que nuestras aplicaciones tengan un widget para la selección de una fecha y un componente que permita bloquear un panel y sus componentes,mientras que se ejecuta una tarea, con unos efectos visuales bastante buenos. (Al momento de escribir éste post la página de SwingLabs tiene problemas y no puedo cargar links).

Me da gusto saber que se han tomando en cuenta elementos como éstos que han nacido de esfuerzoso open source.

JFormattedTextField y el método selectAll()

Una pregunta que nos hicieron en otro post era: ¿qué se debe hacer para que cuando un JFormattedTextField gane el foco se sobreescriba el texto que se muestra actualmente?

Mi primer respuesta fue programar el evento focusGained (cuándo gana el foco) e invoca al método selectAll() que permite seleccionar el texto que muestra el JFormattedTextField. En teoría funciona, pero resulta que no es así. La explicación es la siguiente:

Existe un bug, el 4740914, que ha sido reportado desde la versión 1.4 y que en breves palabras nos dice que existe un problema cuando se llama al método selectAll() de un JFormattedTextField.

La solución se muestra en el mismo reporte del bug. Y es la siguiente:

private void jFormattedTextField1FocusGained(java.awt.event.FocusEvent evt) {
   SwingUtilities.invokeLater(new Runnable() {
      public void run() {
         jFormattedTextField1.selectAll();
      }
   });
}

Básicamente lo que se hace es crear un hilo que llama al método selectAll sobre el JFormattedTextField. En mi caso lo programé en el método que maneja el evento focusGained. Existe una nota que dice: Please note that this solution does not work when this component is used as an editor in a JTable with surrender-focus enabled.

Espero que les ayude, en especial a quién hizo la pregunta.

Dos nuevos Tutoriales para JavaFX

Con la reciente salida de JavaFX 1.0 (su lanzamiento fue la semana pasada), se ha iniciado la campaña de formación y aquí pueden encontrar dos tutoriales.

El primero de ellos Learning the JavaFX Script Programming Languge, presenta los conceptos fundamentales y sintáxis utilizados por JavaFX Script. Consta de 11 lecciones.

El segundo, Building GUI Applications With JavaFX, muestra los conceptos básicos para la creación de interfaces gráficas de usuario, incluyendo: sintáxis declarativa, nodos, formas, efectos visuales, animación, layout y manejo de eventos. Tiene 8 lecciones.

Sun lanza la plataforma JavaFX

Revisando el sitio de Sun he podido ver cómo se hace el lanzamiento de la plataforma JavaFX, para la cual han creado un sitio, en el cual pueden ver vídeos, descargar el SDK, ver ejemplos y demos de lo que se puede hacer con ésta plataforma para la construcción de interfaces de aplicaciones.

Adicionalmente la gente de NetBeans anunció (y me enteré vía correo) que se puede actualizar la versión 6.5 para soportar JavaFX, aún no sé si con un editor visual o a puras sentencias.

Esperemos y veamos como se adopta ésta nueva tecnología.