sábado, 27 de septiembre de 2014

Java 8: El nuevo y el viejo mundo en el desarrollo de aplicaciones de escritorio.

Durante estos días pasados he estado aprendiendo y practicando con la plataforma JavaFX 2 (conocida solo como JavaFX). Realmente estoy interesado en aprender los conceptos claves de la plataforma para poder explotar al máximo las prestaciones que ofrece.

Durante mis días de práctica encontré tres áreas prácticas de interés:
  1. Enfoques para el diseño de aplicaciones: En este punto, encontré que existen tres modelos o formas básicas para desarrollar aplicaciones en JavaFX.
  2. Despliegue de datos dentro de la aplicación: JavaFX introduce un cambio extremadamente radical, en comparación de su antecesor Swing, en la forma en que se construyen las tablas y se les asignan los datos que deberán ser visualizados.
  3. Procesamiento de tareas con múltiples hilos: JavaFX tiene sus propias clases que permiten a una aplicación ejecutar tareas pesadas a la vez que puede "observar" su progreso y reflejarlo en los controles de la intefaz de usuario (basada en JavaFX).
En posts posteriores iré explicando a detalle cada uno de los puntos anteriores.

Actualmente, en internet existe una cantidad de información considerable sobre JavaFX. Basta con realizar una búsqueda en google o ver la documentación oficial de Oracle.

Tampoco hay duda de que JavaFX es la plataforma recomendada para el desarrollo de nuevas aplicaciones de escritorio. Desde mi punto de vista, las aplicaciones hechas con JavaFX, en comparación con Swing, ofrecen una mejor experiencia de usuario, además de un modelo de desarrollo simplificado y elegante para el manejo de eventos en los controles por parte de los desarrolladores. Sin embargo, considero que aun no es tiempo de aislarla ni de olvidar a Swing.

La plataforma JavaFX, al día de hoy, tiene carencia de muchos componentes personalizados que sí están disponibles en Swing. Por ejemplo, un framework propio de JavaFX para componentes "acomodables" ó "dockings". Otro ejemplo es la existencia de un control JavaFX puro que permita el despliegue de texto enriquecido. Esto es normal y totalmente entendible cuando una plataforma nueva se pone a disposición de los usuarios y desarrolladores. Con el paso del tiempo, estarán disponibles más componentes personalizados y avanzados. Sin embargo, ¿que podemos hacer si necesitamos esos componentes en nuestros proyectos actuales bajo JavaFX? Bueno, la respuesta parece ser bastante simple y solo disponemos de dos opciones:

  1. Desarrollar tu propio componente utilizando JavaFX.
  2. Integrar componentes Swing existentes que ya están bien definidos y probados.
Ambas opciones tienen sus ventajas y desventajas. Por ejemplo, decantarse por la primera opción tiene la ventaja de que siempre permaneceremos dentro del entorno de JavaFX. Sin embargo, el esfuerzo y tiempo requeridos para desarrollarlo puede ser considerable. 

Por otra parte, si el componente personalizado que se requiere existe en Swing (lo cual es altamente probable), entonces se podría considerar seriamente su utilización dentro de la aplicación JavaFX. Adicionalmente, se debe tener especial cuidado al mezclar ambos ambientes para lograr tener un buen resultado.

La elección de un enfoque u otro dependerá de los factores de tiempo, esfuerzo, habilidades técnicas y, sus propias restricciones. Sin embargo, en muchos de los casos yo recomendaría elegir la segunda opción, bajo las siguientes condiciones:

  1. El componente personalizado que se requiere no existe como parte oficial de la Plataforma JavaFX.
  2. El componente personalizado que se requiere no existe dentro de una librería JavaFX de terceros ni tampoco existe algún código fuente que pueda crearlo.
  3. No se tiene mucho conocimiento sobre JavaFX.
  4. El componente personalizado requerido existe en Swing y está bien probado que su funcionamiento y desempeño son correctos.
  5. Tienes un conocimiento básico o intermedio acerca de Swing.
Para explicar un poco más sobre este enfoque, utilizaré de ejemplo una aplicación que desarrollé hace algunos años, incialmente en Swing y en estos días la reprogramé sobre JavaFX.

