Java Lohnt sich JavaFX?

S

Sasku

Gast
Hey zusammen,

ich beherrsche was die GUI Programmierung betrifft inzwischen schon so einiges was Swing betrifft. Jetzt habe ich allerdings etwas über JavaFX gelesen und bin interessiert. Kann man mir da mal n bisschen mehr erzählen, was für Vor-/Nachteile hat es, was kann man mehr Anzeigen lassen oder was weis ich.

Danke!
 
Ist wie so oft: Schau dir an was dir besser gefällt.

Ansonsten ist es nicht schlecht, gerade wenn du noch lernst, sich JavaFX genauer anzuschauen, da es sich auf lange Frist durchsetzen könnte. Gerade wenn man Webdesign in Betracht zieht sind die parallelen deutlich erkennbar.

Such dir ein ganz kleines Projekt, implementier es mit sowohl dem einen als auch dem anderen und Vergleiche die Ergebnisse. Danach weißt du was die besser gefällt. Beides solltest du so oder irgendwann mal ausprobiert haben!
 
sdwaroc schrieb:
Ist wie so oft: Schau dir an was dir besser gefällt.

Ansonsten ist es nicht schlecht, gerade wenn du noch lernst, sich JavaFX genauer anzuschauen, da es sich auf lange Frist durchsetzen könnte. Gerade wenn man Webdesign in Betracht zieht sind die parallelen deutlich erkennbar.

Such dir ein ganz kleines Projekt, implementier es mit sowohl dem einen als auch dem anderen und Vergleiche die Ergebnisse. Danach weißt du was die besser gefällt. Beides solltest du so oder irgendwann mal ausprobiert haben!

Danke dir!
Naja mit Webdesign habe ich beim besten willen nichts am Hut, reine Desktopprogrammprogrammierung. Aber gut dann werde ich das mal so machen. Dennoch welche Vorteile, z. B. performance, elemente die man in Swing nicht darstellen kann oder so, bringt FX noch mit?
 
Noch können beide das gleiche, im Zweifel und mit großem Wissen kann Swing sogar evtl. noch mehr. Der Trend geht aber zu JavaFX. Am Anfang wirst du bei beiden nicht an die Grenzen gelangen. Dann gibt es da natürlich SWT...
 
JavaFX ist deutlich einfacher zu schreiben. Allein FXML ist ein Segen! Dazu dann noch das geniale einfache Property Binding.

Performance Vorteile gibt es angeblich auch noch. Wenn du z.B. eine Liste in JavaFX Darstellst, werden auch nur die Elemente gerendert, die auch wirklich sichtbar sind. In Swing war das meines Wissens nach nicht so bzw. man musste sich selbst drum kümmern. Natürlich haben diese Automatismen auch Performance-Nachteile, weil insgesamt mehr Berechnungen anfallen, auch wenn man diese Features gar nicht benötigt.

Allerdings sind alle aktuellen PCs, Notebooks und Tablets schnell genug, dass man das getrost ignorieren kann. Als Belohnung erhält man kürzeren und wesentlich besser lesbaren und wartbaren Code. Wenn Performance wirklich so wichtig ist, solltest du deine GUI Applikationen lieber mit Qt schreiben, da kannst du mit der Power von C++ und nativem Code alles rausholen und diverse Funktionen auch in reinem Assembler schreiben ;) Danach ist der Code natürlich 10x so lang und 100x schwerer zu lesen, aber hier und da sicherlich auch mal 20-50% schneller.

Darstellbar ist sowohl in Swing als auch in JavaFX alles was man sich vorstellen kann. Alles was es nicht gibt, kann man sich zusammenbauen oder als letzte Option in Form von Pixelhaufen auf einem Canvas erstellen.

Was JavaFX zusätzlich noch kann, ist die Darstellung von 3D Elementen inkl. Kamera Positionierung und es ist vollständig kompatibel zu Touchscreens.
 
