0

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

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

更新

我尝试了很多解决方案,但没有达到我的目标。应用程序加载只包含类似父控件的 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)。

[用户列表控制器]

public class UsersListController implements Initializable {
    private UsersMainPageController mainController;

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

[用户管理控制器]

public class UsersManageController implements Initializable {
    private UsersMainPageController mainController;

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

当我从 中单击UsersListControllerButtonEdit加载 时UsersManageController,我收到此错误:

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

1 回答 1

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();
    }
 }
于 2013-11-05T06:11:57.170 回答