JavaFX Methode nach initialize() aufrufen

MarkusM

Aktives Mitglied
Hallo zusammen,

ich habe einem FXML Controller beim Erzeugen eine Klasse übergeben:

Java:
FXMLLoader loader = new FXMLLoader(getClass().getResource("/sample/views/xxx.fxml" ));
Controller viewController = loader.getController();
viewController.setApc(apc);

Nun habe ich das Problem, dass ich in der initialize() Methode des Controllers auf Methoden der übergebenen Klasse zugreifen muss. Dies geht natürlich nicht, da diese zu dem Zeitpunkt noch nicht zur Verfügung steht => NPE

Kriege ich dies irgendwie gelöst? Bzw. gibt es eine Methode die der initialize() unmittelbar folgt?
 
Du solltest dir auf jedenfall die FXMLLoader::setControllerFactory ansehen, da kannst du dir deinen Controller selber bauen.
 
Wenn du dir den Code des FXMLLoader anschaust, zum Beispiel auf GrepCode - http://grepcode.com/file/repo1.mave...8.0-ea-b96.1/javafx/fxml/FXMLLoader.java#2351 - in der (im Link bereits ausgewählten) Zeile #2351 wird die #initialize-Methode aufgerufen. Und nur diese.
Einizg noch interessant ist, dass es noch weitere Hinweise auf Methoden-Aufrufe gibt, diese scheinen sich aber meist auf Controller-spezifische Methoden (ich meine damit die Handler für Buttons, etc.) zu beeziehen. Du könntest es ja einfach einmal ausprobieren, was passiert, wenn du eine beliebige Methode mit @FXML annotierst, ob diese z.B. einen Aufruf System.out.println("bla");

Ich kann dir also nur empfehlen, den Teil der #initialize-Methode in deinen bisherigen Setter (#setApc) einzupflegen - und diesen eventuell etwas sprechender umzubenennen.
 
@Flown Gut, das ginge natürlich auch, aber dann muss man sich auch um die Initialisierung seiner Controller-Instanz kümmern. Das ist im einfachsten Fall ja nur ein "new <KlassenName>" und wird erst dann komplizierter, wenn der Loader wiederverwendet wird. Und dann wirst du die Instanz erstellen, hast aber noch keine Buttons etc. (die sind dann alle noch null). Du ( @MarkusM ) kannst dies also in erster Linie nutzen, um deine Dependencies schon rein zu "injecten", aber der eigentliche Aufruf der #initialize kommt irgendwann danach und dort solltest du dann mit der Variable aus #setApc arbeiten können.

Ich habe die von @Flown vorgeschlagene Variante einmal im Zusammenspiel mit Spring Boot verwendet, um die Spring-Dependency-Injection verwenden zu können.
 
@dzim die Standard-ControllerFactory ist null und wenn das passiert wird: ReflectUtil.newInstance(clazz); aufgerufen. Was nichts anderes macht als clazz.newInstance(). Also sehe ich keinen Grund das nicht zu übernehmen und dann noch den setter aufzurufen.

Aber ich gebe dir recht, dass man den Code auslagern sollte und erst bei Verfügbarkeit dieses "Apc" ausführen sollte.
 
@Flown Nein, du hast schon recht. Die Variante ist sogar im Nachhinein betrachtet die wahrscheinlich bessere Wahl! (Ich hab nur einfach nicht sofort an diese gedacht! 😉)
 
Sorry für die späte Antwort und lieben Dankl für Eure Anregungen. Ich habe einen anderen "Designweg" für meine Anwendung gefunden, werde mir die Hinweise aber definitiv zu Gemüte führen! Vielen Dank!
 

Zurück
Oben