Für Hobby/privat-Programmierer ist allein der Scene-Builder ein Segen. Das nervigste war in Swing, in meinen Augen, die Platzierung der Elemente in einem Layoutmanager. Auch wenn der Layoutmanager eine sinnvolle Lösung war, zu seiner Zeit aber.
 
Javafx ist einfacher zu bedienen, ich kann schneller als mit Swing arbeiten. Für mich als ordnungsliebenden Menschen ist auch der code ansehnlicher & man kann den code wesentlich besser warten, da er einfach Einfacher ist!
 
Ich hab vor einer Weile eine Applikation mit JavaFX geschrieben und im Zuge dessen es analysiert. Dazu entwickelte ich eine Grundbibliothek die Spring mit JavaFX verheiratet plus etwas Komponenten Entwicklung. Mit JavaFX kann man deutlich besser wartbaren Code schreiben, als mit Swing. Das ist eben durch FXML nicht zu leugnen, allerdings hat JavaFX, so wie alles im Leben einige Tradeoffs. Eins vorweg ich bin kein Swing guru.

  • Der Scenebuilder funktioniert mehr oder weniger gar nicht mit eigenen Komponenten
  • Ich hab schmerzvoll erfahren müssen, dass man nichts aus dem com.sun.javafx package verwenden darf, da sich deren API zwischen Java 8 updates verändert. (Zwischen Java Version wäre erwartet gewesen)
  • Wenige wirklich brauchbare Komponenten. Zum Beispiel gibt es einen DatePicker, aber keine DateTimePicker. Man findet zwar 2-3 Komponenten Bibliotheken. Die werden aber in meinen Augen kaum maintained.
  • Node discovery im erzeugten UI Komponenten Baum funktioniert out of the box nicht immer (z.B.: Du bist im Controller und hättest gerne dynamischen Zugriff auf irgend einen Button.
  • Das default property binding beherrscht nicht den Zugriff auf sub objecten. z.B.: Ein Formular, dass Daten ausfüllt die in verschachtelte Objecte geladen werden sollen.
  • CSS Styling nicht vollständig anwendbar. Vor allem die Tabellen Komponenten hat da einige Überraschungen
  • Icon und Style sheets werden nicht automatisch auch für Dialoge angewendet, daher ist es notwendig, diese nochmals zu setzen für jeden Dialog.
  • Validierung von Inputfeldern ist nicht in JavaFX eingebaut, ich hab es für meine Applikation nicht gebraucht. Aber einen Prototyp schrieben um diese Limitierung von JavaFX testweise generisch zu ergänzen. Es ist möglich, aber man muss es eben selbst machen.

Die Liste mag jetzt vielleicht etwas abschrecken (und ist nicht vollständig). Ich würde trotzdem JavaFX verwenden. Die eigens entwickelte Spring integration Bibliothek, hat für mich die meisten dieser Probleme auf generischer Ebene gelöst. Schreiben lässt sich diese Bibliothek aber nicht in ein paar min. Wenn jemand an mögliche Ansätzen für die Umsetzung interessiert ist, stehe ich gerne per PM zur Verfügung. Die Bibliothek selbst, kann ich aus rechtlichen gründen nicht raus geben.
 
benneque schrieb:
JavaFX ist deutlich einfacher zu schreiben. Allein FXML ist ein Segen!
Lustig ist ja, dass Mozilla (besser gesagt: mit Gecko) seit 15 Jahren GUIs mit XML (XUL) beschreiben kann und die (naja: einige) Java-Leute feiern das als die beste Erfindung seit geschnitten Brot. :-)

Ich persönlich bin ja davon (also GUI via XML zu deklarieren) nicht so sehr überzeugt. Weil man verlässt ja seine eigentliche Programmiersprache und das nur wegen dem GUI-Teil. Man kann natürlich einfach sagen, dass man XML in der heutigen Zeit ohnehin beherrschen sollte. Aber das allein kann ja kein Grund sein.

