2016-05-13 8 views
1

Ich bin ein Neuling, wenn es um JavaFX geht und ich bin kürzlich auf ein Problem gestoßen, das mich wirklich verwirrt. Ich benutze eine Klasse namens "MainController", die eine FXML-Datei steuert, die ein TabPane enthält. Jede Registerkarte wird von einem anderen Controller gesteuert. Aber es gibt eine Situation, in der eine Registerkarte gelöscht werden muss, also brauche ich Zugriff auf die MainController-Instanz, um die aktuell aktive Registerkarte aus dem Fenster zu entfernen.FXMLLoader kann keine laufende Controller-Instanz finden und erstellt eine neue

Immer wenn ich diesen Code verwende, um eine Instanz des aktuell laufenden MainControllers zu erhalten, erhalte ich stattdessen eine komplett neue Instanz, bei der alle Komponenten auf ihre Standardwerte gesetzt sind.

Der Code ist:

FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml")); 
loader.load(); 
MainController controller = loader.getController(); 
controller.closeCurrentTab(); 

protected void closeCurrentTab() { 
    tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedIndex()); 
} 

Ich bin derzeit einen statischen Verweis auf den Controller für den Zugriff, da es die einzige Lösung ist, die für mich funktioniert. Aber ich weiß, dass das sehr unprofessionell ist und ich möchte das wirklich vermeiden.

Ich hoffe jemand weiß, was hier falsch ist.

Antwort

1

Sie sollten sicherstellen, dass Sie eine Referenz für Ihren Hauptcontroller an dem Punkt haben, an dem Sie ihn verwenden möchten. Ich denke, es ist einer der "Kinder" -Controller (höchstwahrscheinlich der Controller der aktuellen Registerkarte).

Wenn Sie also eine Eigenschaft in dieser Klasse haben, die die Referenz für Ihren Hauptcontroller speichert, wäre Ihr Problem gelöst.

Ich denke, Sie initialisieren dieses "Kind" Controller von der Hauptsteuerung wie:

FXMLLoader loader = new FXMLLoader(getClass().getResource("TabController1.fxml")); 
loader.load(); 

So, hier könnten Sie tun:

TabController controller = loader.getController(); 
controller.mainControllerProperty.set(this); 

Wo mainControllerProperty in TabController wie definiert:

ObjectProperty<MainController> mainControllerProperty = new SimpleObjectProperty(); 
+0

Vielen Dank! Dies funktionierte wirklich gut für meine Tabs. Ich habe nur ein Problem, wenn ich dasselbe tun möchte, wenn ich ein neues Fenster erstelle. Der Versuch, auf den Controller zuzugreifen, führt immer zu einer nullPointerException. Ich füge eine neue Antwort hinzu, sobald ich den Fehler ein wenig besser verstehe. – Geta1992

+1

Wenn die Antwort Ihr Problem behebt, können Sie es akzeptieren und ablehnen? Dies würde diese Frage schließen - dann können Sie eine weitere für ein anderes Problem erstellen. Das macht die Frage klar. Danke :) – DVarga

+0

Das Problem ist, dass ich auf den Controller innerhalb der Initialize() -Methode zugreifen muss, aber es wird immer noch Null an diesem Punkt sein, da die Referenz erst danach hinzugefügt werden kann. EDIT: Gelöst, dass ich selbst. Vielen Dank ;) – Geta1992