web-dev-qa-db-fra.com

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 de Java en lisant des articles, parler avec des amis, etc.

J'ai entendu parler du nouveau cadre graphique riche appelé JavaFX, mais je n'ai trouvé aucune ressource le comparant avec des parallèles non Java.

Comme je suis très familier avec C # et WPF, j'aimerais avoir une idée de la similitude ou de la différence des deux technologies.

EDIT: Vu qu'il n'y a pas de réponse à 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. WPF est mieux utilisé avec la liaison à un modèle de vue dans un modèle MVVM, JavaFX utilise-t-il également largement 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 cela en wiki communautaire afin que les comparaisons puissent continuer à être mises à jour (avec un peu de chance).

86
Aviad P.

J'apprends JavaFX depuis quelques semaines. Voici un aperçu de haut niveau de la façon dont il se compare à WPF à mes yeux:

Tous mes commentaires sont liés à JavaFX 2.0. Ces informations seront probablement sujettes à changement car la plate-forme est encore assez immature et est activement développée.

Graphiques

Comme WPF, JavaFX utilise un système de rendu graphique conservé. L'interface utilisateur comprend un graphe de scène qui est composé de "nœuds" qui peuvent être considérés comme conceptuellement similaires au UIElement de WPF.

JavaFX déchargera le rendu graphique sur le GPU si 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 dans le code et via le balisage FXML qui est similaire à XAML dans la mesure où le graphique d'objet peut être créé par des éléments d'imbrication.

FXML a 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 vous vous associez généralement à 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 configurer des liaisons entre les propriétés. Il s'agit d'un contrôleur au sens MVC et n'est pas identique à un 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 est pas compilé en une représentation binaire intermédiaire comme BAML. Je n'ai pas encore remarqué de problèmes de performances, mais je n'ai pas beaucoup utilisé le système. 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 les styles sont déclarés séparément.

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

Un générateur de scène est fourni gratuitement (comme dans la bière), donc si vous n'aimez pas coder manuellement l'interface utilisateur, vous pouvez faire glisser et déposer des éléments, définir des propriétés et lier au code dans votre contrôleur et le FXML sera généré automatiquement. De toute évidence, le générateur de scène est loin d'être aussi puissant que Expression Blend, mais il est toujours meilleur que le "concepteur" fourni par Visual Studio.

Liaison

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 les classes qui encapsulent une propriété (semblable à la façon dont les propriétés de dépendance WPF représentent les propriétés). Ces classes implémentent des interfaces qui fournissent une invalidation et une notification de modification.

Il existe une distinction entre les notifications d'invalidation et les notifications de modification. Les invalidations vous indiquent simplement que l'expression de liaison est désormais 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(). Cependant, si vous avez enregistré un écouteur de modifications, 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 d'une manière similaire à WPF avec une propriété get et set et une méthode qui renvoie une instance de l'encapsuleur de propriétés (qui ne sont pas statiques comme les propriétés WPF).

Des liaisons complexes peuvent être créées entre les propriétés multiple. Vous voulez qu'une propriété entière soit la somme de deux autres (a = b + c)? Pas de problème, JavaFX fournit une API Fluent pour exprimer ce type de relations E.G.

A.Add (B, C);

Si la valeur de B ou C change, les notifications appropriées seront déclenchées afin que le système sache que A doit être réévalué. Notez que dans ce cas, une exception sera levée si vous essayez de définir la valeur de A car elle est liée aux autres propriétés, donc cela n'a pas de sens dans ce contexte.

Ces expressions peuvent être assez complexes E.G. a = (b + c) * (d - e) et peut inclure n'importe quel nombre 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 de langage Java Java plutôt que JavaFX lui-même.

Des liaisons bidirectionnelles simples 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 effectuées dans le code dans JavaFX par rapport à la façon WPF d'établir des liaisons dans le balisage.

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

Styles

JavaFX utilise CSS pour changer l'apparence des nœuds contenus dans le graphique de la scène. Il existe une spécification complète disponible qui explique les types et les propriétés qui peuvent être définis sur chaque type de nœud.

JavaFX fournit également des ajouts qui aident à améliorer CSS, tels que des variables qui peuvent être définies et utilisées ailleurs E.G.

.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 à partir d'autres couleurs précédemment définies, 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 reste 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 mise en page utilisé par un nœud (au moment de l'écriture, toute mise en page doit être effectuée en code). Cela fonctionne très bien pour moi car c'est le seul aspect du CSS qui m'a vraiment fait mal quand je l'ai utilisé 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 volets de disposition 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'héritage 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ène (qui est finalement converti en FXML).

Commandes

JavaFX fournit une bibliothèque de contrôles sans cesse croissante à laquelle nous nous attendons. Une différence majeure entre JavaFX et WPF est que les contrôles sont essentiellement des boîtes noires et ne peuvent pas être reprogrammé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 de l'implémentation à CSS, permettant à des zones spécifiques d'un contrôle d'être ciblées par vos styles. Ceci est connu sous le nom de sous-structure du contrôle. PAR EXEMPLE. un CheckBox expose deux sous-structures; la case et la coche permettant de styliser chaque partie du contrôle indépendamment. Notez que comme décrit précédemment, seul le look d'un contrôle peut être modifié à l'aide de CSS mais pas le feel. 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 de la même manière que vous le pouvez avec le WPF TabControl.

Bien que cela semble assez limitatif, la façon préférée de créer des contrôles personnalisés dans JavaFX semble utiliser la composition le long des lignes de dérivation d'un panneau de disposition pour positionner les contrôles standard et les reformuler en utilisant CSS.

Conclusion

Dans l'ensemble, je suis très impressionné par ce que JavaFX a à offrir en ce moment. Bien qu'il ne soit pas aussi mature que WPF, il est activement développé et Oracle semble certainement le soutenir. Le temps nous dira si c'est réussi ou non.

Je recommanderais d'essayer JavaFX. Lisez la documentation et essayez de monter une petite application et voyez ce que vous en pensez.

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

115
Benjamin Gale

Je pense que la meilleure façon d'avoir une idée de JavaFX est de l'essayer. Il existe de bons didacticiels sur le site Web JavaFX. En voici deux:

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 plus de tutoriels et d'articles.

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

  1. JavaFX possède 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 plus de ses graphiques vers le GPU. Chris Campbell de Sun a blogué sur Accélération GP . Je ne sais pas si la version mobile de JavaFX a une accélération GPU. J'ai trouvé que les versions antérieures de JavaFX n'étaient pas assez performantes pour ce dont j'avais besoin, mais je sachez que la dernière version a des améliorations de performances significatives par rapport aux versions précédentes et ils travaillent toujours à la rendre plus rapide.
  4. JavaFx utilise Java Applets pour s'exécuter dans le navigateur. À partir de Java 6 mise à jour 10, le Java framework d'applet Java a été retravaillé et bien qu'il ne soit pas aussi transparent qu'Adobe flash, il est beaucoup amélioré. Je ne sais pas comment il se compare à Silverlight, sauf que j'ai eu du mal à faire fonctionner Silverlight sur Linux, mais que JavaFX a fonctionné sur Linux.

Voici une autre question connexe .

20
Jay Askren