Wenn das wenigstens irgendwelche Vorteile hätte wie z.B. kürzeren Code. Ok. Bei Java könnte das sogar der Fall sein, obwohl XML ansich schon ziemlich "verbose" ist. :-)

benneque schrieb:
Allerdings sind alle aktuellen PCs, Notebooks und Tablets schnell genug, dass man das getrost ignorieren kann. Als Belohnung erhält man kürzeren und wesentlich besser lesbaren und wartbaren Code. Wenn Performance wirklich so wichtig ist, solltest du deine GUI Applikationen lieber mit Qt schreiben, da kannst du mit der Power von C++ und nativem Code alles rausholen und diverse Funktionen auch in reinem Assembler schreiben ;) Danach ist der Code natürlich 10x so lang und 100x schwerer zu lesen, aber hier und da sicherlich auch mal 20-50% schneller.
Als Java-Programmierer sollte man sich lieber nicht zu weit aus dem Fenster lehnen was den Umfang des Codes angeht. Da hat Java ne ziemlich miese Quote. Man braucht nur mal zum Vergleich die diversen Skriptsprachen a-la Ruby, Python und Co ranziehen.

Außerdem sollte ne reine GUI geschwindigkeitstechnisch heutzutage überhaupt kein Problem mehr sein. Da ist es egal was Du nimmst. Das Problem sind die Prozesse dahinter. Da kann es durchaus schon mal geschwindigkeitskritisch werden. Und da kann es dann auch mal sinnvoll sein einzelne Routinen nach C oder von mir aus auch C++ zu verlagern.

Die GUI von C++ Programmen fühlt sich vermutlich deshalb häufig so flüssig an, weil man hier eher mal die nativen Widgets des Betriebssystems verwendet. So in der Art wie es AWT (oder auch SWT) unter Java macht.
Aber selbst das muss nicht immer so sein. IDEA beweist ja, dass man flüssige GUIs selbst mit Swing hinkriegt.

Was die Geschwindigkeit im allgemeinen angeht, nicht immer ist deshalb C oder C++ vonnöten. Im High-Performance-Bereich wird sogar noch gerne das uralte Fortran vorgezogen.
Oder, wenns mal etwas moderner sein soll: Ocaml
Gibt natürlich noch weitere Alternativen.

Noch ein Wort zu Assembler: Es ist heutzutage schwierig geworden Assembler zu schreiben welches flotter ist als das was bei einem native-code-Compiler hinten raus fällt. Die modernen CPUs sind sehr komplex. Du musst also nicht nur zusehen, dass Du Deine Idee gut in Assembler umsetzt. Du solltest auch noch gucken, dass Du die Execution-Pipelines richtig auslastest, auf den Cache achtest usw. In den modernen Compilern steckt echt viel Wissen drin.

Das ist nicht mehr so wie vor 30 Jahren wo man sich so ein paar Wochen in Assembler reinfuchst und dann eben bestimmte Routinen einfach mal umschreibt und Du dann nen sichtbaren Geschwindigkeitsgewinn hast.
Das lohnt vielleicht bei trivialeren Chips. Aber selbst hier setzt man auf C bzw. zunehmend auch C++.

Gruß
Andy
 
@andy_m4: Der C(++)/ASM Part für GUI Entwicklung war nicht so ganz ernst gemeint ;)

Bzgl. XML für die GUI, gibt es noch ein viel älteres Beispiel als XUL: HTML! Ich gehe mal davon aus, dass Mozilla weg von XUL will, weil spätestens seit HTML5 auch damit alles möglich ist und die Welt nicht noch eine weitere XML-Basierte Markup-Language braucht, die dann vom Browser interpretiert wird.

Wir haben damals schon für Swing unseren eigenen HTML Interpreter geschrieben, um die GUIs zu gestalten. Weil das 100x flüssiger von der Hand geht als 30 Methodenaufrufe, um ein Label einzufügen mit entsprechender Positionierung und optischer Gestaltung. Danach kamen wir dann zu GWT, das auch auf einen XML Dialekt setzt.

