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 mis ojos:
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
Como WPF, JavaFX utiliza un sistema de procesamiento de gráficos conservado. La interfaz de usuario comprende un gráfico de escena que está compuesto por 'nodos' que pueden considerarse conceptualmente similares al WPF UIElement
.
JavaFX descargará la representación gráfica a la GPU si está disponible. El sistema de gráficos usa DirectX en Windows y OpenGL en otras plataformas.
de marcado de
interfaces de usuario JavaFX pueden crearse tanto en código y a través de FXML de marcado que es similar a XAML que el gráfico de objetos puede ser creado por elementos de anidación.
FXML tiene algunas características similares a XAML, como el enlace de propiedades (solo expresiones simples) y el enlace a los controladores de eventos (cualquier método de evento). 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 establecer enlaces entre propiedades. Este es un controlador en el sentido MVC y no es lo mismo que un modelo de vista en el mundo de WPF (por lo general, un controlador tendrá referencias a nodos y controles).
Una diferencia con WPF es que parece que el FXML es no compilado en una representación binaria intermedia como BAML. No he notado ningún problema de rendimiento todavía, pero no he usado el sistema de manera exhaustiva. 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.
Se puede encontrar una introducción a FXML here.
Un generador de escenas se proporciona gratis (como en cerveza), así que si no te gusta codificar manualmente la UI puedes arrastrar y soltar elementos, establecer propiedades y enlazar código en tu 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.
Encuadernación
JavaFX tiene un poderoso sistema de propiedad y vinculante. 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 las propiedades). Estas clases implementan interfaces que proporcionan invalidación y notificación de cambios.
Existe una distinción entre las notificaciones de invalidación y las notificaciones de cambio.Las invalidaciones solo indican que la expresión de enlace ahora no es válida y debe 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 propiedades múltiples. ¿Desea que una propiedad entera sea la suma de otras dos (a = b + c)? No hay problema, JavaFX proporciona una API Fluent para expresar este tipo de relaciones E.G.
A.Add (B, C);
Si el valor de B o C cambia, se mostrarán las notificaciones adecuadas para que el sistema sepa que A necesita una reevaluación. Tenga en cuenta que en este caso, se lanzará una excepción si intenta establecer el valor de A como está vinculado a las otras propiedades, por lo que no tiene sentido en este contexto.
Estas expresiones pueden ser bastante complejas E.G. a = (b + c) * (d - e)
y puede incluir cualquier cantidad de propiedades. La API fluida es bastante fácil de leer y usar, pero no es tan buena como algunas de las API Fluent proporcionadas por algunas de las bibliotecas de Microsoft, pero esto se debe más a las limitaciones del lenguaje Java que a JavaFX.
Se pueden crear enlaces bidireccionales simples entre propiedades del mismo tipo, de modo que si uno se actualiza, el otro 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 sea proporcionada por la API o si le preocupa el rendimiento.
Una de las mayores diferencias entre JavaFX y WPF es que las vinculaciones se llevan a cabo principalmente en código en JavaFX frente a la forma WPF de establecer enlaces en el marcado.
Puede encontrar una introducción a las propiedades y enlaces here.
Estilos
JavaFX utiliza CSS para cambiar el aspecto de los nodos contenidos en el escenario gráfico. Hay una especificación completa disponible que explica los tipos y las propiedades que se pueden establecer en cada tipo de nodo.
JavaFX también proporciona algunas adiciones que ayudan a mejorar CSS, como las variables que se pueden definir y utilizar en otros lugares E.G.
.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 los colores de otros colores previamente definidos, que es útil para crear cosas como gradientes. Esto significa que se puede definir una paleta base de colores y el resto se puede generar a partir de estos valores (esto es lo que hace el archivo CSS predeterminado de JavaFX).
JavaFX CSS no permite definir tipo del 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 here.
Layout
JavaFX proporciona un número 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 clase Region
.
Como se mencionó anteriormente, el diseño no se puede llevar a cabo mediante CSS, pero se puede expresar usando el código, FXML o creado con el generador de escenas (que finalmente se convierte a FXML).
Controles
JavaFX proporciona una biblioteca cada vez mayor de pruebas que hemos llegado a esperar. Una gran diferencia entre JavaFX y WPF es que los controles son esencialmente cuadros negros y no se pueden cambiar de plantilla de la manera en que lo hacen los controles de WPF. También parecen exponer muchas menos propiedades que los controles de WPF.
Los controles exponen algunas de las regiones específicas de implementación a CSS, lo que permite que áreas específicas de un control se orienten por sus estilos. Esto se conoce como subestructura del control. P.EJ. a CheckBox
expone dos subestructuras; la caja y la marca de verificación que permite que cada parte del control se diseñe de forma independiente. Tenga en cuenta que, como se describió anteriormente, solo el mira de un control se puede modificar mediante CSS, pero el se siente no se puede. P.EJ. no se puede alterar drásticamente la forma en que TabPane
establece su contenido alterando su panel de diseño interno de la manera que se puede con el WPF TabControl
.
Si bien esto parece bastante limitante, la forma preferida de crear controles personalizados en JavaFX parece ser el uso de la composición a lo largo de las líneas derivadas de un panel de diseño para colocar controles estándar y volver a diseñarlos mediante CSS.
Conclusión
En general estoy muy impresionado con lo que JavaFX tiene que ofrecer en este momento. Aunque no está tan maduro como WPF, se está desarrollando activamente y Oracle parece estar respaldando esto. El tiempo dirá si es exitoso o no.
Recomendaría dar una oportunidad a JavaFX. Lea el documentation y trate de armar una pequeña aplicación y vea lo que piensa.
También debe consultar FXExperience.com que se actualiza regularmente con información del equipo de desarrollo.
Muchas gracias por esto, esto es muy educativo. Si pudiera mejorar aún más esta respuesta a medida que avanza en su conocimiento de JavaFX sería increíble. –
También disfruté leyendo su respuesta y me encantaría saber más si su trabajo con JavaFX revela más información. –