2010-01-06 25 views
75

Soy principalmente un programador de C#, dejé de escribir Java hace unos 10 años, pero trato de mantenerme actualizado con la tecnología en Java leyendo artículos, hablando con amigos, etc.¿Cómo se compara JavaFX con WPF?

He oído hablar de la nuevo marco de GUI rico llamado JavaFX, pero no pudo encontrar ningún recurso que lo compare con paralelos que no sean de Java.

Dado que estoy muy familiarizado con C# y WPF, me gustaría tener una idea de cuán similares o diferentes son las dos tecnologías.

EDIT: En vista de que no hay respuestas que viene, voy a tratar de ser más específicos:

  1. WPF XAML utiliza para crear el árbol visual, no JavaFX tiene algo similar?
  2. WPF se utiliza mejor con el enlace a un modelo de vista en un patrón MVVM. ¿JavaFX también hace un uso extensivo del enlace?
  3. WPF utiliza la GPU para renderizar, ¿hace JavaFX lo mismo?
  4. ¿Cómo se compara Silverlight con JavaFX cuando se ejecuta a través de un navegador en una net pc?

... Más por venir ...

estoy cambiando a este wiki de la comunidad de manera que las comparaciones pueden seguir recibiendo actualizada (con suerte).

Respuesta

101

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.

+5

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. –

+3

También disfruté leyendo su respuesta y me encantaría saber más si su trabajo con JavaFX revela más información. –

20

Creo que la mejor manera de hacerte una idea de JavaFX es simplemente probarlo. Hay algunos buenos tutoriales en el sitio web de JavaFX. Aquí hay un par:

Son bastante rápido y le dan una buena idea de la lengua. Hay muchos otros en el sitio JavaFX si está interesado en más tutoriales y artículos.

Para obtener respuestas específicas a sus preguntas:

  1. JavaFX tiene su propio lenguaje declarativo para crear el "árbol visual" que no es un derivado de XML. La interfaz de usuario se basa en un gráfico de escena para que pueda aplicar diversos efectos y animaciones a cualquier nodo del gráfico. Vea los tutoriales para más información. También hay una herramienta de diseño para JavaFX (que aún no he probado).
  2. JavaFX has binding built into the language.
  3. JavaFX en el escritorio utiliza Java AWT/Swing que utiliza el renderizado de GPU. Cada versión de Java parece descargar más de sus gráficos a la GPU. Chris Campbell de Sun ha blogueado alrededor de GPU acceleration. No estoy seguro si la versión móvil de JavaFX tiene aceleración GPU. Descubrí que las versiones anteriores de JavaFX no eran lo suficientemente eficaces para lo que necesitaba, pero sé que la última versión tiene importantes mejoras de rendimiento en comparación con versiones anteriores y todavía están trabajando en hacerlo más rápido.
  4. JavaFx usa Applets de Java para ejecutarse en el navegador. A partir de la actualización 10 de Java 6, el marco del applet de Java se ha rediseñado y, aunque no es tan fluido como Adobe Flash, se ha mejorado mucho. No estoy seguro de cómo se compara con Silverlight, aparte de que he tenido problemas para hacer que Silverlight trabaje en Linux, pero logré que JavaFX funcionara en Linux.

Here's another related question.

+14

Esta respuesta no está actualizada ya que JavaFX ha pasado por actualizaciones importantes en Java 7. [Ver aquí] (http://docs.oracle.com/javafx/2/overview/jfxpub-overview.htm). –

+6

¿Estás seguro de que JavaFX usa swing y AWT? Creo que tiene su propio motor de representación llamado prisma. No se crea ningún subproceso de envío de eventos cuando se ejecuta una aplicación JavaFX. –

Cuestiones relacionadas