Richtige Controller-Interaktion

Hey,

ich hätte mal eine kurze Frage und zwar arbeite ich mich gerade in JavaFX ein
und versuche vorwiegend die GUI mit FXML zu erstellen.

Jetzt habe ich ein JavaFX-Projekt A, welchem ein JavaFX-Preloader-Projekt B vorangestellt ist und möchte im Preloader
Login-Daten abfragen (im Hintergrund wird schon einmal die Hauptapplikation geladen).
Das Text- bzw. Passwortfeld, wird mit der üblichen FXML-Annotation in den Controller injected.

Kommen wir zum Problem:
Wie kann ich jetzt an den Controller noch eine Instanz der Hauptklasse (also hier den Klasse mit “extends Preloader”), übergeben?

Ich habe es wie folgt versucht:

  • FXMLLoader instanziiert als Objektvariable
  • FXML-Dokument damit geladen, Szenengraph an Stage übergeben, pi-pa-po
  • dann: (MeinController) loader.getController(); bzw. auch loader.getControllerFactory().call(MeinController.class) ***
  • aktuelle Instanz der Preloader-Subklasse an Controller übergeben

Beides hat nicht funktioniert, also eine NullPointerException geschmissen. Es scheint also kein Controller im Loader registriert zu sein.
Allerdings existiert er ja und funktioniert auch (z.B. bei Buttonklick)

Ich könnte natürlich den Controller im Preloader deklarieren und instanziieren und dann an eines der Node-Elemente im Szenegraph übergeben (wo ich mich erst durchwurschteln müsste).
Aber wenn mir JavaFX die Möglichkeit gibt einen Controller im FXML festzulegen (und zum Beispiel mit fx:id Elemente zu injecten), möchte ich das auch nutzen.

Vielen Dank schonmal für eure Antworten, wenn etwas unklar ist, oder sonst Fragen bestehen, immer her damit.

Ohne weiter auf dein Problem mit der Controllerklasse einzugehen (dazu müsste man etwas Code sehen) möchte ich dein Augenmerk auf folgenden Lösungsansatz richten:
Bastel Dir eine simple Klasse “LoginData” oder so, nur mit Username und PW als Felder, und richtest Dir dann in deiner Preloader-Klasse eine
ObjectProperty<LoginData> data = new SimpleObjectProperty<LoginData>(); ein, kreierst die entsprechenden getter-Methoden dafür und lässt nun diese Property von deiner Hauptklasse aus “beobachten”, also hängst einen ChangeListener daran. In der Preloaderklasse brauchst Du nun lediglich, nachdem der User seine Eingaben getätigt hat, ein “LoginData”-Objekt erstellen und dieses deiner Property übergeben:
data.set(new LoginData(username, password));
Deine Hauptklasse bekommt so die Daten weitergereicht.
EDit: So, das klingt ja alles super, nichtsdestotrotz benötigst Du Zugriff auf den Controller. Ich habe hier also größtenteils Unsinn geschrieben, der Dir nicht weiterhilft. Also: Code zeigen!

Hey Hobelhai,
danke für deine Antwort. Das Problem mit dem Controller hat sich (zum Glück) gelöst. Ich schreib hier noch einmal kurz, woran es lag:

Mein Versuch:

private FXMLLoader loader = new FXMLLoader();
private PreloaderController controller;

@Override
public void start(Stage stage) throws Exception {
    Scene root = loader.load(getClass().getResource("/fxml/preloader.fxml"));
    controller = loader.getController(); // bzw. controller = loader.getControllerFactory().call(PreloaderController.class);

    // usw. usf.
}

So geht es richtig, da die Load-Methode mit Parametern wohl die geladene Scene nicht behält:

private FXMLLoader loader;
private PreloaderController controller;

@Override
public void start(Stage stage) throws Exception {
    loader = new FXMLLoader(getClass().getResource("/fxml/preloader.fxml"));
    controller = loader.getController();

    Scene scene = loader.load();

    // usw. usf.
}

Danke für den Hinweis mit den Properties. In wie weit sind diese denn zwingend bei JavaFX? Ich habe z.B. schon eine Credentials-Klasse, mit noch ein paar weiteren Werten,
als dem Login und dem Passwort. Wäre aber wahrscheinlich besser, wenn ich trotzdem eine LoginData-Klasse für die View(bzw. den Preloader) schreibe.
Wie genau das mit dem hin-und-her übergeben funktionieren soll (im optimalsten Fall), muss ich mir dann wohl noch einmal genau anlesen. Die Hauptapplikation kann ich ja eigentlich
nur mit den Notification-Methoden mit übergeben und dem Controller muss ich auch noch die aktuelle Instanz der Preloader-Klasse geben (oder sind die Listener generell an alle Instanzen von
LoginData gebunden, bei Anmeldung?).
Ach, weißt du was ich lese mich da erstmal nochmal genauer rein, aber habe dafür eh erst später Zeit, also wenn du Zeit und Lust hast, kannst du mir ja auch schon ein paar Details vorweg erzählen,
dann lese ich diese später zuerst.

Allgemein habe ich das Projekt nämlich in drei Module getrennt (Preloader, View, Main).