Comment JavaFX se compare-t-il à WPF? [fermé]

93

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 du nouveau cadre d'interface graphique riche appelé JavaFX, mais je n'ai trouvé aucune ressource le comparant aux 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 entre les deux technologies.

EDIT: Vu qu'il n'y a pas de réponses à venir, j'essaierai 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 de même?
  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 (espérons-le).

Aviad P.
la source
7
C'est drôle qu'une question avec 83 votes positifs puisse être considérée comme non constructive.
kristianp

Réponses:

120

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.

Graphique

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 à ceux de WPF UIElement.

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 dans le code et via le balisage FXML qui est similaire à XAML en ce que le graphe d'objets peut être créé en imbriquant des éléments.

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 vous vous liez 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 n'est pas compilé dans 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 constructeur de scène 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 et déposer des éléments, définir les 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ènes est loin d'être aussi puissant que 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é (de la même manière que les propriétés de dépendance WPF représentent les propriétés). Ces classes implémentent des interfaces qui fournissent des notifications d'invalidation et 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 réellement que lorsque vous demandez la valeur de la propriété via ses méthodes get()ou getValue(). Cependant, si vous avez enregistré un écouteur de modification, l'expression sera immédiatement réévaluée 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 que WPF avec une propriété get and set et une méthode qui renvoie une instance du wrapper de propriété (qui ne sont pas statiques comme les propriétés WPF).

Des liaisons complexes peuvent être créées entre plusieurs propriétés. 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 EG

A. Ajouter (B, C);

Si la valeur de B ou de 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 EG assez complexes a = (b + c) * (d - e)et peuvent inclure n'importe quel nombre de propriétés. L'API Fluent 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 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 de JavaFX par rapport à la manière WPF d'établir 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 nœuds contenus dans le graphe de 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 le CSS, tels que des variables qui peuvent être définies et utilisées ailleurs EG

.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 précédemment définies, ce qui est utile pour créer des éléments tels que 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 dans le code). Cela fonctionne très bien pour moi car c'est le seul aspect du CSS qui m'a vraiment causé de la douleur lors de son utilisation avec HTML.

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

Un guide sur 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 la mesure et le contrat de mise en page sont définis plus haut dans la chaîne d'héritage dans la Regionclasse.

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

Contrôles

JavaFX fournit une bibliothèque sans cesse croissante de contrôles auxquels nous nous attendons. Une différence majeure entre JavaFX et WPF réside dans le fait que les contrôles sont essentiellement des boîtes noires et ne peuvent pas être remodelé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 des régions spécifiques de l'implémentation au CSS, ce qui permet à des zones spécifiques d'un contrôle d'être ciblées par vos styles. Ceci est connu comme la sous - structure du contrôle. EG a CheckBoxexpose deux sous-structures; la case et la coche permettant à chaque partie du champ d'être stylée indépendamment. Notez que comme décrit précédemment, seule l' apparence d'un contrôle peut être modifiée à l'aide de CSS, mais pas la sensation . Par exemple, vous ne pouvez pas modifier radicalement la façon dont a TabPaneprésente son contenu en modifiant son panneau de disposition interne comme vous le pouvez avec le WPF TabControl.

Bien que cela semble assez limitatif, la manière préférée de créer des contrôles personnalisés dans JavaFX semble être d'utiliser la composition le long des lignes de dérivation d'un panneau de disposition pour positionner les contrôles standard et les redéfinir à l'aide de CSS.

Conclusion

Dans l'ensemble, je suis très impressionné par ce que JavaFX a à offrir pour le 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 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 les informations de l'équipe de développement.

Benjamin
la source
9
Merci beaucoup pour cela, c'est très instructif. Si vous pouviez améliorer cette réponse au fur et à mesure que vous avancez dans vos connaissances de JavaFX, ce serait génial.
Aviad P.
5
J'ai également aimé lire votre réponse et j'aimerais en savoir plus si votre travail avec JavaFX révèle d'autres informations.
Paul-Sebastian Manole
21

Je pense que la meilleure façon de se faire une idée de JavaFX est de simplement l'essayer. Il existe de bons didacticiels sur le site Web JavaFX. En voici quelques-uns:

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 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. Consultez les didacticiels 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 ses graphiques sur le GPU. Chris Campbell de Sun a blogué sur 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 antérieures 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 à l'accélérer.
  4. JavaFx utilise des applets Java pour s'exécuter dans le navigateur. Depuis la mise à jour 10 de Java 6, le cadre de l'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 cela se compare à Silverlight, à part que j'ai eu du mal à faire fonctionner Silverlight sous Linux, mais que JavaFX fonctionne sous Linux.

Voici une autre question connexe .

Jay Askren
la source
15
Cette réponse est obsolète car JavaFX a subi d'importantes mises à jour dans Java 7. Regardez ici .
Zoltán
7
Êtes-vous sûr que JavaFX utilise swing et AWT? Je crois qu'il a son propre moteur de rendu appelé prism. Aucun thread de distribution d'événements n'est créé lors de l'exécution d'une application JavaFX.
Andy jusqu'au