Ich habe in den letzten Wochen JavaFX gelernt. Hier ist ein allgemeiner Überblick darüber, wie es in meinen Augen mit WPF verglichen wird:
Alle meine Kommentare beziehen sich auf JavaFX 2.0. Diese Informationen können sich wahrscheinlich ändern, da die Plattform noch ziemlich unausgereift ist und aktiv weiterentwickelt wird.
Grafik
JavaFX verwendet wie WPF ein beibehaltenes Grafik-Rendering-System. Die Benutzeroberfläche umfasst ein Szenendiagramm, das aus "Knoten" besteht, die als konzeptionell ähnlich zu WPFs angesehen werden können UIElement
.
JavaFX verlagert das Grafik-Rendering auf die GPU, falls verfügbar. Das Grafiksystem verwendet DirectX unter Windows und OpenGL auf anderen Plattformen.
Markup
JavaFX-Benutzeroberflächen können sowohl im Code als auch über ein FXML-Markup erstellt werden, das XAML insofern ähnlich ist, als das Objektdiagramm durch Verschachteln von Elementen erstellt werden kann.
FXML verfügt über einige ähnliche Funktionen wie XAML, z. B. die Eigenschaftsbindung (nur einfache Ausdrücke) und die Bindung an Ereignishandler (jede onEvent- Methode). Ereignishandler können inline deklariert werden. In der Regel werden Sie jedoch an ein Ereignis im zugehörigen Controller gebunden.
FXML-Dateien können einem Controller zugeordnet sein, mit dem Sie komplexe Ereignishandler deklarieren und Bindungen zwischen Eigenschaften einrichten können. Dies ist ein Controller im MVC-Sinne und nicht dasselbe wie ein viewModel in der WPF-Welt (normalerweise hat ein Controller Verweise auf Knoten und Steuerelemente).
Ein Unterschied zu WPF besteht darin, dass die FXML anscheinend nicht in eine binäre Zwischendarstellung wie BAML kompiliert wird. Ich habe noch keine Leistungsprobleme bemerkt, aber das System nicht ausgiebig genutzt. Ich habe jedoch festgestellt, dass FXML normalerweise kürzer ist als jede XAML, da die Plattform Sie weiterhin zum Schreiben von Code ermutigt und Stile separat deklariert werden.
Eine Einführung in FXML finden Sie hier .
Ein Szenen-Builder wird kostenlos zur Verfügung gestellt (wie bei Bier). Wenn Sie die Benutzeroberfläche nicht von Hand codieren möchten, können Sie Elemente per Drag & Drop verschieben, Eigenschaften festlegen und an Code in Ihrem Controller binden. Die FXML wird automatisch generiert. Natürlich ist der Szenengenerator bei weitem nicht so leistungsfähig wie Expression Blend, aber er ist immer noch besser als der von Visual Studio bereitgestellte "Designer".
Bindung
JavaFX verfügt über ein sehr leistungsfähiges Eigenschaften- und Bindungssystem. Das Java Bean-Muster wurde um Klassen erweitert, die eine Eigenschaft kapseln (ähnlich wie WPF-Abhängigkeitseigenschaften Eigenschaften darstellen). Diese Klassen implementieren Schnittstellen, die eine Ungültigmachung und Änderungsbenachrichtigung bereitstellen.
Es wird zwischen Ungültigkeitsbenachrichtigungen und Änderungsbenachrichtigungen unterschieden. Invalidierungen sagen Ihnen nur, dass der Bindungsausdruck jetzt ungültig ist und neu berechnet werden muss. Die Neuberechnung erfolgt erst, wenn Sie den Eigenschaftswert über seine get()
oder getValue()
Methoden anfordern . Wenn Sie jedoch einen Änderungslistener registriert haben, wird der Ausdruck sofort neu ausgewertet, und alles, was an diese Eigenschaft gebunden ist, spiegelt die Änderungen wider.
JavaFX macht diese Eigenschaften ähnlich wie WPF mit einer get- und set-Eigenschaft und einer Methode verfügbar, die eine Instanz des Property Wrappers zurückgibt (die nicht statisch sind wie WPF-Eigenschaften).
Komplexe Bindungen können zwischen mehreren Eigenschaften erstellt werden. Möchten Sie, dass eine ganzzahlige Eigenschaft die Summe von zwei anderen ist (a = b + c)? Kein Problem, JavaFX bietet eine Fluent-API, um diese Art von Beziehungen auszudrücken
A. Hinzufügen (B, C);
Wenn sich der Wert von B oder C ändert, werden die entsprechenden Benachrichtigungen ausgelöst, damit das System weiß, dass A neu bewertet werden muss. Beachten Sie, dass in diesem Fall eine Ausnahme ausgelöst wird, wenn Sie versuchen, den Wert von A festzulegen, da er an die anderen Eigenschaften gebunden ist, sodass dies in diesem Kontext keinen Sinn ergibt.
Diese Ausdrücke können ziemlich komplex sein a = (b + c) * (d - e)
und eine beliebige Anzahl von Eigenschaften enthalten. Die fließende API ist recht einfach zu lesen und zu verwenden, aber nicht so gut wie einige der fließenden APIs, die von einigen Microsoft-Bibliotheken bereitgestellt werden. Dies liegt jedoch eher an den Einschränkungen der Java-Sprache als an JavaFX selbst.
Zwischen Eigenschaften desselben Typs können einfache bidirektionale Bindungen erstellt werden, sodass bei einer Aktualisierung die andere automatisch die Änderung widerspiegelt.
JavaFX bietet auch eine API auf niedriger Ebene, mit der Sie Bindungen selbst anpassen können, wenn Sie einen benutzerdefinierten Bindungsausdruck erstellen möchten, der nicht von der API bereitgestellt wird, oder wenn Sie Bedenken hinsichtlich der Leistung haben.
Einer der größten Unterschiede zwischen JavaFX und WPF besteht darin, dass Bindungen hauptsächlich in Code in JavaFX ausgeführt werden, im Gegensatz zur WPF-Methode zum Einrichten von Bindungen in Markups.
Eine Einführung in Eigenschaften und Bindungen finden Sie hier .
Stile
JavaFX verwendet CSS, um das Aussehen der im Szenendiagramm enthaltenen Knoten zu ändern. Es ist eine vollständige Spezifikation verfügbar, in der die Typen und Eigenschaften erläutert werden, die für jeden Knotentyp festgelegt werden können.
JavaFX bietet auch einige Ergänzungen, die zur Verbesserung von CSS beitragen, z. B. Variablen, die an anderer Stelle definiert und verwendet werden können
.button {
my-custom-color: RGB(234, 44, 78);
}
.my-control {
-fx-background-color: my-custom-color
}
Es bietet auch eine Reihe von Funktionen, mit denen Sie Farben aus anderen zuvor definierten Farben ableiten können. Dies ist nützlich, um beispielsweise Farbverläufe zu erstellen. Dies bedeutet, dass eine Basispalette von Farben definiert werden kann und der Rest aus diesen Werten generiert werden kann (dies ist die Aufgabe der Standard-JavaFX-CSS-Datei).
JavaFX CSS erlaubt Ihnen nicht , die zu definieren Art von Layout von einem Knoten verwendet (als dies alle Layout Bedürfnisse Schreiben in Code ausgeführt werden). Dies funktioniert sehr gut für mich, da dies der einzige Aspekt von CSS war, der mir bei der Verwendung mit HTML wirklich Schmerzen bereitete.
Persönlich bevorzuge ich CSS gegenüber XAML-Stilen, die für meinen Geschmack zu ausführlich sind.
Eine Anleitung zu JavaFX CSS finden Sie hier .
Layout
JavaFX bietet eine Reihe von Layoutfenstern, die denen von WPF ähneln. Ein Unterschied, den ich bemerkt habe, ist, dass der Kennzahl- und Layoutvertrag weiter oben in der Vererbungskette in der Region
Klasse definiert ist.
Wie bereits erwähnt, kann Layout nicht mit CSS ausgeführt werden, sondern kann mit dem Code FXML ausgedrückt oder mit dem Scene Builder erstellt werden (der letztendlich in FXML konvertiert wird).
Kontrollen
JavaFX bietet eine ständig wachsende Bibliothek von Steuerelementen, die wir erwartet haben. Ein wesentlicher Unterschied zwischen JavaFX und WPF besteht darin, dass es sich bei den Steuerelementen im Wesentlichen um Black Boxes handelt und sie nicht wie WPF-Steuerelemente erneut als Vorlagen verwendet werden können. Sie scheinen auch weit weniger Eigenschaften als die WPF-Steuerelemente verfügbar zu machen.
Die Steuerelemente setzen einige der implementierungsspezifischen Regionen CSS aus, sodass bestimmte Bereiche eines Steuerelements von Ihren Stilen erfasst werden können. Dies ist als Unterstruktur der Steuerung bekannt. EG a CheckBox
legt zwei Unterstrukturen frei; Das Kästchen und das Häkchen ermöglichen es, jeden Teil des Steuerelements unabhängig zu gestalten. Beachten Sie, dass wie oben beschrieben nur das Aussehen eines Steuerelements mithilfe von CSS geändert werden kann, das Gefühl jedoch nicht. ZB können Sie die Art und Weise, wie ein TabPane
Inhalt dargestellt wird, nicht dramatisch ändern, indem Sie das interne Layoutfenster so ändern, wie Sie es mit dem WPF können TabControl
.
Während dies ziemlich einschränkend klingt, scheint die bevorzugte Methode zum Erstellen benutzerdefinierter Steuerelemente in JavaFX darin zu bestehen, Kompositionen zu verwenden, die von einem Layoutfenster abgeleitet werden, um Standardsteuerelemente zu positionieren und sie mithilfe von CSS neu zu gestalten.
Fazit
Insgesamt bin ich sehr beeindruckt von dem, was JavaFX im Moment zu bieten hat. Obwohl es nicht annähernd so ausgereift ist wie WPF, wird es aktiv weiterentwickelt, und Oracle scheint dies sicherlich zu unterstützen. Die Zeit wird zeigen, ob es erfolgreich ist oder nicht.
Ich würde empfehlen, JavaFX auszuprobieren. Lesen Sie die Dokumentation und versuchen Sie, eine kleine Anwendung zusammenzustellen, und sehen Sie, was Sie denken.
Sie sollten auch FXExperience.com besuchen, das regelmäßig mit Informationen des Entwicklungsteams aktualisiert wird.