He estado aprendiendo JavaFX durante las últimas semanas. Aquí hay una descripción general de alto nivel de cómo se compara con WPF en mi opinión:
Todos mis comentarios están relacionados con JavaFX 2.0. Esta información probablemente estará sujeta a cambios ya que la plataforma aún es bastante inmadura y se está desarrollando activamente.
Gráficos
Al igual que WPF, JavaFX utiliza un sistema de representación de gráficos retenidos. La interfaz de usuario comprende un gráfico de escena que se compone de "nodos" que pueden considerarse conceptualmente similares a los de WPF UIElement
.
JavaFX descargará la representación de gráficos a la GPU si está disponible. El sistema de gráficos usa DirectX en Windows y OpenGL en otras plataformas.
Margen
Las interfaces de usuario de JavaFX se pueden crear tanto en código como a través del marcado FXML, que es similar a XAML en el sentido de que el gráfico de objetos se puede crear anidando elementos.
FXML tiene algunas características similares a XAML, como el enlace de propiedad (solo expresiones simples) y el enlace a controladores de eventos (cualquier método onEvent ). Los controladores de eventos se pueden declarar en línea, pero normalmente se vincularía a un evento en el controlador asociado.
Los archivos FXML pueden tener un controlador asociado que le permite declarar controladores de eventos complejos y configurar enlaces entre propiedades. Este es un controlador en el sentido de MVC y no es lo mismo que un viewModel en el mundo de WPF (normalmente, un controlador tendrá referencias a nodos y controles).
Una diferencia con WPF es que parece que FXML no está compilado en una representación binaria intermedia como BAML. Todavía no he notado ningún problema de rendimiento, pero no he utilizado el sistema de forma extensiva. Sin embargo, he notado que FXML generalmente tiende a ser más corto que cualquier XAML, ya que la plataforma aún lo alienta a escribir código y los estilos se declaran por separado.
Puede encontrar una introducción a FXML aquí .
Se proporciona un generador de escenas gratis (como en la cerveza), por lo que si no le gusta codificar manualmente la interfaz de usuario, puede arrastrar y soltar elementos, establecer propiedades y vincular el código en su controlador y el FXML se generará automáticamente. Obviamente, el generador de escenas no es tan poderoso como Expression Blend, pero sigue siendo mejor que el "diseñador" proporcionado por Visual Studio.
Unión
JavaFX tiene una propiedad y un sistema de enlace muy poderoso. El patrón de Java Bean se ha ampliado para incluir clases que encapsulan una propiedad (similar a la forma en que las propiedades de dependencia de WPF representan propiedades). Estas clases implementan interfaces que brindan invalidación y notificación de cambios.
Existe una distinción entre notificaciones de invalidación y notificaciones de cambios. Las invalidaciones simplemente le dicen que la expresión de enlace ahora no es válida y necesita ser recalculada; el recálculo no ocurre realmente hasta que solicite el valor de la propiedad a través de sus métodos get()
o getValue()
. Sin embargo, si ha registrado un detector de cambios, la expresión se volverá a evaluar inmediatamente y todo lo que esté vinculado a esa propiedad reflejará los cambios.
JavaFX expone estas propiedades de forma similar a WPF con una propiedad get y set y un método que devuelve una instancia del contenedor de propiedades (que no son estáticas como las propiedades de WPF).
Se pueden crear enlaces complejos entre varias propiedades. ¿Quiere que una propiedad entera sea la suma de otras dos (a = b + c)? No hay problema, JavaFX proporciona una API fluida para expresar este tipo de relaciones, por ejemplo.
A. Agregar (B, C);
Si el valor de B o C cambia, se generarán las notificaciones correspondientes para que el sistema sepa que A debe ser reevaluado. Tenga en cuenta que, en este caso, se lanzará una excepción si intenta establecer el valor de A, ya que está vinculado a las otras propiedades, por lo que no tiene sentido en este contexto.
Estas expresiones pueden ser EG bastante complejas a = (b + c) * (d - e)
y pueden incluir cualquier número de propiedades. La API fluida es bastante fácil de leer y usar, pero no es tan agradable como algunas de las API fluidas proporcionadas por algunas de las bibliotecas de Microsoft, pero esto se debe más a las limitaciones del lenguaje Java que al propio JavaFX.
Se pueden crear enlaces bidireccionales simples entre propiedades del mismo tipo, de modo que si una se actualiza, la otra refleja automáticamente el cambio.
JavaFX también proporciona una API de bajo nivel para personalizar los enlaces usted mismo si desea crear una expresión de enlace personalizada que no proporciona la API o si le preocupa el rendimiento.
Una de las mayores diferencias entre JavaFX y WPF es que los enlaces se llevan a cabo principalmente en código en JavaFX frente a la forma de WPF de establecer enlaces en el marcado.
Puede encontrar una introducción a las propiedades y enlaces aquí .
Estilos
JavaFX usa CSS para cambiar el aspecto de los nodos contenidos en el gráfico de escena. Hay una especificación completa disponible que explica los tipos y las propiedades que se pueden configurar en cada tipo de nodo.
JavaFX también proporciona algunas adiciones que ayudan a mejorar CSS, como variables que se pueden definir y usar en otros lugares, por ejemplo.
.button {
my-custom-color: RGB(234, 44, 78);
}
.my-control {
-fx-background-color: my-custom-color
}
También proporciona un par de funciones que le permiten derivar colores de otros colores definidos previamente, lo cual es útil para crear cosas como degradados. Esto significa que se puede definir una paleta de colores base y el resto se puede generar a partir de estos valores (esto es lo que hace el archivo CSS JavaFX predeterminado).
JavaFX CSS no le permite definir el tipo de diseño utilizado por un nodo (al momento de escribir esto, todo el diseño debe realizarse en código). Esto funciona muy bien para mí, ya que este fue el único aspecto de CSS que realmente me causó dolor al usarlo con HTML.
Personalmente, prefiero los estilos CSS a XAML, que tienden a ser demasiado detallados para mi gusto.
Puede encontrar una guía de JavaFX CSS aquí .
Diseño
JavaFX proporciona una serie de paneles de diseño que son similares a los proporcionados por WPF. Una diferencia que he notado es que el contrato de medida y diseño se define más arriba en la cadena de herencia en la Region
clase.
Como se mencionó anteriormente, el diseño no se puede realizar usando CSS, pero se puede expresar usando el código, FXML o crearlo usando el generador de escenas (que finalmente se convierte a FXML).
Control S
JavaFX proporciona una biblioteca de controles cada vez mayor que esperamos. Una diferencia importante entre JavaFX y WPF es que los controles son esencialmente cajas negras y no se pueden volver a crear plantillas de la forma en que lo hacen los controles de WPF. También parecen exponer muchas menos propiedades que los controles WPF.
Los controles exponen algunas de las regiones específicas de implementación a CSS, lo que permite que sus estilos se orienten a áreas específicas de un control. Esto se conoce como la subestructura del control. EG a CheckBox
expone dos subestructuras; la casilla y la marca de verificación permiten diseñar cada parte del control de forma independiente. Tenga en cuenta que, como se describió anteriormente, solo se puede modificar la apariencia de un control usando CSS, pero la sensación no. Por ejemplo, no puede alterar drásticamente la forma en que TabPane
presenta su contenido alterando su panel de diseño interno de la manera que puede con el WPF TabControl
.
Si bien esto suena bastante limitante, la forma preferida de crear controles personalizados en JavaFX parece ser usar la composición en la línea de derivar de un panel de diseño para colocar controles estándar y rediseñarlos usando CSS.
Conclusión
En general, estoy muy impresionado con lo que JavaFX tiene para ofrecer en este momento. Si bien no es tan maduro como WPF, se está desarrollando activamente y Oracle ciertamente parece estar respaldando esto. El tiempo dirá si tiene éxito o no.
Recomendaría probar JavaFX. Lea la documentación e intente armar una pequeña aplicación y vea lo que piensa.
También debe consultar FXExperience.com, que se actualiza periódicamente con información del equipo de desarrollo.