我正在通过我的主应用程序加载FXML文件列表。但是我在使用FX:ID在TabPane中显示一个问题。此TabPane位于borderPane下。我可以访问borderPane的中心,但我无法访问它下面的TabPane。
这是我的设置
In my start:
@Override
public void start(Stage primaryStage) {
this.primaryStage = primaryStage;
initRootLayout();
showPersonOverview();
}
In my init
public void initRootLayout() {
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MainApp.class
.getResource("view/RootLayout.fxml"));
//Note this line, I am setting up my rootLayout to be the
//mainBorderPane, but I want it to be an AnchorePane under the main
//BorderPane
rootLayout = (BorderPane) loader.load();
Scene scene = new Scene(rootLayout);
primaryStage.setScene(scene);
RootLayoutController controller = loader.getController();
controller.setMainApp(this);
primaryStage.show();
} catch (IOException e) {
e.printStackTrace();
}
以下是我遇到的问题。我无法在上面提到的TabPane中显示它。
public void showPersonOverview() {
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MainApp.class.getResource("view/PersonOverview.fxml"));
AnchorPane personOverview = (AnchorPane) loader.load();
//Here I am displaying the personOverview inside the main boarderPane
rootLayout.setCenter(personOverview);
PersonOverviewController controller = loader.getController();
controller.setMainApp(this);
} catch (IOException e) {
e.printStackTrace();
}
}
答案 0 :(得分:1)
您的RootLayoutController具有对选项卡窗格的引用,因此从根控制器定义选项卡窗格的访问器方法,并在您想要添加新选项卡时使用该方法。
// Store a reference to your root controller in your application.
RootLayoutController rootController;
...
// in initRootLayout()
...
rootController = loader.getController();
...
// in showPersonOverview()
...
AnchorPane personOverview = (AnchorPane) loader.load();
rootController.getTabPane().getTabs().add(
new Tab("Person Overview", personOverview)
);
...
rootController只是:
@FXML tabPane;
public TabPane getTabPane() {
return tabPane;
}
使用节点查找的替代解决方案
或者,您可以使用基于css id选择器的use node.lookup()函数,但是,通常,使用上面的引用可能比查找更好,因为引用是类型安全的并且不受运行时变幻莫测的影响。 css查找。在将元素添加到场景和applied a css and layout pass之后,CSS查找有时只能按预期工作。