Dabei geht es ja auch ausschließlich um die Gestaltung von Oberflächen und nicht um deren Funktionalität. Da kannst du dir JavaFXs FXML, Qts QML, Mozillas XUL, GWTs UiBinder oder natürlich auch HTML anschauen: Überall wird eine eigene Sprache für die Definition der GUI benutzt, weil es wesentlich einfacher ist, maschinenlesbar (für diverse grafische GUI Editoren) und auch für Designer (die keine Ahnung von Programmierung haben) beherrschbar. Dank solcher Technologien kann man die Arbeit extrem gut aufteilen, ohne dass Nachteile für irgendwen entstehen.

Und JavaFX GUIs empfinde ich auf halbwegs aktuellen System als extrem flott. FullHD Applikationen auf einem Tablet mit hunderten sichtbaren Elementen, Drag & Drop, Animationen, etc. pp. Keine Ruckler, keine Verzögerungen und von der Darstellungsgeschwindigkeit auf einem Level mit dem Home-Screen eines frisch aufgesetzten iPhone 6.
Natürlich frisst es mehr CPU und RAM, aber wenn die Ressourcen vorhanden sind, kann man sie ja ruhig nutzen ;)
 
Hallo,

benneque schrieb:
@andy_m4: Der C(++)/ASM Part für GUI Entwicklung war nicht so ganz ernst gemeint ;)
Ok. Lass ich man grade so gelten. :-)

benneque schrieb:
Bzgl. XML für die GUI, gibt es noch ein viel älteres Beispiel als XUL: HTML!
Das sehe ich anders. HTML ist bzw. war ja überhaupt nicht für die GUI-Gestaltung gedacht. HTML ist ja in erster Linie eine Auszeichnungssprache auf sematischer Ebene.

<h1> heißt ja beispielsweise nicht, dass der Text darin besonders groß dargestellt werden soll. Sondern ist eine Überschrift erster Ebene. Oder auch <strong> bedeutet ja nicht Text fettdrucken. Sondern betonen.
Wie das dann vom Browser umgesetzt wird, ist dann den seine Entscheidung. Ich weiß noch bei den ganz alten Netscape-Versionen konnte man das teilweise sogar einstellen, so dass der Nutzer dafür sorgen kann das die HTML-Seiten so angezeigt werden, wie er es für richtig oder angenehm empfindet (Ok, dass geht auch jetzt noch via User-CSS; bei Firefox & Co im Profilordner gibts nen Ordner chrome wo man die reinpacken kann; ich nutz das sogar noch bei einigen Websites :) ).

Weil aber die Webseitenersteller mehr EInfluss auf die Darstellung haben wollten, kam ja dann erst soch Tags wie <font> usw. die inzwischen alle wieder rausgeflogen sind, weils dafür jetzt StyleSheets (CSS) gibt.
Einzig bei den Formular-Elementen könnte man drüber streiten ob man das als GUI-Elemente zählen kann.


benneque schrieb:
Ich gehe mal davon aus, dass Mozilla weg von XUL will, weil spätestens seit HTML5 auch damit alles möglich ist und die Welt nicht noch eine weitere XML-Basierte Markup-Language braucht, die dann vom Browser interpretiert wird.
Du zielst sicher auf https://mail.mozilla.org/pipermail/firefox-dev/2015-July/003063.html ab.
Klingt sinnvoll. Zumal ja gecko langfristig ohnehin durch die neue Engine servo abgelöst werden soll. In dem Zuge könnte man dann gleich ein Schnitt machen. Ich gehe davon aus, dass servo ohne XUL kommt.

