2013-04-23 5 views
5

Ich habe mehrere FXML-Dateien, die ich in SceneBuilder und eine Controller-Datei erstellt habe. Wenn ich einen Wert (z. B. einen Integer-Wert) in einer Szene bearbeite und dann zwischen Szenen umschalte, scheint dieser Wert in der neuen Szene nicht geändert worden zu sein.Haben Sie mehrere FXML-Dateien (in SceneBuilder erstellt), aber nur einen Controller. Lädt jede Szene ihre eigene Kopie des Controllers?

Wenn die fxml Datei für eine Szene laden, ist mein Programm eine Kopie der Controller-Datei nur für (und verwendete nur), dass fxml Datei laden?

Wirklich zu schätzen jede Hilfe, die Sie Jungs geben können, die diese Frage beantworten.

Antwort

15

Ihre Controller-Datei ist eine Java-Quelldatei, die auf eine einzige Java-Klasse kompiliert wird, aus denen möglicherweise viele Java-Objekt-Instanzen erstellt werden.

Zur Laufzeit erstellt die standardmäßige fxml loader controller factory -Implementierung eine neue Controller-Instanz (d. H. Ein neues Objekt), wenn Sie den fxml loader load method aufrufen.

Auch wenn Sie die gleiche fxml Datei immer und immer wieder laden, wird der Lader eine neue Controller-Instanz jedes Mal erstellen, die jeweils mit einer eigenen internen Zustand unabhängig von allen anderen.

Und falls Sie verschiedene fxml laden alle von der gleichen Controller-Klasse gesichert Dateien - jedes Mal, wenn Sie eine beliebige fxml Datei, werden Sie eine neue Controller-Instanz erhalten. Um Daten zwischen Controllern Dependency Injection oder eine separate Initialisierungsmethode


Update noch weitere Frage auf Controller-Daten zu beantworten

teilen finden Sie unter:

Passing Parameters JavaFX FXML

Auch Verwendung von static class members können Sie Informationen teilen. Verwenden Sie keine statische in Kombination mit @FXML, as that won't work.

Es gibt ein nettes Tutorial für mit mehreren fxml Dateien arbeiten, die Sie nützlich finden können:


Hinweis: Es ist technisch möglich, teilen Sie einen einzigen Controller unter mehreren FXML-Dateien

Wie bereits in den Kommentaren von Greg Brown aus: mit FXMLLoader#setController() und FXMLLoader#setControllerFactory()

es möglich ist, eine größere Kontrolle über Controller Instanziierung auszuüben.

ich nicht stark den folgenden Ansatz empfehlen, die weiter in der zugehörigen Antwort auf erklärt:

+0

Danke, jewelsea! Ich dachte, das könnte der Fall sein. Da es für jede geladene fxml-Datei eine neue Instanz des Controllers gibt, gibt es eine Möglichkeit, diese Instanzen dazu zu bringen, Informationen gemeinsam zu nutzen? Oder wenn ich mein Programm neu schreiben sollte, um verschiedene Controller für jede fxml-Datei zu verwenden, können Sie verschiedene Controller zum Austausch von Informationen bekommen? – Aaron

+0

Antwort aktualisiert mit Lösung für die zusätzliche Frage. – jewelsea

+1

Sie rocken, jewelsea! Ich werde mir die jetzt ansehen. Vielen vielen Dank!! – Aaron