2016-05-13 74 views
1

对于JavaFX,我是一个新手,最近我遇到了一个让我非常困惑的问题。我使用一个名为“MainController”的类来控制包含TabPane的FXML文件。每个选项卡由另一个控制器控制。但是有一种情况需要删除标签,所以我需要访问MainController实例以从窗格中删除当前活动的标签页。FXMLLoader无法找到正在运行的控制器实例并创建新的控制器实例

无论何时我使用此代码来获取当前运行的MainController的实例,我都会获得一个全新的实例,并将其所有组件设置为其默认值。

的代码是:

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()); 
} 

我目前使用的静态引用控制器来访问它,因为它是对我的作品的唯一解决方案。但我知道这是非常不专业的,我真的想避免这种情况。

我希望有人知道这里有什么问题。

回答

1

你应该确保在你想使用它的地方有一个你的主控制器的参考。我想这是“孩子”控制器之一(很可能是当前选项卡的控制器)。

因此,如果您在此类中有一个存储主控制器参考的属性,则问题将得到解决。

我猜你喜欢的主控制器初始化这个 “孩子” 控制器:

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

所以在这里你可以这样做:

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

mainControllerPropertyTabController定义如下:

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

非常感谢!这对我的标签非常有用。 我只是有一个问题,如果我想创建一个新的窗口时做同样的事情。试图访问控制器总是会导致nullPointerException。一旦我明白这个错误会更好一点,我会添加一个新的回复。 – Geta1992

+1

如果答案解决了你的问题,你能接受并投票吗?这将关闭这个问题 - 那么你可以为另一个问题创建另一个问题。这使问题清楚。谢谢:) – DVarga

+0

原来的问题是我需要访问initialize()方法中的控制器,但它仍然是空的,因为只能在此之后添加引用。 编辑:解决那个我自己。谢谢 ;) – Geta1992