Ich entwickle eine JavaFX-Anwendung, die mehrere "untergeordnete" FXML-Ansichten hat. Ich bemühe mich, sicherzustellen, dass alle Kinder Zugriff auf das "root" -Layout haben.(JavaFX) Wie übergeben Sie die Instanz der Klasse an einen FXML-Controller, ohne den Namen des Controllers zu kennen?
Hier ist die grundlegende Hierarchie meiner Anwendung:
RootLayout
-> SubLayout1
-> UnknownLayout
SubLayout1
aus einer FXML-Datei erstellt wird, wenn eine Taste auf der RootLayout
geklickt wird.
Im SubLayout1
Controller, ich habe Code, der die UnknownLayout
(FXML) und UnknownLayoutController
(zugehörige Steuerung) Dateien dynamisch instanziert und laden:
FXMLLoader loader = new FXMLLoader(getClass().getResource(file.toString()));
loader.setController(controller);
loader.setRoot(this);
loader.load();
Sowohl file
und controller
kurz vor dem FXML Laden zugeordnet sind, Fertig sein.
Da ich das dynamisch mache, weiß ich nicht, was der tatsächliche Name UnknownLayout
oder sein Controller sein wird.
Mein Problem ist, dass ich nicht herausfinden kann, wie man eine Instanz des RootLayout
-Controllers an die UnknownLayoutController
übergeben, damit es auf die Methoden in diesem Controller zugreifen kann. Ich mache in jeder UnknownLayoutController
Klasse eine Methode, die ich erlauben, die Steuerung von RootLayout
zu übergeben:
public void setRootLayoutController (RootLayoutController rootController) {}
Vorbei an den RootController
-SubLayout1
ist kein Problem, weil ich es mit dem Konstruktor übergeben kann. Aber ohne den Namen von UnknownLayout
zu kennen, wie würde ich diese Methode jemals nennen? Gibt es eine Möglichkeit, den Konstruktor des neuen Controllers innerhalb des Blocks FXMLLoader
aufzurufen? Jeder "Best Practice" Weg, dies zu erreichen?
Mein controller
Referenz wird hier erstellt:
StringBuilder controller = new StringBuilder();
controller.append(title + "Controller.java");
Sie für jede Hilfe im Voraus Danke bieten kann!
EDIT: Ich habe mehrere andere Vorschläge versucht, dies zu erreichen, einschließlich Passing Parameters JavaFX FXML, aber alles, was ich gefunden habe, vorausgesetzt, ich kenne den Namen des neuen Controllers vor der Laufzeit.
Ich sah in auch eine Schnittstelle in UnknownLayoutController
Umsetzung, aber ich einen Nullpointer Fehler dann auf diesem Code erhalten:
UnknownLayoutInterface subController = loader.getController();
subController.setRootController(rootController);
Die controller
Variable ist ein String, tut den Namen des Controllers in Frage halten , aber gibt es sogar eine Möglichkeit, die Zeichenfolge in ein gleichnamiges Objekt zu konvertieren und darauf zuzugreifen?
(Ich definiere jetzt den FXMLs Controller in der FXML fx:controller
Tag statt innerhalb des Codes).
* Gibt es eine Möglichkeit den neuen Controller Konstruktor aufrufen aus der FXMLLoader Block? * Können Sie das klären? Wie erstellst du den Controller? Verwenden von 'fx: controller' in der fxml? Verwenden Sie das Fabrik/Strategie/Befehlsmuster? – fabian