Wie vergleicht sich JavaFX mit WPF? [geschlossen]

93

Ich bin größtenteils ein C # -Programmierer. Ich habe vor ungefähr 10 Jahren aufgehört, Java zu schreiben, aber ich versuche, mit der Technologie in Java Schritt zu halten, indem ich Artikel lese, mit Freunden spreche usw.

Ich habe von dem neuen umfangreichen GUI-Framework namens JavaFX gehört, konnte jedoch keine Ressource finden, die es mit Nicht-Java-Parallelen vergleicht.

Da ich mit C # und WPF sehr vertraut bin, möchte ich ein Gefühl dafür bekommen, wie ähnlich oder unterschiedlich die beiden Technologien sind.

EDIT: Da es keine Antworten gibt, werde ich versuchen, genauer zu sein:

  1. WPF verwendet XAML, um den visuellen Baum zu erstellen. Hat JavaFX etwas Ähnliches?
  2. WPF wird am besten für die Bindung an ein Ansichtsmodell in einem MVVM-Muster verwendet. Verwendet JavaFX auch die Bindung in großem Umfang?
  3. WPF verwendet die GPU zum Rendern. Tut JavaFX dasselbe?
  4. Wie vergleicht sich Silverlight mit JavaFX, wenn es über einen Browser auf einem Netz-PC ausgeführt wird?

... Da kommt noch mehr...

Ich ändere dies in ein Community-Wiki, damit die Vergleiche (hoffentlich) ständig aktualisiert werden.

Aviad P.
quelle
7
Komisch, dass eine Frage mit 83 positiven Stimmen als nicht konstruktiv angesehen werden kann.
Kristianp

Antworten:

120

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 RegionKlasse 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 CheckBoxlegt 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 TabPaneInhalt 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.

Benjamin
quelle
9
Vielen Dank dafür, das ist sehr lehrreich. Wenn Sie diese Antwort weiter verbessern könnten, während Sie Ihre JavaFX-Kenntnisse weiter vertiefen, wäre dies fantastisch.
Aviad P.
5
Ich habe auch gerne Ihre Antwort gelesen und würde gerne mehr hören, wenn Ihre Arbeit mit JavaFX weitere Erkenntnisse liefert.
Paul-Sebastian Manole
21

Ich denke, der beste Weg, um ein Gefühl für JavaFX zu bekommen, besteht darin, es einfach auszuprobieren. Es gibt einige gute Tutorials auf der JavaFX-Website. Hier ist ein paar:

Sie sind ziemlich schnell und geben Ihnen ein gutes Gefühl für die Sprache. Es gibt viele andere auf der JavaFX- Site, wenn Sie an weiteren Tutorials und Artikeln interessiert sind.

Für spezifische Antworten auf Ihre Fragen:

  1. JavaFX verfügt über eine eigene deklarative Sprache zum Erstellen des "visuellen Baums", der kein XML-Derivat ist. Die Benutzeroberfläche basiert auf einem Szenendiagramm, sodass Sie verschiedene Effekte und Animationen auf jeden Knoten im Diagramm anwenden können. Weitere Informationen finden Sie in den Tutorials. Es gibt auch ein Designer-Tool für JavaFX (das ich noch nicht ausprobiert habe).
  2. In JavaFX ist eine Bindung in die Sprache integriert .
  3. JavaFX auf dem Desktop verwendet Java AWT / Swing, das GPU-Rendering verwendet. Jede Java-Version scheint mehr Grafiken auf die GPU zu verlagern. Chris Campbell von Sun hat einige über die GPU-Beschleunigung gebloggt . Ich bin nicht sicher, ob die mobile Version von JavaFX eine GPU-Beschleunigung hat. Ich habe festgestellt, dass frühere Versionen von JavaFX nicht leistungsfähig genug für das waren, was ich brauchte, aber ich weiß, dass die neueste Version erhebliche Leistungsverbesserungen gegenüber früheren Versionen aufweist und immer noch daran arbeitet, sie schneller zu machen.
  4. JavaFx verwendet Java-Applets, um im Browser ausgeführt zu werden. Ab Java 6 Update 10 wurde das Java-Applet-Framework überarbeitet und obwohl es nicht so nahtlos wie Adobe Flash ist, wurde es erheblich verbessert. Ich bin mir nicht sicher, wie es mit Silverlight verglichen wird, außer dass ich Probleme hatte, Silverlight unter Linux zum Laufen zu bringen, aber JavaFX unter Linux zum Laufen gebracht habe.

Hier ist eine weitere verwandte Frage .

Jay Askren
quelle
15
Diese Antwort ist veraltet, da JavaFX in Java 7 erhebliche Aktualisierungen durchlaufen hat. Siehe hier .
Zoltán
7
Sind Sie sicher, dass JavaFX Swing und AWT verwendet? Ich glaube, es hat eine eigene Rendering-Engine namens Prisma. Beim Ausführen einer JavaFX-App wird kein Event Dispatch-Thread erstellt.
Andy Till