El nombre de la aplicación es JGreep  (JGreepFX en JavaFX) y no es más que una aplicación simple que busca palabras dentro de archivos de texto plano. Basta con definir un directorio para que la aplicación liste (dentro de un JTable) todos los archivos que encuentra tanto en el mismo directorio como en sus subdirectorios. Posteriormente, el usuario escribe una palabra y el programa busca sus ocurrencias dentro del contenido de cada archivo.

La siguiente tabla muestra la apariencia de la aplicación tanto en Java Swing como en JavaFX.

JGreepJGreepFX
Ventana principal de la aplicación:
Proceso de búsqueda y listado de archivos:


Proceso de búsqueda de palabras:


Resultados de búsqueda:


Como se puede observar en las imágenes anteriores, existen tanto diferencias como similitudes significativas entre ambas. El Look And Feel utilizado en la aplicación Swing es  PGS Look And Feel, de Pagosoft. Ahora, veamos una característica interesante del JGreep original: Abrir y desplegar el contenido de los archivos de texto plano, conteniendo una lista de los números de renglón donde aparece la palabra buscada. La siguiente imagen muestra la apariencia de esta interfaz:


La interfaz anterior muestra el contenido del archivo en formato de texto enriquecido, ya que resalta las palabras reservadas dependiendo del tipo de archivos, por ejemplo, .java, .sql, .xml, .html, entre otros. Para lograr el aspecto elaborado del visor de contenido de los archivos, utilicé un componente llamado RSyntaxTextArea de la empresa fifesoft: http://fifesoft.com/rsyntaxtextarea/. Sin embargo, en JavaFX no existe un componente similar al día de hoy, que permita mostrar textos enriquecidos de forma fácil, ya que con el componente RSyntaxTextArea solo basta definir los tokens o palabras reservadas y su color. Buscando en google, encontré solo una entrada acerca de un componente para tal efecto. Por ahora, el proyecto se encuentra en una etapa temprana y el desarrollador debe definir los tokens y los rangos de texto a los que se les aplicará el estilo. Esto, como se puede suponer, esto representa un esfuerzo considerable si se toma en cuenta que se tienen que definir todas las palabras que pudieran ser reservadas en los distintos tipos de archivos, como es el caso de JGreep.

Por tal motivo, decidí utilizar el editor de texto rico Swing, RSyntaxTextArea dentro de la aplicación JGreepFX, basada por supuesto, en JavaFX. Y esto fue lo que obtuve:



Como se puede observar, el resultado fue muy bueno y la apariencia de los dos frameworks (Swing-JavaFX) fue muy parecida. Para esto, utilicé un truco adicional: apliqué el Look and Feel WebLaF. Este look and feel es muy parecido, más no igual, al estilo por defecto que tienen las aplicaciones JavaFX, denominado Modena.

Para terminar este post, debo mencionar una restricción muy importante al mezclar los entornosSwing y JavaFX: Nunca realizar tareas de un entorno dentro del hilo de eventos del otro. Recuerda: Las tareas relacionadas con la interacción de controles Swing deben realizarse dentro de su propio Event Dispatch Thread también denominado EDT o simplemente Hilo Swing. De igual forma, las tareas relacionadas con la interacción de controles JavaFX deben realizarse dentro del JavaFX Platform Application Thread o Hilo de la Plataforma de la Aplicación.

Si quieres aprender más sobre el EDT de Swing puedes ir a estos enlaces:

  1. http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html (Inglés)
  2. http://chuwiki.chuidiang.org/index.php?title=El_EDT_(Event_Dispatch_Thread)_de_Java (Español)
Si deseas aprender más sobre el JavaFX Platform Application Thread, te recomiendo comenzar con la documentación oficial de Oracle: http://docs.oracle.com/javafx/2/api/javafx/application/Platform.html.

Y, para integrar Swing y JavaFX con éxito, la lectura de este documento es obligada: http://docs.oracle.com/javafx/2/swing/swing-fx-interoperability.htm.

Si quieres ver estos conceptos "en acción", puedes descargar las aplicaciones JGreep y JGreepFX, incluyendo sus códigos fuente, en estos enlaces:

http://sourceforge.net/projects/jgreep/

http://sourceforge.net/projects/jgreepfx/

Recuerda descargar también los códigos fuente y practicar con ellos. De preferencia utiliza una versión de Java Mayor o igual a la 1.8.20, ya que en versiones anteriores, existen muchos bugs que causan innumerables excepciones en las aplicaciones javaFX, especialmente al utilizar el TableView.

+ Miguel Angel


No hay comentarios: