Comment JavaFX se compare-t-il à WPF?

Je suis principalement un programmeur C #, j’ai arrêté d’écrire Java il y a environ 10 ans, mais j’essaie de suivre la technologie Java en lisant des articles, en discutant avec des amis, etc.

J’ai entendu parler de la nouvelle infrastructure graphique riche appelée JavaFX, mais je n’ai trouvé aucune ressource permettant de la comparer avec des parallèles non Java.

Comme je connais très bien C # et WPF, j’aimerais avoir une idée de la similarité ou de la différence entre les deux technologies.

EDIT: Comme il n’y a pas de réponses à venir, je vais essayer d’être plus précis:

  1. WPF utilise XAML pour créer l’arborescence visuelle, JavaFX a-t-il quelque chose de similaire?
  2. Il est préférable d’utiliser WPF avec une liaison à un modèle de vue dans un modèle MVVM. JavaFX utilise-t-il également la liaison?
  3. WPF utilise le GPU pour le rendu, JavaFX fait-il la même chose?
  4. Comment Silverlight se compare-t-il à JavaFX lorsqu’il est exécuté via un navigateur sur un PC net?

… Plus à venir…

Je change ceci en wiki de communauté afin que les comparaisons puissent continuer à être mises à jour (espérons-le).

J’apprends JavaFX depuis quelques semaines. Voici un aperçu de haut niveau de la comparaison avec WPF à mes yeux:

Tous mes commentaires sont liés à JavaFX 2.0. Cette information sera probablement sujette à changement car la plate-forme est encore assez immature et est activement développée.

Graphique

Comme WPF, JavaFX utilise un système de rendu graphique conservé. L’interface utilisateur comprend un graphe de scène composé de «noeuds», que l’on peut considérer comme conceptuellement similaire à UIElement de WPF.

JavaFX déchargera le rendu graphique sur le GPU s’il est disponible. Le système graphique utilise DirectX sur Windows et OpenGL sur d’autres plates-formes.

Balisage

Les interfaces utilisateur JavaFX peuvent être créées à la fois en code et via un balisage FXML similaire à XAML, dans la mesure où le graphique d’object peut être créé par des éléments d’imbrication.

FXML possède des fonctionnalités similaires à XAML telles que la liaison de propriété (expressions simples uniquement) et la liaison aux gestionnaires d’événements (toute méthode onEvent ). Les gestionnaires d’événements peuvent être déclarés en ligne, mais généralement, vous vous liez à un événement dans le contrôleur associé.

Les fichiers FXML peuvent avoir un contrôleur associé qui vous permet de déclarer des gestionnaires d’événements complexes et de définir des liaisons entre les propriétés. Ceci est un contrôleur au sens MVC et n’est pas le même que viewModel dans le monde WPF (généralement, un contrôleur aura des références aux nœuds et aux contrôles).

Une différence avec WPF est qu’il semble que le FXML ne soit pas compilé dans une représentation binary intermédiaire comme BAML. Je n’ai pas encore remarqué de problèmes de performance, mais je n’ai pas utilisé le système de manière approfondie. J’ai cependant remarqué que FXML a généralement tendance à être plus court que n’importe quel XAML car la plate-forme vous encourage toujours à écrire du code et que les styles sont déclarés séparément.

Une introduction à FXML peut être trouvée ici .

Un générateur de scènes est fourni gratuitement (comme dans la bière), donc si vous n’aimez pas le codage manuel de l’interface utilisateur, vous pouvez faire glisser des éléments, définir des propriétés et se lier au code dans votre contrôleur. De toute évidence, le créateur de la scène est loin d’être aussi puissant qu’Expression Blend, mais il est toujours meilleur que le concepteur fourni par Visual Studio.

Contraignant

JavaFX possède une propriété et un système de liaison très puissants. Le modèle Java Bean a été étendu pour inclure des classes qui encapsulent une propriété (similaire à la manière dont les propriétés de dépendance WPF représentent des propriétés). Ces classes implémentent des interfaces qui fournissent une notification d’invalidation et de modification.

Il y a une distinction entre les notifications d’invalidation et les notifications de modification. Les invalides vous disent simplement que l’expression de liaison est maintenant invalide et doit être recalculée; le recalcul ne se produit pas tant que vous n’avez pas demandé la valeur de la propriété via ses méthodes get() ou getValue() . Si vous avez enregistré un écouteur de modification, alors l’expression sera réévaluée immédiatement et tout ce qui est lié à cette propriété reflétera les modifications.

JavaFX expose ces propriétés de la même manière à WPF avec une propriété get et set et une méthode qui renvoie une instance du wrapper de propriété (qui n’est pas statique, comme les propriétés WPF).

Des liaisons complexes peuvent être créées entre plusieurs propriétés. Voulez-vous qu’une propriété entière soit la sum de deux autres (a = b + c)? Pas de problème, JavaFX fournit une API Fluent pour exprimer ce type de relations EG

A.Ajouter (B, C);

Si la valeur de B ou de C change, les notifications appropriées seront alors affichées pour que le système sache que A doit être réévalué. Notez que dans ce cas, une exception sera lancée si vous essayez de définir la valeur de A car elle est liée aux autres propriétés, ce qui n’a aucun sens dans ce contexte.

Ces expressions peuvent être assez complexes EG a = (b + c) * (d - e) et peuvent inclure un nombre quelconque de propriétés. L’API fluide est assez facile à lire et à utiliser, mais n’est pas aussi agréable que certaines des API Fluent fournies par certaines des bibliothèques Microsoft, mais cela est davantage dû aux limitations du langage Java qu’à JavaFX lui-même.

Des liaisons simples bidirectionnelles peuvent être créées entre des propriétés du même type, de sorte que si l’une est mise à jour, l’autre reflète automatiquement le changement.

JavaFX fournit également une API de bas niveau pour personnaliser vous-même les liaisons si vous souhaitez créer une expression de liaison personnalisée qui n’est pas fournie par l’API ou si vous êtes préoccupé par les performances.

L’une des plus grandes différences entre JavaFX et WPF est que les liaisons sont principalement exécutées dans le code JavaFX par rapport à la manière dont WPF établit des liaisons dans le balisage.

Une introduction aux propriétés et aux liaisons peut être trouvée ici .

modes

JavaFX utilise CSS pour modifier l’apparence des noeuds contenus dans le graphe de scène. Il existe une spécification complète expliquant les types et les propriétés pouvant être définis sur chaque type de nœud.

JavaFX fournit également des ajouts qui aident à améliorer le CSS, notamment des variables pouvant être définies et utilisées ailleurs

 .button { my-custom-color: RGB(234, 44, 78); } .my-control { -fx-background-color: my-custom-color } 

Il fournit également quelques fonctions qui vous permettent de dériver des couleurs d’autres couleurs définies précédemment, ce qui est utile pour créer des choses comme des dégradés. Cela signifie qu’une palette de couleurs de base peut être définie et le rest peut être généré à partir de ces valeurs (c’est ce que fait le fichier CSS JavaFX par défaut).

JavaFX CSS ne vous permet pas de définir le type de disposition utilisé par un nœud (à la date d’écriture, toute la mise en page doit être effectuée dans le code). Cela fonctionne très bien pour moi car c’est l’aspect de CSS qui me fait vraiment mal lorsque je l’utilise avec HTML.

Personnellement, je préfère les styles CSS aux styles XAML qui ont tendance à être trop verbeux à mon goût.

Un guide de JavaFX CSS peut être trouvé ici .

Disposition

JavaFX fournit un certain nombre de panneaux de présentation similaires à ceux fournis par WPF. Une différence que j’ai remarquée est que le contrat de mesure et de mise en page est défini plus haut dans la chaîne d’inheritance dans la classe Region .

