89 votes

Comment JavaFX se compare-t-il à WPF?

Je suis surtout un programmeur C#, j'ai arrêté d'écrire Java environ 10 ans, mais j'essaie de garder en place avec la technologie Java en lisant des articles, en parlant avec des amis, etc.

J'ai entendu parler du nouveau riche GUI cadre appelé JavaFX, mais ne pouvais pas trouver toutes les ressources de la comparer avec les non-Java parallels.

Depuis que je suis très familier avec le C# et WPF, j'aimerais avoir une idée sur la façon similaire ou différent, les deux technologies sont.

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

  1. WPF utilise le code XAML pour créer le visuel de l'arbre, ne JavaFX avoir quelque chose de similaire?
  2. WPF est préférable de l'utiliser avec la liaison à un modèle de vue dans un pattern MVVM, ne JavaFX aussi faire un large usage de la liaison?
  3. WPF utilise le GPU pour le rendu, ne JavaFX faire de même?
  4. Comment Silverlight comparer à JavaFX lorsqu'il est exécuté par un navigateur sur un pc net?

... D'autres à venir...

Je vais changer ce wiki de la communauté, de sorte que les comparaisons d'obtenir de mise à jour (je l'espère).

116voto

Benjamin Gale Points 5390

J'ai été l'apprentissage de JavaFX pour les deux dernières 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. Cette information sera probablement l'objet de changement de la plate-forme est encore assez immature et est activement développée.

Graphiques

Comme WPF, JavaFX utilise un conservés du rendu graphique du système. L'interface utilisateur se compose d'un graphe de scène qui est composé de "nœuds" qui peut être considéré comme conceptuellement similaire à WPF UIElement.

JavaFX va décharger le rendu des graphiques pour le GPU, si disponible. Le système graphique utilise DirectX sur Windows et OpenGL sur d'autres plates-formes.

Balisage

JavaFX interfaces utilisateur peuvent être créés à la fois dans le code et via FXML de balisage qui est similaire à XAML dans le graphe d'objets peuvent être créés par l'imbrication des éléments.

FXML a certaines caractéristiques similaires à XAML comme la propriété de liaison (expressions simples seulement) et la liaison à des gestionnaires d'événements (tout onEvent méthode). Les gestionnaires d'événements peuvent être déclarés en ligne, mais en général, vous lier à un événement dans le contrôleur associé.

FXML fichiers peut être associée à un contrôleur qui vous permet de déclarer des complexes et des gestionnaires d'événements pour la configuration des liaisons entre les propriétés. C'est un contrôleur dans le MVC sens et n'est pas la même chose qu'un viewModel WPF (généralement un contrôleur aura des références à des nœuds et des contrôles).

Une différence de WPF est qu'il semble que le FXML est pas compilé dans un intermédiaire représentation binaire comme BAML. Je n'ai pas remarqué de problèmes de performances, mais encore n'ont pas utilisé le système en profondeur. J'ai remarqué, cependant, que FXML généralement tendance à être plus courts que tout le code XAML comme la plate-forme encore vous encourage à écrire du code et de styles sont déclarés séparément.

Une introduction au FXML peut être trouvé ici.

Une scène du générateur est fourni gratuitement (comme dans la bière), donc si vous n'aimez pas le codage à la main de l'INTERFACE utilisateur, vous pouvez glisser et déposer des éléments, définir les propriétés et lier de code dans votre contrôleur et le FXML sera généré automatiquement. Évidemment, la scène builder est nulle part près d'aussi puissant que l'Expression Blend, mais c'est toujours mieux que le " designer de Visual Studio.

La liaison

JavaFX est un très puissant propriété et le système de liaison. La Java Bean modèle a été étendu pour inclure les classes qui encapsulent une propriété (de la même façon WPF propriétés de dépendance représentent des propriétés). Ces classes implémentent les interfaces qui fournissent de l'invalidation et la notification de changement.

Il y a une distinction entre l'invalidation des notifications et des notifications de changement. Invalidations juste de vous dire que l'expression de liaison est maintenant invalide et doit être recalculé; le recalcul n'est pas réellement se produire jusqu'à ce que vous demande la valeur de la propriété par l'intermédiaire de son get() ou getValue() méthodes. Si vous avez enregistré un changement écouteur, cependant, l'expression sera ré-évalué immédiatement et tout ce qui est lié à cette propriété de refléter les changements.

JavaFX expose ces propriétés de manière similaire à la WPF avec un get et set de la propriété et une méthode qui retourne une instance de la propriété wrapper (qui ne sont pas statiques comme WPF propriétés).

Complexe de liaisons peut être créé entre plusieurs propriétés. Voulez un entier de biens à la somme des deux autres (a = b + c)? Pas de problème, JavaFX fournit une API Fluent pour exprimer ce genre de relations E. G.

A. Add(B, C);

Si la valeur de B ou de C modifie alors les notifications seront soulevées sorte que le système sait qu'Un besoin d'être ré-évalué. Notez que dans ce cas, une exception sera levée si vous essayez de définir la valeur d'Un car il est lié aux autres propriétés de sorte qu'il n'a pas de sens dans ce contexte.

Ces expressions peuvent être assez complexe E. G. a = (b + c) * (d - e) et peut inclure n'importe quel nombre de propriétés. L'API fluent est assez facile à lire et à utiliser, mais n'est pas aussi beau que certains de l'API Fluent est fourni par certains des bibliothèques Microsoft, mais c'est plus vers le bas pour le langage Java limites plutôt que de JavaFX lui-même.

Simple bi-directionnelle liaisons peuvent être créés entre des propriétés du même type, de sorte que si l'on a mis à jour l'autre reflète automatiquement la modification.

