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.
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.
ResponderBorrarya somos dos
ResponderBorrar