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.