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.