¿Cómo se compara JavaFX con WPF? [cerrado]

93

Soy sobre todo un programador de C #, dejé de escribir Java hace unos 10 años, pero trato de mantenerme al día con la tecnología en Java leyendo artículos, hablando con amigos, etc.

Escuché sobre el nuevo marco de interfaz gráfica de usuario enriquecido llamado JavaFX, pero no pude encontrar ningún recurso que lo compare con paralelos que no sean de Java.

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

EDITAR: Dado que no hay respuestas, intentaré ser más específico:

  1. WPF usa XAML para crear el árbol visual, ¿JavaFX tiene algo similar?
  2. WPF se usa 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, ¿JavaFX hace lo mismo?
  4. ¿Cómo se compara Silverlight con JavaFX cuando se ejecuta a través de un navegador en una PC con red?

... Más por venir...

Estoy cambiando esto a la wiki de la comunidad para que las comparaciones puedan seguir actualizándose (con suerte).

Aviad P.
fuente
7
Es curioso que una pregunta con 83 votos a favor pueda considerarse no constructiva.
kristianp

Respuestas:

120

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

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 CheckBoxexpone 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 TabPanepresenta 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.

Benjamin
fuente
9
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.
Aviad P.
5
También disfruté leyendo su respuesta y me encantaría saber más si su trabajo con JavaFX revela más información.
Paul-Sebastian Manole
21

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

Son bastante rápidos y te dan una buena idea del idioma. 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 xml. La interfaz de usuario se basa en un gráfico de escena, por lo que puede aplicar varios efectos y animaciones a cualquier nodo del gráfico. Consulte los tutoriales para obtener más información. También hay una herramienta de diseño para JavaFX (que aún no he probado).
  2. JavaFX tiene un enlace integrado en el lenguaje .
  3. JavaFX en el escritorio usa Java AWT / Swing, que usa renderizado por GPU. Cada versión de Java parece descargar más gráficos a la GPU. Chris Campbell de Sun ha escrito en su blog sobre la aceleración de la GPU . No estoy seguro de si la versión móvil de JavaFX tiene aceleración por GPU. Descubrí que las versiones anteriores de JavaFX no tenían el rendimiento suficiente para lo que necesitaba, pero sé que la última versión tiene mejoras de rendimiento significativas con respecto a las versiones anteriores y todavía están trabajando para hacerlo más rápido.
  4. JavaFx utiliza applets de Java para ejecutarse en el navegador. A partir de la actualización 10 de Java 6, el marco del subprograma de Java ha sido reelaborado y, aunque no es tan fluido como Adobe Flash, ha mejorado mucho. No estoy seguro de cómo se compara con Silverlight, aparte de que tuve problemas para hacer que Silverlight funcione en Linux, pero logré que JavaFX funcione en Linux.

Aquí hay otra pregunta relacionada .

Jay Askren
fuente
15
Esta respuesta está desactualizada ya que JavaFX ha pasado por actualizaciones significativas en Java 7. Vea aquí .
Zoltán
7
¿Estás seguro de que JavaFX usa swing y AWT? Creo que tiene su propio motor de renderizado llamado prisma. No se crea ningún hilo de envío de eventos cuando se ejecuta una aplicación JavaFX.
Andy Till