2016-07-23 11 views
0

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).

+0

* 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

Antwort

0

konnte ich die Situation lösen, indem sie meinen Code zu vereinfachen und den Klassentyp auf den Dateinamen auf Basis der Bestimmung (die dynamisch bestimmt wurde):

Class subLayout; 
    SubLayout2Interface subInterface = null; 
    try { 
    subLayout = Class.forName([Full Package Name] + subLayoutTitle); 
    subInterface = (SubLayout2Interface) subLayout.newInstance(); 
    } catch (Exception e) { 
    e.printStackTrace(); 
} 

subInterface.setRootController(this);