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 Region
classe.
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 CheckBox
expose 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 TabPane
pré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.