JavaFX在父控制器内部加载FXML

时间:2013-11-04 18:50:17

标签: javafx parent-child fxml

我有一个borderpane,我正在加载一个fxml(别名FirstPanel),其中包含相对控制器并位于中心。 fxml包含一个TableView和一个按钮,它应该加载另一个fxml(别名SecondPanel)和相对控制器而不是第一个面板。基本上,SecondPanel需要显示有关表中所选数据的一些细节。

有可能吗?如何获取FirstPanel的父级并将其用于SecondPanel而不是第一个?

更新

我尝试了很多解决方案,但没有达到我的目标。应用程序加载UsersMainPageController,它只包含像父控件一样的AnchorPane,因此这是相对代码:

[UsersMainPageController]

public class UsersMainPageController implements Initializable {

    private PostOffice application;

    @FXML
    private AnchorPane ParentControl;

    public void setApp(PostOffice application){
        this.application = application;
    } 

    public void loadPage(String pageName) {
        try {                    
            URL url = getClass().getResource(pageName);
            FXMLLoader fxmlLoader = new FXMLLoader();
            fxmlLoader.setLocation(url);
            fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
            AnchorPane page = (AnchorPane) fxmlLoader.load(url.openStream()); 

            ParentControl.getChildren().clear();///name of pane where you want to put the fxml.
            ParentControl.getChildren().add(page);

        } 
        catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void loadManageUsers () {
        loadPage("UsersManage.fxml");
    }

    public void loadListUsers () {
        loadPage("UsersList.fxml");
    }

    /**
     * Initializes the controller class.
     */

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        loadListUsers();
    }

}

loadListUsers使用相对控制器UsersListController调用UsersList.fxml,该控件包含带有一些记录和一些按钮的TableView。当我单击一个特定按钮时,它应该调用带有相对控制器UsersManageController的loadManageUsers,它包含一些用于编辑数据和插入新用户的字段。编辑或插入用户时,它应该能够使用TableView返回上一页并清除当前页面(在本例中为UsersManageController)。

[UsersListController]

public class UsersListController implements Initializable {
    private UsersMainPageController mainController;

    @FXML
    private void handleButtonEditAction(ActionEvent event) throws IOException {
        mainController.loadManageUsers();
    }
}

[UsersManageController]

public class UsersManageController implements Initializable {
    private UsersMainPageController mainController;

    @FXML
    private void handleButtonBackAction(ActionEvent event) throws IOException {
    mainController.loadListUsers();
    }
}

当我点击UsersListController ButtonEdit加载UsersManageController时,我收到此错误:

Caused by: java.lang.NullPointerException
    at postoffice.multiuser.UsersListController.handleButtonAggiornaAction(UsersListController.java:210)
    ... 50 more

1 个答案:

答案 0 :(得分:0)

您可以将您的孩子fxml添加到父控制器..

1.首先只需要一个锚定窗格并设置你想要放置FXML代码的界限。

现在试试这个......

 button.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent t) {
                openNewWindow("Example.fxml");
        }
    });

你可以将fxml名称传递给函数...

public void openNewWindow(String FXMLFile)
 {
     //ChildNode child;
    try {                    
        URL url = getClass().getResource(FXMLFile);
        FXMLLoader fxmlLoader = new FXMLLoader();
        fxmlLoader.setLocation(url);
        fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
        AnchorPane page = (AnchorPane) fxmlLoader.load(url.openStream()); 

        anchor.getChildren().clear();///name of pane where you want to put the fxml.
        anchor.getChildren().add(page);
    } 
    catch (IOException e) {
        e.printStackTrace();
    }
 }