我有一个borderpane,我正在加载一个fxml(别名FirstPanel),里面有相对控制器,位于中心。 fxml包含一个TableView和一个按钮,它应该加载另一个fxml(别名SecondPanel)和相对控制器而不是第一个面板。基本上,SecondPanel需要显示有关表中所选数据的一些细节。
有可能吗?如何获得我的第一个面板的父母并将其用于第二个面板而不是第一个面板?
UPDATE
我尝试了很多解决方案,但没有达到我的目标。应用程序加载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
你可以将你的孩子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();
}
}