Oracle-Tutorial : Hello World, JavaFX Style - ich will nicht !

Mahlzeit,

mein Post bezieht sich auf folgendes Tutorial : 3 Hello World, JavaFX Style (Release 8)

Immer wieder kommt : Swing ist out-of-date und man sollte bei Neuentwicklungen nur noch JavaFX nutzen … aber wenn ich mir so das Hello World ansehe wird mir leider mehr als nur schlecht und ich muss mal so einige Prinzipien hinterfragen. Vielleicht kann mir ja jemand den erleuchtenen Hinweis geben.

public class HelloWorld extends Application
// ...```

HALT ! Moment mal, wie war das mit "extends ist eine "ist ein"-Beziehung" ? Das haut irgendwie nicht wirklich hin. Ich mein, es mag zwar wohl durch aus stimmen das die GUI selbst durch aus eine FX-Application ist, aber doch bitte nicht der Rest von meinem Code. Stecke ich meine Logik mit in diese Klasse gebe ich die Trennung zwischen Logik und GUI auf. Zumindest für mich irgendwie ein Widerspruch zu dem was ich mal gelernt habe und auch selbst umsetze.

```@Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {
 
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });
        
        StackPane root = new StackPane();
        root.getChildren().add(btn);

 Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }```

Gut, was da letzten Endes passiert verstehe ich ja soweit, es wird halt die GUI zusammengebastelt und eine recht interessante neue Form des Event-Handling (statt je Event eine eigene Klasse wirds jetzt einfach mit Generics gemacht).
Mich irritiert nur irgendwie das show(). Mein bisheriger Swing-Code sah bisher so aus das halt die GUI zusammengebaut wurde (extends dabei nur an Stellen wo es wirklich nicht anders geht (z.B. Override paintComponent())) und setVisible() kam dann über SwingUtilities.invokeLater() über den EDT. Sieht mir hier zwar irgendwie auch so aus das es korrekt über den EDT kommt, aber halt irgendwie "von innen", was sich für mich irgendwie nicht richtig anfühlt. Die Steuerung das irgendwas angezeigt wird sollte nicht von der Komponente selbst am Ende ihres build-up kommen.

```public static void main(String[] args) {
        launch(args);
    }```

Gut, da ja oben was von "extends Application" ist klar was hier gecallt wird, aber den Stack verstehe ich dennoch nicht : main() > launch() > EDT > start() ?!
Klar, einfach vorhandenen Code die synchronisierung mit dem EDT überlassen, nur erkennen ich dabei leider keinen Unterschied zum SwingUtilities.invokeLater() und daher auch keinen Vorteil darin.


Fazit : ich kann mir leider auch nach weiterem Durchblättern des Tuts nicht wirklich klar machen was jetzt so viel besser an FX sein soll und irgendwie irritiert mich halt der grundlegende Aufbau. Gut, dem Framework das sync überlassen, macht Swing ja auch wenn mans richtig schreibt, aber das völlig de-plazierte extends stört mich doch schon ziemlich. Aber naja, wie gesagt : vielleicht schafft es ja einer von euch mir da mal Licht ins Dunkel zu bringen.

Vielleicht kein Licht. Aber vielleicht kann ich dafür sorgen, dass das Dunkel dich nicht mehr so stört: Bei den Swing-Beispielen gibt es auch einige böse worst practices, angefangen bei “extends (JFrame? oder) irgendwelche Components”, bis hin zu (ich meine sogar schonmal gesehen zu haben) fehlendem invokeLater beim Erstellen, und andere Kleinigkeiten. Man muss gerade bei den ersten Beispielen davon ausgehen, dass dort Dinge auf eine Art und Weise gemacht werden, wie man sie in einer “richtigen”, “großen” Anwendung NICHT machen würde - einfach um die Beispiele möglichst überschaubar, kompakt und nachvollziehbar zu halten, oder auch Dinge didaktisch aufeinander aufbauen zu lassen. (Für echtes Licht habe ich mich (leider) auch noch nicht genug in JavaFX eingearbeitet… sowas wie https://docs.oracle.com/javafx/2/charts/chart-overview.htm#CJAHHJCB ist zwar ein Teaser, aber dieses CSS-Styling ist (für mich (trotz der Vorteile)) ein gewisser Hemmschuh…)

Das ist mir leider auch aufgefallen, und wenn man so in Richtung “clean code” schielt (ich gebe zu ich habs noch nicht in der Hand gehabt, vllt ne gute Idee zum Geburtstag) bzw auch sonst überlegt was man selbst so als “good practice” kennt (wenn man das hintergrundwissen hat wie es “richtig” geht) ist es eigentlich peinlich dass solch ein Schrott im “offiziellen” Tutorial zu finden ist … sollte man vielleicht mal an den Bug-Tracker melden (like : debian-bug #1 : M$ hat mit Win das Monopol).

Ich weiß zwar nicht was hier jetzt genau die Frage ist aber was den “EDT” in JavaFX angeht wirst du merken wenn du etwas, was dahin gehört nicht dort ausführst. Denn in dem Fall fliegt eine Exception. Daher kannst du davon ausgehen das “start(Stage)” im EDT ausgeführt wird wenn du dort Gui-Änderungen machst.

Was Trennung von Gui - Logik angeht nutz ich dafür eigentlich immer FXML - Controler was schonmal ne Trennung liefert. In wie weit das nun “sauber” oder “richtig” ist beurteile ich mal nicht