2013-11-04 201 views
0

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

是否可以做到这一点?我如何获得我的FirstPanel的父级,并将其用于SecondPanel而不是第一个?

UPDATE

我已经尝试了许多解决方案,但没有达到我的目标。应用程序加载仅包含象父控制一个AnchorPane的UsersMainPageController,所以这是相对的代码:

[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与包含与TableView中的相对控制器UsersListController调用UsersList.fxml一些记录和一些按钮。当我点击一个特定的按钮时,它应该使用相对控制器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(); 
    } 
} 

当我从UsersListControllerButtonEdit点击加载UsersManageController,我得到这个错误:

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

我们可以帮助您更好,如果你给我们你的代码的一些相关部分。 – mathielo

回答

0

你可以将你的孩子fxml添加到父项中控制器..

1.first只需要一个锚点窗格,并设置它的边界,你想放你的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(); 
    } 
}