sábado, 27 de septiembre de 2014

Java 8 and the Two Worlds for Desktop-Based Applications: JavaFX - Swing

On last days I was trying and playing seriously with JavaFX 2 (also called only Java FX) because I'm really interested in how to get the maximum advantages for new apps on this platform.

While I was trying JavaFX, I found three main interesting areas:
  1. Application design approaches: The three main approaches to develop Java-FX based applications.
  2. Datasets display: The new approach to display data into tables or trees, because this is achieved in a very different way from Swing.
  3. Multithreading/Hard-tasks-processing: The basics to impement large/hard tasks that must be "observed" from the graphical user interface (using the JavaFX controls).
On next posts I will explain in detail all the above points.

Today, a considerable information amount about the new JavaFX exists on the web, including the official tutorials and documents from Oracle.

There is not doubts about JavaFX is the best adoption choice for new desktop-based developments under the Java Platform. From my point of view, Java FX is amazing and today it is the oficially recommended  platform by Oracle for new desktop-based applications. But... wait... this is not time to forget or isolate it from his ancestor: Swing.

Although JavaFX offers a better user experience that Swing does, it has a lack of custom controls that are necessary in many applications. At this moment, I could identify a couple of them: docking frameworks and rich text editors. This is normal in all new platforms. More custom and advanced components will be released over the time. But, what can you do if you need that components for your today projects? Well... the answer is very simple and you have to choose one of two ways:
  1. Develop your custom JavaFX components.
  2. Integrate certain-well-tested Swing components.
Both approaches have advantages and disadvantages. For example, taking the first way means that you don't "get out" of the JavaFX world. However, the required effort and time to achieve the goal could be expensive. On the other way, if the desired component exists (this is highly probably) in Swing, you can consider to use it into your JavaFX application. But, you must be careful and take into account that you are mixing two different worlds: The Swing World and the JavaFX World. This is not imposible and with appropiate design approaches you can achieve the goal with success.

Choosing one approach is a trade-off between time-effort-skills-platform constraints. But, in many cases, you could take the second way under this conditions:
  1. The required custom component does not exists on the oficial JavaFX bundles.
  2. The required custom component does not exists as a JavaFX-third part library or the source code to create it is not available.
  3. You do not have enough knowledgment or development skills about the JavaFX platform.
  4. The required custom component exists on Swing and it is well probed that it's performance is correct.
  5. You have moderated knowledgment and skills on Java Swing.
In order to ilustrate this approach I will use an application that I developed first on Swing and recently in JavaFX: JGreep / JGreepFX.

JGreep is an old program that I developed on top of the Swing framework some years ago. It's a very simple word-finder that acts over plain text documents. In order to use it, you start specifying a directory. Then, all files contained into the directory and subdirectories are listed into a table (a JTable component). Next, you type a word and the application starts to search the word occurrence inside of the listed text type files.

Next table shows you the JGreep/JgreepFX application, one using Swing and the other using JavaFX:

JGreep JGreepFX
Main Application Window:
Listing files process:


Search process:


Search results:



As you can see in the above pictures, the same application was builded on top of Swing and on top of JavaFX. The look and feel used in Swing is the PGS Look And Feel from Pagosoft.

At this point, you can appreciate some interesting appearance features on both applications. Now, lets to see another feature of the original JGreep: Open and display plain text files with a list of line numbers where the word occurences were found. The next picture shows a screenshot of a plain text file loaded with JGreep:


The JGreep's text viewer displays the file's contents in rich text. This is achieved using the amazing RSyntaxtTextArea Swing component from fifesoft (http://fifesoft.com/rsyntaxtextarea/). But... for JavaFX, today is not a complete rich text editor. Searching in google I found only an early development intended to develop this component: http://github.com/TomasMikula/RichTextFX. However, at this moment, only is available the basic framework to support regexp and you must do by hand the rest of the work.

Then, my approach to have a rich text editor in JGreepFX was using the Swing-based RSyntaxtTextArea. The result is:


The obtained result was very good and the appearance between the two frameworks looks similar. I used an additional trick: The document viewer in JGreepFX uses the Weblaf Look and Feel.This look and feel is very close (but not equals) in appearance to the standard Modena theme in JavaFX.

The most important when you are mixing JavaFX and Swing is: "Never perform tasks of each other out of their own thread". Remember: Tasks related with Swing controls are performed under the Swing's Event Dispatch Thread or EDT, while tasks related with JavaFX controls are performed under the JavaFX's Platform Application Thread.

If you want learn more about Swing's EDT I reommend this links:
  1. http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html (English)
  2. http://chuwiki.chuidiang.org/index.php?title=El_EDT_(Event_Dispatch_Thread)_de_Java (Spanish)
If you want learn more about the JavaFX PAT I recommend you to start with the Oracle's docs: http://docs.oracle.com/javafx/2/api/javafx/application/Platform.html.

And, this document about integrating JavaFX and Swing is a "must-read" to successfull achieve the goal: http://docs.oracle.com/javafx/2/swing/swing-fx-interoperability.htm.

To see this concepts in action, you can download the JGreep and JGreepFX, including their source codes from this locations:

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

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

Download the codes and start playing with it. I recommend you to use a Java versión 1.8.20+ because earlier version has a lack of bugs and the JavaFX applications throws a lot of exceptions, specially when you use the TableView control.

Para leer una versión en español de este post, ve a este enlace.

+ Miguel Angel

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


jueves, 18 de septiembre de 2014

SQL Data Workshop v.0.8.6.r1 released!

A few hours ago, the new version 0.8.6.r1 of SQL Data Workshop was available on the sourceforge site.

 The "r1" in this version means "revision 1" because some important bugs were corrected in this version.


 Major changes include:

  • SQL Server Visual Editor issue was corrected.
  • Quick search over query results was implemented.
  • Now is posible load and save connection settings files in your storage drives and devices.
  • Connection dialog now displays a connection hint for each DBMS.
  • Aditional JDBC Drivers were added. Now is posible connect to CSV Files and Oracle-Thin-Client
  • Some icons were changed.
  • Minor issues was corrected.
Here some screenshots of this new version:

Improved Connection dialog.

Visual Query Editor minor issues corrected.

Fast-Query Results Search mechanism was implemented.
Also, a first-fast site attempt was designed. You can visit and leave your comments here: http://sqldw.sourceforge.net.

Direct download link is here: http://sourceforge.net/projects/sqldw/.

Greetings!

+ Miguel Angel