benneque schrieb:
Wir haben damals schon für Swing unseren eigenen HTML Interpreter geschrieben, um die GUIs zu gestalten. Weil das 100x flüssiger von der Hand geht als 30 Methodenaufrufe, um ein Label einzufügen mit entsprechender Positionierung und optischer Gestaltung.
Ja. Gute Idee.
Ich war ja damals schon ganz froh, dass Sun Swing ne HTML-Komponente spendierte. Inzwischen kann man ja irgendwie alle Swing-Widgets über HTML/CSS formatieren. Nu bin ich aber schon raus aus der aktiven Java-Entwicklung. :-)


benneque schrieb:
Danach kamen wir dann zu GWT, das auch auf einen XML Dialekt setzt.
Ich fand ja an GWT ganz interessant, dass man für den server-seitigen Teil und dem Client-Teil nur eine Sprache braucht (also in dem Fall Java).
XML für GUI-Gestaltung find ich aber weiterhin ähm suboptimal. Wie gesagt. Ich will kein Sprach-Hopping.

benneque schrieb:
Dabei geht es ja auch ausschließlich um die Gestaltung von Oberflächen und nicht um deren Funktionalität.
Schon klar.

benneque schrieb:
Da kannst du dir JavaFXs FXML, Qts QML, Mozillas XUL, GWTs UiBinder oder natürlich auch HTML anschauen: Überall wird eine eigene Sprache für die Definition der GUI benutzt, weil es wesentlich einfacher ist, maschinenlesbar (für diverse grafische GUI Editoren)
Also das wäre ja wenigstens noch cool, wenn es einen sprachübergreifenden Standard gäbe. Wenn man z.B. sein FXML auch 1:1 übernehmen könnte für die Qt-Entwicklung.
Obwohl das vielleicht sogar via XSLT möglich wäre. Keine Ahnung. Vielleicht gibt es ja dazu Projekte.

Was die GUI-Editoren angeht das geht ja auch so. Nicht-XML-Quelltext ist ebenso maschinenlesbar. Also muss er ja auch schon per Definition. :-)


benneque schrieb:
und auch für Designer (die keine Ahnung von Programmierung haben) beherrschbar.
Das ist vielleicht der einzige Punkt den man gelten lassen könnte. Wobei es mir auch merkwürdig vorkommt, dass ein Designer bei Java-Quelltext wie ein Schwein ins Uhrwerk guckt aber bei sowas wie
Code:
<GridPane alignment="CENTER" hgap="10.0" vgap="10.0"
    xmlns:fx="http://javafx.com/fxml"
    fx:controller="fxmltableview.FXMLTableViewController">
    <padding>
        <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
    </padding> 
</GridPane>
ist ihm alles sonnenklar. :-)

Der wird vermutlich ohnehin Tools a-la SceneBuilder einsetzen und kommt so auch mit dem XML praktisch nicht in Berührung.

benneque schrieb:
Dank solcher Technologien kann man die Arbeit extrem gut aufteilen, ohne dass Nachteile für irgendwen entstehen.
Naja. Die XML-Syntax ist schon etwas ausufernd. Da finde ich S-Expressions schon etwas angenehmer. Beispiel HTML:
Code:
<html>
<head>
  <title>Meine tolle Seite</title>
</head>
<body>
Ist noch im Aufbau ...
</body>
</html>

als S-Expression:
Code:
(html
  (head
    (title "Meine tolle Seite"))
  (body "Ist noch im Aufbau ..."))

Für mich als Lisp-Entwickler kommt neben der Kürze natürlich noch hinzu, dass ich meine eigentliche Sprache nicht verlassen muss. Ich brauch auch keine extra Parsing-Bibliothek und dann auf die Elemente ganz natürlich zugreifen wie ich auch mit den anderen nativen Datenstrukturen in Lisp umgehe.

Aber auch in der sonstigen Welt stößt ja XML nicht auf ungeteilte Gegenliebe. Beim Datenaustausch (wofür ja XML u.a. mal geschaffen wurde) kommt ja gerne mal JSON statt XML zum Einsatz.

