JavaFX button über andere Klasse ändern

Linda1999

Mitglied
Ich habe versucht, eine GUI von einer anderen Klasse zu starten, das hat nach einer Weile auch mit eine Global Klasse super funktioniert. Nur kann ich jetzt nichts an den Elementen ändern. Ich habe es schon mit Getter/Setter im Controller versucht. Es hat nichts funktioniert :/
Bitte helft mir 😀

Im Anhang findet ihr noch alle Dateien (IntelliJ) (Der Name ist kreativ ;D)
 

Anhänge

Also. Habe es mir angeschaut und finde es ja schon mal ok, dass du das mit dem FXMLLoader#setController verstanden hast. Ich, jedoch, würde nie so arbeiten.

Aber: Ich verstehe dein Problem noch nicht recht. Was für eine GUI willst du jetzt starten? Dein Projekt enthält nur die eine GUI-Klasse (Controller, FXML)...

Was ich denke, was du meinst: Du setzt in der Main-Klasse mithilfe des hässlichen Singletons den Text. Dummerweise wahrscheinlich, bevor das JavaFX-Toolkit selbst (indem du sie mit Application#launch startest) bereit ist. Denn wenn du die beiden Text-Methoden ans Ende der Klasse "GUI" hängst, geht es.
Wenn du etwas durch den Code des JDK gehst, siehst du, dass #launch einen Thread abspaltet - das wird die Wurzel des Problems sein.

Grundsätzlich würde ich es aber erst mal so umschreiben, dass du keine Singleton-Instanzen der Controller irgendwo liegen hast. Wenn, dann verwende entweder einen zentralen Event-Bus (ja, ein einzelne Instanz wäre schon nötig), an dem sich die GUI anmelden kann und auf Events reagieren kann.
Oder ein zentrales Model (mit JavaFX-Properties), dass du im FXMLLoader an die Controller-Instanzen übergeben kannst, oder per Dependency Injection reinbringst.
 
Naja, ich hab schon Beispiele, aber die sind schon etwas komplexer:

Eine ganze Reihe von Beispielen (etwas unsortiert jedoch) findest du hier:
https://github.com/bgmf/poc/tree/master/simple-tests-fx/src/main/java/eu/dzim/tests/fx

Es gibt kleine Beispiele, die dann z.B. Methoden auf dem Controller ausführen können, bzw. ihn dediziert initialisieren (für den FXMLLoader wichtig)
https://github.com/bgmf/poc/blob/ma.../dzim/tests/fx/MainWithControllerFactory.java

In dem Repo sind son komplexere Beispiele für Guice und Spring Boot drin, aber das wäre wohl Overkill. Schau dich mal dort um, vielleicht helfen dir die ersten beiden Links ja schon etwas...
(Btw: das ganze Repo ist ein Maven-Projekt - am besten auschecken / runterladen und mit IntelliJ dann als bestehendes Projekt laden)
 
Hier sind viele Beispiele für JavaFX-Begiiner:
http://o7planning.org/de/10623/die-anleitung-zum-javafx-fur-den-anfanger#a2746282
Datei FXML ist selbst schon eine GUI, dass Du in deinem Code noch eine File GUI.java finde ich verwirrt. In deinem fxml fehlt die Links 'fx:controller=???' zu deinem Controller, erst dann kannst Du dein cotrols (Button, Gui-Element ...) ansprechen.
Ich hab den controller in der extra klasse festgelegt. Anders gab es fehler.....
 
Hallo Linda1999,

ich wuerde das etwas umstrukturieren... die Klassen Main und Global sind nicht notwendig. Deine GUI hast du im FXML definiert. Dieses laedst du in GUI. Die main-Methode, die Application.launch aufruft, kann auch dort sein.

Java:
public class GUI extends Application {
    public static void main(String[] args) {
        Application.launch(GUI.class);
    }

    @Override
    public void start(Stage primaryStage) throws Exception{
        FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
        loader.setController(Global.controller);
        Parent root = loader.load();
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 600, 400));
        primaryStage.show();
    }
}

Den Controller brauchst du fuer deine kleine Applikation nicht global verfuegbar...

Heisst:
Java:
public class GUI extends Application {
    public static void main(String[] args) {
        Application.launch(GUI.class);
    }

    @Override
    public void start(Stage primaryStage) throws Exception{
        Controller c = new Controller();

        FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
        loader.setController(c);

        Parent root = loader.load();
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 600, 400));
        primaryStage.show();
    }
}

Den Button-Text wuerde ich im Controller setzen. Was macht eigentlich initialize ...?
https://docs.oracle.com/javase/8/javafx/api/javafx/fxml/Initializable.html

Das waere doch ein guter Ort, nicht?
 

Zurück
Oben