JavaFX fournit également un faible niveau d'API pour personnaliser les liaisons de vous-même si vous souhaitez créer une liaison personnalisée expression qui n'est pas fourni par l'API ou si vous êtes préoccupé par la performance.

L'une des plus grandes différences entre les JavaFX et WPF est que les liaisons sont principalement réalisées dans le code en JavaFX vs WPF manière à établir des liaisons en mark-up.

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

Styles

JavaFX utilise le CSS pour changer les regards des noeuds contenus dans le graphe de scène. Il y a une spécification complète disponible, ce qui explique les types et les propriétés qui peuvent être définies sur chaque type de nœud.

JavaFX fournit également quelques ajouts qui aident à améliorer les CSS, telles que les variables qui peuvent être définis et utilisés ailleurs E. G.

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

.my-control {
    -fx-background-color: my-custom-color
}

Il fournit également un couple de fonctions qui vous permettent de dériver des couleurs à partir d'autres précédemment définie couleurs qui est utile pour créer des choses comme les gradients. Cela signifie qu'une base de la palette de couleurs peuvent être définies et le reste peut être généré à partir de ces valeurs (c'est ce que la valeur par défaut JavaFX fichier CSS).

JavaFX CSS ne permet pas de définir le type de schéma utilisé par un nœud (comme de l'écriture de cette toute disposition doit être effectuée dans le code). Cela fonctionne vraiment bien pour moi car c'était le seul aspect de la CSS qui vraiment m'a causé une douleur lors de l'utilisation de HTML.

Personnellement, je préfère le CSS pour XAML styles qui ont tendance à être trop bavard à mon goût.

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

Mise en page

JavaFX fournit un certain nombre de disposition des volets qui sont semblables à ceux fournis par WPF. Une différence que j'ai remarqué, c'est que la mesure et la mise en page du contrat est défini plus haut dans la chaîne d'héritage dans l' Region classe.

Comme mentionné précédemment, la Mise en page ne peut pas être effectué à l'aide de CSS, mais peut être exprimé en utilisant le code, FXML ou créé à l'aide de la scene builder (qui est finalement converti à FXML).

Les contrôles

JavaFX fournit de plus en plus de la bibliothèque de commandes qui nous sont venus à s'attendre. Une différence majeure entre JavaFX et WPF est que les contrôles sont essentiellement des boîtes noires et ne peut pas être re-modélisé dans la façon dont les contrôles WPF peut. Ils semblent également exposer beaucoup moins propriétés que les contrôles WPF.

Les contrôles ne exposer certains de la mise en œuvre des régions spécifiques aux feuilles de style CSS permettant à des zones spécifiques d'un contrôle afin d'être ciblé par vos styles. Ceci est connu comme la sous-structure de la commande. E. G. un CheckBox expose deux sous-structures; la case et la case à cocher permettant à chaque partie du contrôle de style de façon indépendante. Notez que, comme décrit précédemment, seul le regard d'un contrôle peut être modifié à l'aide de CSS, mais la sensation ne peut pas. E. G. vous ne pouvez pas modifier radicalement la façon dont un TabPane définit la nature de son contenu en modifiant son agencement interne du panneau dans la façon dont vous pouvez le faire avec le WPF TabControl.

Tout cela semble assez limitant, le moyen privilégié de la création de contrôles personnalisés en JavaFX semble être l'utilisation de la composition le long des lignes de dérivation à partir d'un panneau de disposition à la position standard des contrôles et re-styling eux à l'aide de CSS.

Conclusion

Globalement, je suis très impressionné par ce que JavaFX a à offrir en ce moment. Alors que c'est pas loin d'être aussi mature que WPF, il est activement développé et Oracle semblent être la sauvegarde de ce. Le temps dira si elle est réussie ou pas.

Je voudrais vous recommandons de donner JavaFX un essai. Lire la documentation et essayez mettre ensemble une petite application et voir 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.

20voto

Jay Askren Points 5332

Je pense que la meilleure façon d'obtenir un sentir pour JavaFX est juste de l'essayer. Il y a quelques bons tutoriels sur le JavaFX site web. Voici un couple:

Ils sont assez rapide et vous donner une bonne idée de la langue. Il y a beaucoup d'autres sur le JavaFX site si vous êtes intéressé par plus de tutoriels et d'articles.

Pour des réponses précises à vos questions:

  1. JavaFX a son propre langage déclaratif pour la création de la "visual tree", qui n'est pas un dérivé de xml. L'INTERFACE utilisateur est basée sur un graphe de scène de sorte que vous pouvez appliquer divers effets et animation d'un nœud dans le graphe. Voir le tutoriel pour plus d'informations. Il est également un outil de concepteur de JavaFX (que je n'ai pas encore essayé).
  2. JavaFX a liaison intégré dans la langue.
  3. JavaFX sur le bureau utilise Java AWT/Swing qui n'utiliser le rendu sur GPU. Toutes les versions de Java semble déchargement plus de ses graphismes pour le GPU. Chris Campbell, de Soleil a blogué au sujet de l'accélération GPU. Je ne sais pas si la version mobile de JavaFX a l'accélération GPU. J'ai trouvé que des versions antérieures de JavaFX n'étaient pas assez performant pour ce que j'en avais besoin, mais je sais que la dernière version n'ont d'importantes améliorations de performances par rapport aux versions précédentes et ils sont encore en train de faire plus rapide.
  4. JavaFx utilise des Applets Java à exécuter dans le navigateur. Comme de Java 6 update 10, l'applet Java cadre a été retravaillé et s'il n'est pas aussi transparente que Adobe flash, il est beaucoup améliorée. Je ne suis pas sûr de savoir comment il se compare à Silverlight autres que j'ai eu du mal à me Silverlight sur Linux, mais ne se Charge de travail sur Linux.

Voici une autre question connexe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X