Comme mentionné précédemment, la mise en page ne peut pas être effectuée à l’aide de CSS, mais peut être exprimée à l’aide du code, FXML ou créée à l’aide du générateur de scènes (qui est finalement converti en FXML).

Contrôles

JavaFX fournit une bibliothèque sans cesse croissante de contrôles auxquels nous nous attendions. Une différence majeure entre JavaFX et WPF est que les contrôles sont essentiellement des boîtes noires et ne peuvent pas être reformulés de la même manière que les contrôles WPF. Ils semblent également exposer beaucoup moins de propriétés que les contrôles WPF.

Les contrôles exposent certaines régions spécifiques à l’implémentation à des CSS, ce qui permet de cibler des zones spécifiques d’un contrôle en fonction de vos styles. Ceci est connu comme la sousstructure du contrôle. CheckBox expose deux sous-structures. la case et la coche permettant de styliser indépendamment chaque partie du contrôle. Notez que, comme décrit précédemment, l’ apparence d’un contrôle peut être modifiée à l’aide de CSS, mais le toucher ne le peut pas. Par exemple, vous ne pouvez pas modifier radicalement la façon dont un TabPane présente son contenu en modifiant son panneau de disposition interne comme vous le TabControl avec WPF TabControl .

Bien que cela semble assez limitatif, la méthode privilégiée pour créer des contrôles personnalisés dans JavaFX semble utiliser la composition comme dérivant d’un panneau de disposition pour positionner les contrôles standard et les re-styliser à l’aide de CSS.

Conclusion

Globalement, je suis très impressionné par ce que JavaFX a à offrir pour le moment. Bien que ce ne soit pas aussi proche que WPF, il est activement développé et Oracle semble certainement le soutenir. Le temps dira si c’est réussi ou non.

Je recommanderais d’essayer JavaFX. Lisez la documentation et essayez de créer une petite application et voyez ce que vous en pensez.

Vous devriez également consulter FXExperience.com qui est mis à jour régulièrement avec des informations de l’équipe de développement.

Je pense que la meilleure façon d’avoir une idée de JavaFX est de l’essayer. Il existe de bons tutoriels sur le site Web JavaFX. Voici un couple:

  • Le langage JavaFX
  • Créer une interface utilisateur dans JavaFX

Ils sont assez rapides et vous donnent une bonne idée de la langue. Il y en a beaucoup d’autres sur le site JavaFX si vous êtes intéressé par d’autres didacticiels et articles.

Pour des réponses spécifiques à vos questions:

  1. JavaFX a son propre langage déclaratif pour créer “l’arborescence visuelle” qui n’est pas un dérivé XML. L’interface utilisateur est basée sur un graphique de scène afin que vous puissiez appliquer divers effets et animations à n’importe quel nœud du graphique. Voir les tutoriels pour plus d’informations. Il existe également un outil de conception pour JavaFX (que je n’ai pas encore essayé).
  2. JavaFX a une liaison intégrée dans le langage .
  3. JavaFX sur le bureau utilise Java AWT / Swing qui utilise le rendu GPU. Chaque version de Java semble décharger davantage de graphiques sur le GPU. Chris Campbell, de Sun, a écrit sur le sujet de l’ accélération GPU . Je ne sais pas si la version mobile de JavaFX a une accélération GPU. J’ai trouvé que les versions précédentes de JavaFX n’étaient pas assez performantes pour ce dont j’avais besoin, mais je sais que la dernière version présente des améliorations de performances significatives par rapport aux versions précédentes et qu’elles travaillent toujours plus vite.
  4. JavaFx utilise des applets Java pour s’exécuter dans le navigateur. Depuis la mise à jour de Java 6, le framework d’applet Java a été retravaillé et bien qu’il ne soit pas aussi transparent qu’Adobe Flash, il s’est beaucoup amélioré. Je ne sais pas comment cela se compare à Silverlight, si ce n’est que j’ai eu du mal à faire fonctionner Silverlight sous Linux, mais JavaFX fonctionnait sous Linux.

Voici une autre question connexe .