从MainApp如何在JavaFX中的另一个控制器中显示fx:id中的内容

时间:2017-07-18 02:36:21

标签: javafx controller

我正在通过我的主应用程序加载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();
        }
    }

enter image description here

1 个答案:

答案 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查找有时只能按预期工作。