JavaFX ist ein Framework zur Erstellung plattformübergreifender Java-Applikationen. Es ist eine Java-Spezifikation von Oracle und setzt sich zum Ziel, das professionelle Erstellen und Verteilen von interaktiven, multimedialen Inhalten und grafischen Benutzeroberflächen (GUIs) über sämtliche Java-Plattformen hinweg zu erleichtern.
Bis 2014 waren AWT und Swing die Standardlösungen für grafische Anwendungen unter Java. Allerdings waren diese in die Jahre gekommen. So gab es Lücken im Bereich Medien und Animation, was jedoch bei modernen grafischen Oberflächen heutzutage gefragt ist. Anstatt in die Weiterentwicklung von AWT/Swing zu investieren, entschied sich Oracle mit JavaFX für eine komplette Neuentwicklung der GUI-Ebene.
JavaFX setzt insbesondere auf einen Szenengraphen (engl. scene graph), der die einzelnen Bestandteile einer GUI verwaltet. Es ermöglicht mit FXML auch eine deklarative Beschreibung von grafischen Oberflächen auf XML-Basis. Mit dem Scene Builder existiert ein grafisches Tool, das die Erstellung von FXML-Dateien vereinfacht. Darüber hinaus können für die Gestaltung auch Web-Technologien wie CSS eingesetzt werden, indem sie in den FXML-Code eingebettet werden.
Da JavaFX alle APIs für moderne Oberflächen anbietet und auch nicht von AWT/Swing abhängig ist, bildet es einen kompletten Media-Stack. JavaFX greift direkt auf alle 2D-/3D-Fertigkeiten moderner Grafikprozessoren zurück. So kann mit JavaFX auch all das programmiert werden, was bisher vorzugsweise mit Flash realisiert wurde.
Die JavaFX-Laufzeitumgebung war von Version Java SE Runtime 7 Update 6 bis 10 Teil jeder x86 Java SE Installation.
Entwicklungsgeschichte
Die Geschichte von JavaFX ist nicht besonders geradlinig. Ursprünglich wollte Sun / Oracle JavaFX als Flash-Ersatz im Internet positionieren, jedoch war die Kombination aus HTML5 und CSS3 und JavaScript zu attraktiv. Heutzutage ist es vor allem ein GUI-Toolkit für klassische Client-Anwendungen.
Version 1
JavaFX wurde im Mai 2007 angekündigt und im Mai des folgenden Jahres auf der Entwicklerkonferenz JavaOne vorgestellt. Am 4. Dezember 2008 gab Sun JavaFX 1.0 offiziell als Entwickler-Kit für Windows und macOS frei. Das Release JavaFX 1.0 erschien zusammen mit der Programmiersprache JavaFX Script. Diese Sprache machte es einfach möglich, hierarchische Objektgraphen aufzubauen und bot eine gute Syntax für Object-Binding, womit Zustände synchronisiert werden konnten.
Die Version 1.2 wurde im Juni 2009 veröffentlicht. Sie enthielt unter anderem anpassbare UI-Controls, zusätzliche Layout-Klassen (Tile, Stack, Flow, ClipView, Panel), Unterstützung für RSS/Atom-Feeds. Sie ist nicht abwärtskompatibel. Erst seit dieser Version wurden Linux und Solaris unterstützt. Die Version 1.3 (Codename SoMa) wurde am 22. April 2010 veröffentlicht. Die offensichtlichste Neuerung ist eine teils enorme Steigerung der Performance. Neu ist zudem JavaFX TV, eine offizielle CSS-API zur Gestaltung von JavaFX-Controls, einige neue, gewünschte Controls sowie eine Unterstützung von 3D. Die Version 1.3.1 wurde am 21. August 2010 veröffentlicht und verbesserte die Fortschrittsanzeige beim Aufstarten und das Debugging in Netbeans 6.9.1.
Version 2
JavaFX 2.0 erschien wie angekündigt im dritten Quartal 2011. In dieser Version wird auf JavaFX Script verzichtet, „denn Oracle wollte keine weitere Programmiersprache aufbauen, sondern eine pure Java-API, die Entwickler dann von unterschiedlichen existierenden Skriptsprachen ansprechen konnten.“ Deshalb wurden die bestehenden JavaFX Script APIs auf Java portiert. In JavaFX 2.0 wurde außerdem das Hardware-Rendering optimiert, sodass nun Spiele und aufwendige 3D-Darstellungen möglich sein sollen. HTML- und JavaScript-Inhalte rendert JavaFX 2.0 mit Hilfe der WebKit-Bibliothek. Oracle hat im Zuge der Veröffentlichung der neuen Version angekündigt, JavaFX zukünftig als Open-Source-Projekt im Rahmen des OpenJDK weiterzuentwickeln.
JavaFX entwickelte sich nun immer mehr zur Alternative von Swing/AWT. Im August 2012 erschien JavaFX 2.2. Dieses wurde in das JRE/JDK 7 Update 6 integriert. Der Schritt war ungewöhnlich, denn so große Ergänzungen waren bisher als Update im JRE/JDK noch nie gemacht worden.
Die Entwicklung in Richtung Open Source mündete in OpenJFX, wodurch sich zusammen mit dem OpenJDK ein komplett freies Java-System mit GUI-Stack unter der GPL bauen lässt.
Version 8
Mit dem Einzug in den Java-8-Release machte dann auch JavaFX den Release-Sprung von 2 auf nun 8. JavaFX 8 bringt einige Neuerungen mit. So bietet es beispielsweise Lambdas als neues Sprachkonstrukt an. Eine der großen Neuerungen ist auch das JavaFX-UI-Toolkit, das mit Java 8 als empfohlenes UI-Toolkit ausgeliefert wird. Das Toolkit bietet mit FXML u. a. eine XML-basierte Sprache zum Erstellen von Benutzerschnittstellen an.
Mit der Version 8u33 wurde der ARM-Support von Oracle für JavaFX eingestellt. Daher ist JavaFX nicht mehr in den offiziellen Java Distributionen für ARM enthalten.
Roadmap Oracle plant, die Entwicklung weiterhin zu leiten und mit interessierten Dritten zusammenzuarbeiten.
Architektur
Die Architektur von JavaFX ist von Grund auf neu und beruht insbesondere nicht auf Swing beziehungsweise AWT. Das bedeutet allerdings auch, dass man JavaFX und AWT/Swing nicht ohne Weiteres mischen kann (auch wenn es dafür Lösungen gibt). JavaFX bietet ein komplettes API für moderne Oberflächen an. Die wichtigsten Pakete dieser API sind:
Package Beschreibung javafx.animation Klassen für Animationen auf Basis von Übergängen javafx.application Die Klassen für den grundsätzlichen Lebenszyklus einer Applikation javafx.collections Essentielle JavaFX-Collections samt Utilities javafx.event Das Basis-Framework für JavaFX-Events und deren Behandlung javafx.fxml Klassen zum Laden einer Objekthierarchie aus einer Markup-Struktur wie FXML javafx.geometry Klassen für geometrische Operationen auf zweidimensionalen Objekten javafx.scene Die Basisklassen für das JavaFX Scene Graph API und das Elternpaket der einzelnen Komponenten und Elemente. Es enthält Unterpakete wie canvas, chart, control, effect, image, input, layout, media, paint, shape, text, transform, web usw. javafx.stage Top-Level-Container-Klassen für JavaFX-Inhalte javafx.util Verschiedene Utilities und Hilfsklassen
Die folgende Grafik zeigt die Architektur von JavaFX, wie sie von Oracle offiziell dargestellt wird:
600px
Wie bei jeder Java-Applikation befindet sich auch bei JavaFX auf der untersten Ebene die Java Virtual Machine (JVM), die für die Ausführung des Java-Bytecodes verantwortlich ist. Hierbei wird im Normalfall jedes gestartete Java-Programm in seiner eigenen virtuellen Maschine (VM) ausgeführt.
Die entsprechenden Entwicklungstools für Java respektive JavaFX werden im Java SE Development Kit (oder nur Java Development Kit, kurz JDK) bereitgestellt. Darauf aufbauend existieren zahlreiche Erweiterungen, die man teils schon sehr lange bei Java nutzen kann, wie beispielsweise Java 2D zum Zeichnen von zweidimensionalen Formen.
Bei PrismNicht zu verwechseln mit der Geheimdienstsoftware PRISM handelt es sich um die neue Rendering Engine, die Gebrauch von der Grafikhardware macht (falls unterstützt). Unter anderem werden damit auch Eigenschaften von Java 2D und diverse grafische Effekte wie Schatten, Spiegelungen, Transformationen oder Animationen auf einer hohen Ebene verfügbar gemacht. Dabei wird unter Linux und macOS mit OpenGL gerendert, während unter Windows Direct3D zum Einsatz kommt. Wird die Grafikhardware nicht unterstützt, wird ein Software-Fallback auf Java 2D verwendet.
Das Glass Windowing Toolkit stellt Low-Level-Betriebssystemroutinen zur Verfügung, wie Fensterverwaltung, Timer oder Ereignisverwaltung. Es dient als plattformabhängige Schicht, die die JavaFX-Plattform mit dem Betriebssystem verbindet.
Die Media Engine basiert auf GStreamer und bietet umfangreiche Unterstützung für Audio und Video an. Die Web Engine ermöglicht die Einbettung von Web-Inhalten in JavaFX-Applikationen. Dazu gehört das HTML-Rendering auf Basis der WebKit-Engine, das hardwareabhängige Rendern über Prism und die Möglichkeit des DOM-Zugriffs und der Manipulation des DOM.
Das Quantum Toolkit verknüpft Prism, Glass Windowing Toolkit, Media Engine und Web Engine und macht diese einheitlich den JavaFX-APIs zugänglich. Das JavaFX-API und das Quantum Toolkit kapseln die Details der tieferliegenden Ebenen und verbergen diese vor dem Anwender. Ein JavaFX-Entwickler braucht also im Prinzip gar nicht zu wissen, wie die tieferliegenden Ebenen funktionieren.
Aufbau einer JavaFX-Anwendung JavaFX-Lebenszyklus mini|hochkant=0.6|Lebenszyklus einer JavaFX-Anwendung JavaFX-Anwendungen erweitern die Basisklasse Application, die Lebenszyklus-Methoden wie init(), start() oder stop() vererbt. Diese Methoden können (oder müssen) in der JavaFX-Anwendung überschrieben werden. Der JavaFX-Launcher kümmert sich darum, dass diese entsprechend aufgerufen werden. JavaFX-Anwendungen benötigen also keine main-Methode: Die eigene statische main(String[])-Methode leitet an die statische launch(String[])-Methode der Application-Klasse weiter und übergibt ihr alle Aufrufparameter.Die main()-Methode ist bei einer JavaFX-Applikation im Grunde nicht notwendig, während sie bei einer normalen Java-Applikation ja den zentralen Einstiegspunkt darstellt. Sie wird von NetBeans nur zur Sicherheit generiert, um im Fall mangelnder JavaFX-Unterstützung auf Zielplattformen den Start der Applikation zu gewährleisten. Netbeans selbst ignoriert die main()-Methode. Siehe: Da die Klassenmethode launch(...) weiß, in welcher Klasse sie aufgerufen wurde, erzeugt sie ein Exemplar dieser Klasse und ruft dann die Lebenszyklusmethoden auf.
Der Lebenszyklus einer JavaFX-Anwendung sieht folgendermaßen aus:
Beim Start der Anwendung konstruiert die JavaFX-Runtime zunächst eine Instanz der Application-Klasse. Nun wird die init()-Methode der erzeugten Instanz ausgeführt. Diese Methode wird als default leer implementiert und muss nicht zwingend überschrieben werden. Es können hier beispielsweise die Aufrufparameter ausgelesen werden. Es dürfen hier jedoch noch keine UI-Elemente erzeugt werden.Der Grund dafür ist, dass die init-Methode – genau wie der Konstruktor der Klasse – noch vom Launcher-Thread der Anwendung aufgerufen wird. UI-Elemente dürfen aber nur im JavaFX-Application-Thread erzeugt und modifiziert werden. Siehe: Als Nächstes wird die Methode start(javafx.stage.Stage) aufgerufen, die von jeder JavaFX-Anwendung überschrieben werden muss. JavaFX übergibt der Methode eine Stage (deutsch „Bühne“), was etwa der Aufgabe eines Haupt-Containers entspricht und am ehesten mit dem Startfenster verglichen werden kann. Die JavaFX-Runtime wartet nun, bis die Anwendung beendet wird. Dies ist folgendermaßen möglich: durch Aufruf der Methode Platform.exit() indem das letzte Fenster geschlossen wird und das Attribut implicitExit auf Platform auf true gesetzt ist. Nun ruft die Runtime die stop()-Methode auf, bevor der Java-Prozess gestoppt wird. Diese Methode muss wiederum nicht zwingend überschrieben werden.
Die Stage (Bühne) mini|hochkant=1.5|Die Stage bildet den Rahmen für den eigentlichen Inhalt. Die Klasse Scene verwaltet den Szenengraph. Dieser ist ein gewurzelter Baum, der aus Nodes besteht. Parent-Nodes enthalten weitere Nodes, die Blätter-Nodes stellen dagegen die sichtbaren Elemente der GUI dar (Button, Textfeld, Slider usw.).
Der start(...)-Methode wird eine Stage übergeben. Der Parameter der start(...)-Methode ist also vom Typ javafx.stage.Stage. Diese Klasse ist der Top-Level-JavaFX-Container, der immer von der Plattform konstruiert wird – als Parameter der start(...)-Methode. Dies kann am ehesten mit dem Startfenster verglichen werden. Zusätzlich können in einer Applikation weitere Stage-Objekte erstellt werden.