Ok. Vielleicht bin ich etwas XML-Verdrossen. :-)
Ich mein, ich hab damit Ende der 90er Jahre angefangen. Mit Apache Cocoon (das Projekt gibts ja heute noch), wo man seine Daten ja in XML schreibt und Cocoon dann je nach Ausgabegerät mit einem passenden XSL dann in HTML, PDF, WML gewandelt hat. Fand ich schon cool.

Dann aber breitete sich XML immer mehr aus. In (schmerzhafter) Erinnerung ist mir noch Tomcat, wo ich als erstes wahrgenommen hab, dass dann plötzlich auch alle Konfigurationsdateien mit XML geschrieben wurden. Und mit jeder Version wurde es schlimmer. Dann kam irgendwie noch Ant hinzu. Irgendwie artete das dann in Konfigurationsorgien aus, wenn man irgendwie was aufgesetzt hat. Da hat XML ja nicht direkt was mit zu tun. Aber irgendwie pocht heute da noch was im Kopf, wenn ich das Wort XML höre oder sehe. :-)
Jedenfalls seitdem hat sich bei mir ne ziemliche Ernüchterung eingestellt was XML angeht.


benneque schrieb:
Und JavaFX GUIs empfinde ich auf halbwegs aktuellen System als extrem flott. FullHD Applikationen auf einem Tablet mit hunderten sichtbaren Elementen, Drag & Drop, Animationen, etc. pp. Keine Ruckler, keine Verzögerungen und von der Darstellungsgeschwindigkeit auf einem Level mit dem Home-Screen eines frisch aufgesetzten iPhone 6.
Heute wird ja ohnehin bei solchen Sachen wenn möglich auf GPU-Unterstützung gesetzt. Von daher sollte GUI heute generell kein Problem mehr sein.


benneque schrieb:
Natürlich frisst es mehr CPU und RAM, aber wenn die Ressourcen vorhanden sind, kann man sie ja ruhig nutzen ;)
Jetzt weiß ich auch, warum die Smartphone-User nur am aufladen sind, während mein altes Nokia problemlos 3 Wochen durchläuft. :-)

Gruß
Andy
 
@Sasku: JavaFX lohnt. Das Problem ist nur, dass das an manchen Stellen noch nicht fertig ist. Das Databinding ist aber relativ elegant gelöst, und insgesamt bekommt man eine performante UI.

Aber: Swing lohnt auch. Das konsequent umgesetzte MVC Pattern gibt dir Freiheiten, die dir sonst kaum eine UI Bibliothek bietet - vom Kontrollelement bis hinunter zum Zeichnen der einzelnen Pixel. Das Problem mit Swing, bzw. der Grund warum das als langsam abgestempelt wird, sind die Programmierer. Performante Swing UIs gibt es - man muss sie nur programmieren können. Und das können nur wenige der Leute, die glauben Java und insbesondere Swing programmieren zu können.
Heutzutage sieht man immernoch so was wie:
Code:
component.setLayoutManager(null)
. Dummerweise machen das noch viele Leute ohne nachzudenken, was das eigentlich bedeutet. Zum Schluss heißt es nur: der Layoutmanager (ja welcher denn?) ist scheiße. Klar.

Was du abschreiben kannst sind Nischentechnologien wie SWT und Konsorten. Die haben sich aus gutem Grund nicht durchgesetzt - außer in den Projekten, aus denen sie stammen. Ebenso macht direktes AWT programmieren keinen Sinn, weil es Bibliotheken gibt, die das besser machen als der Großteil aller Programmierer (Swing).

Aus meiner Sicht macht Java FX bei neuen Projekten Sinn, Teile der Standardbibliothek neben den UI Elementen sind auch recht interessant, die Charting API beispielsweise. Es gibt aber ebenso gute Gründe, mit Swing zu arbeiten, zb. wenn die weitreichenden Möglichkeiten zur Anpassung wichtig sind.
 
Zuletzt bearbeitet:
Zurück
Oben