sábado, 31 de enero de 2015

Diferencias entre JavaFX y Swing

Si tienes experiencia en java es muy probable que hayas trabajado con Swing para crear interfaces gráficas. Oracle no ha abandonado por completo Swing (no está obsoleta y las aplicaciones creadas con Swing continúan trabajando), pero ya no se realizan ningún tipo de actualizaciones para mejorar Swing y Oracle ha dejado bien claro que JavaFX es el futuro.

Aquí les presento algunas diferencias básicas entre JavaFX y Swing.


En JavaFX, todo es un esenario.


En Swing la clase en la que se “sostienen” los componentes se llama frame y es definida por la clase JFrame. Un frame es esencialmente una ventana vacía a la cual puedes agregar un panel, el cual sirve como un contenedor para los elementos de tu interfaz. Un panel es definido por la clase JPanel.

En Swing, una aplicación es en realidad es una clase que extiende la clase JFrame. Para mostrar los componentes de la interfaz, agregas los componentes a un JPanel y entonces agregas el panel al frame.

JavaFX usa la metáfora de un teatro para modelar el contenedor de más alto nivel de una aplicación. Un stage (el teatro), definido por la clase Stage, representa el contenedor de más alto nivel, típicamente una ventana, aunque en algunos sistemas operativos, el stage puede representar la superficie completa de la pantalla. Los controles individuales y otros componentes que crean la interfaz están contenidos en una scene (una escena), definida por la clase Scene. Una aplicación puede tener múltiple scenes pero solo una scene puede ser mostrada en un tiempo dado.

Una scene contiene un scene graph (un escenario gráfico), el cual es el concepto más importante en JavaFX. El scene graph o ecenario grafico es una colección de todos los elementos que crean una interfaz de usuario (grupos, layouts, controles y figuras). Estos objetos son llamados nodos y son derivados de la clase Node. La clase Node tiene varias características y capacidades que son heredadas por cada objeto que puede ser agregado a tu interfaz. Por ejemplo la clase Node define el método setRotate que te permite rotar cualquier nodo in el scene graph o escenario gráfico.

En JavaFX, los gestores de diseños o layout son nodos.


En Swing, un layout es asociado con un JPanel. El JPanel con el nivel más alto entrega el layout básico al frame. Si quieres anidar layouts adicionales al layout de más alto nivel, obligatoriamente debes crear JPanels adicionales, configurar los layouts asociados a cada JPanel y entonces agregarlos al layout de más alto nivel.

En JavaFX, los layouts son subclases de la clase Node al igual que los controles y las figuras. Los layout contienen una colección de nodos, los cuales pueden ser un control (un botón), una figura u otro layout. Este esquema es mucho menos incomodo que la asociación de layout con paneles de Swing.

JavaFX ha mejorado el manejo de eventos.


Tanto JavaFX como Swing usan el manejo de eventos para responder a las entradas del usuario. Sin embargo, veras que los eventos en JavaFX están mejores pensados y son más consistentes que su equivalente en Swing. Pero la mejor razón por la que el manejo de evento es mejor en JavaFX es por su dependencia de propiedades.

JavaFx soporta propiedades.


JavaFX soporta el concepto de propiedades y usa propiedades extensamente a través de sus clases. En pocas palabras, una propiedad es una variable cuyo valor puede ser observado.  Puedes  registrar un listener con cualquier propiedad, permitiéndote escribir código que es lanzado automáticamente cada vez que la propiedad cambia. 

Adicionalmente, puedes enlazar las propiedades unas con otras mediante bind, lo cual quiere decir que si el valor de una propiedad cambia, el valor de la otra propiedad cambia de forma automática.

Debido a que casi todas las características de los elementos en una interfaces de usuario están manejadas a través de propiedades, JavaFx proporciona manejo de eventos que son inauditos en Swing. Por ejemplo, en JavaFX, puedes adjuntar un listener al color de una figura. Si el color de la figura cambia, el código de tu listener es ejecutado.

JavaFX puede ser personalizado con CSS.


Uno de las mejores características de JavaFX es que puedes controlar el formato a través de CSS (Cascading Style Sheets). Casi todos los aspectos de la apariencia de tu interfaz de usuario puede ser configurada por una regla de estilo (style rule), y tú puedes fácilmente permitirle al usuario seleccionar cual estilo aplicar a la scene. Así, puedes cambiar la apariencia completa de tu aplicación con la simple llamada de un método.

JavaFX tiene controles más consistentes.


En general, encontraras que la herencia de controles de JavaFX es más completa que la de Swing. Tanto JavaFX como Swing tienen los controles básicos: botones, check boxes, combo boxes y similares. Pero JavaFX tiene varios controles interesantes que Swing no tiene, tales como el TitledPane plegable y el Accordion que organiza múltiples TitledPane en una pila. Y el hecho de que todos los controles son personalizables por CSS le dan una gran ventaja sobre Swing.

JavaFX tiene efectos especiales.


El paquete javafx.scene.effect contiene un número de clases con las que puedes fácilmente aplicar efectos especiales a cualquier nodo en el scene graph. Estas clases te permiten aplicar sombras, reflexiones, desenfoques y otros interesantes efectos especiales que pueden transformar la apariencia de tu interfaz de usuario.

Las animaciones son más fáciles en JavaFX.


La animación es posible en Swing, pero Swing no provee ningún soporte directo para esto. Para animar un componente de Swing, tú debes configurar tus propios temporizadores y construir tu propia lógica para realizar la animación.

En contraste, JavaFX tiene soporte incorporado para sofisticadas animaciones que pueden ser aplicadas a cualquier nodo en el scene graph. Puedes usar una de las clases de transición incorporadas para realizar animaciones comunes como desvanecer, rotaciones o movimientos. También, puedes usar las clases KeyFrame y Timeline para crear animaciones personalizadas.

JavaFX soporta dispositivos modernos con interfaces touch.


Swing carece de soporte para para dispositivos modernos con interfaces touch, por el contrario JavaFX tiene soporte incorporado para gestos comunes en interfaces touch tales como desplazamientos, toques, rotaciones y zoom. Manejar estos eventos en JavaFX es tan fácil como manejar cualquier otro tipo de evento: simplemente instalas un listener en un evento touch y escribes el código que responda apropiadamente.

JavaFX no tiene un equivalente a JOptionPane.


No sería justo completar esta lista de diferencias con puntos que claramente favorecen a JavaFX. Aquí hay una pequeña molestia de JavaFX y es que no tiene incorporado un equivalente a la clase JOptionPane de Swing, la cual es bastante útil para mostrar mensajes de alerta u obtener una simple respuesta del usuario. En JavaFX tu tienes que crear un equivalente para esta clase.

2 comentarios:

  1. Un gran análisis de las diferencias entre ambos sistemas de interfaces gráficas (bueno, más bien de todas las ventajas de JavaFX :p). Acabo de terminar un proyecto (académico) con Swing y me he dado cuenta demasiado tarde que tendría que haberlo hecho con JavaFX.

    ResponderBorrar