Ein erstes “Hello World” von JavaFX mit Maven

https://oer-informatik.de/jfx_02_helloworld_und_aufbau

tl/dr; (ca. 4 min Lesezeit): “Hello World” mit Java FX und Analyse der beteiligten Klassen, Objekte und Methoden. Artikel ist Teil eines JavaFX-Tutorials.

Änderungen am Programmcode…

In dem Beispielprogramm, das VSCode/Maven anlegt, sind schon einige Komponenten mehr enthalten, als wir am Anfang benötigen. Wir trennen uns von den Dateien, die wir nicht mehr benötigen:

  • Im Projekt liegen unter \src\main\resources\de\csbme\ifaxx die Dateien primary.fxml und secondary.fxml - die können gelöscht werden.

  • Ebenso die beiden Klassen PrimaryController.java und SecondaryController.java unter src\main\java\de\csbme\ifaxx

Anpassungen in der Datei App.java

In der pom.xml wurde ja bei der Konfiguration hinterlegt, wie die Klasse heißt, die unser Artefakt (in diesem Fall: unsere Desktop-App) startet.

Maven sucht nach einer public static void main(String[] args)-Methode. Für das Grundgerüst benötigen wir also diese statische Methode, sowie eine zweite Methode start(), die später unser eigentliches Programm aufnimmt:

Mit diesem Grundgerüst kommen wir schon recht weit. Da Java Modular ist, und nur relativ wenig Bibliotheken direkt im Sprachumfang von Java enthalten sind, müssen wir in der Datei module-info.java zunächst für unsere App festlegen, welche Module benötigt werden (zwei JavaFX Module) und was von Außen genutzt werden darf (unser komplettes Modul):

Jetzt können wir die Platzhalter in der App.java füllen. Die Methode start() ist das Herzstück unseres ersten eigenen JavaFX-Programms. Hieran können wir die Grundlagen eins jeden JavaFX-Programms erkennen:

Die Stage erhalten wir als Parameter übergeben, von wem genau schauen wir uns später an. Die Stage ist der Ort, an dem alles angezeigt wird - unsere Bühne eben. Wir schleichen uns von der letzten Zeile der Methode (primaryStage.show();) nach oben. Die Dinge, die wir auf der Bühne anzeigen nennen wir Scene - also Szenen (primaryStage.setScene(scene);). In unserem Beispiel ist die Scene 300x200 Pixel groß und zeigt etwas an, das hier rootNode genannt wurde (new Scene(rootNode, 300, 250);). Ein Node ist ein Inhaltselement, das weitere Inhaltselemente enthalten kann (z.B. eine Tabelle, ein Gitter, ein Stapel). In unserem Fall enthält der Stapel (StackPane) nur ein Element, nämlich einen Text (new StackPane(textLeaf);). Diesen Text haben wir in der ersten Zeile der Methode erstellt (Text textLeaf = new Text("Hallo");).

Was jetzt noch fehlt, um ein lauffähiges Programm zu erhalten, sind die fehlenden Importe. Wenn es die IDE nicht alleine schafft, die korrekten Klassen zu finden, dann hilft vielleicht dieser Spickzettel zum vergleichen:

Wer ruft hier eigentlich wen auf?

Es scheinen bei JavaFX wieder von Zauberhand Dinge zu passieren, die schwer nachvollziehbar sind: In der main()-Methode wird eine launch()-Methode aufgerufen, die nirgends implementiert ist. Stattdessen gibt es eine start()-Methode, die wiederum nirgends aufgerufen wird. Wir müssen hier kurz Licht ins Dunkel bringen, in dem wir uns mal ein UML-Klassendiagramm anschauen:

UML-Klassendiagramm der JavaFX-Klassen App, Application, LauncherImpl
UML-Klassendiagramm der JavaFX-Klassen App, Application, LauncherImpl

Das erste Geheimnis ist schnell gelüftet: die mysteriöse Methode launch(), die in der main()-Methode aufgerufen wird, ist eine statische Methode der Superklasse. Aber an welcher Stelle wird eine Instanz von App gebildet, um die Instanzmethode start() aufrufen zu können, die wir oben implementiert haben?

Dazu werfen wir ein Blick in ein UML-Sequenzdiagramm, das die Abläufe im Hintergrund etwas erklärt:

UML-Klassendiagramm der JavaFX-Klassen App, Application, LauncherImpl
UML-Klassendiagramm der JavaFX-Klassen App, Application, LauncherImpl

Der Dreh- und Angelpunkt ist die launchApplication()-Methode einer Klasse, die LauncherImpl heißt. Diese Methode erzeugt die Stage, auf der später alles angezeigt wird, instanziiert die Klasse App (hier allgemein StartApp genannt) und ruft schlussendlich die start()-Methode auf, die dann wiederum die Stage selbst anzeigt (show()).

Wer noch etwas mehr über die Hintergründe und Realisierungen erfahren will, der kann sich den Quelltext der Superklasse Application sowie der Klasse LauncherImpl ansehen.

Ausführen des JavaFX-Projekts

Nächste Schritte

Dieser Artikel ist ein Teil der Artikelserie zu einer Energiemonitors mit JavaFX.

Ein leeres Projekt ist kein schönes Projekt. Wir brauchen Struktur und dazu den Scenegraph.

Quellen und offene Ressourcen (OER)

Die Ursprungstexte (als Markdown), Grafiken und zugrunde liegende Diagrammquelltexte finden sich in weiterbearbeitbarer Form im gitlab-Repository unter https://gitlab.com/oer-informatik/java-fx/ersteschritte und sind zur Nutzung als Open Education Resource (OER) freigegeben gemäß der Creative Commons Namensnennung 4.0 International Lizenz (CC BY 4.0). Creative Commons Lizenzvertrag

Kommentare gerne per Mastodon, Verbesserungsvorschläge per gitlab issue (siehe oben). Beitrag teilen: