[英]Cannot communicate between controllers in JavaFX
我正在尝试使用JavaFX开发一个演示应用程序,其中有2个控制器MainController和AddUserController,每个控制器都有其自己的.fxml文件,main.fxml包含显示用户列表的表,以及一个用于打开添加窗口的按钮某些字段的用户。 因此,用户列表包含在内存数据库中。
因此,在添加用户时,表中不会包含该列表。
MainController.java
public void setTestUser(){
List<Users> users = new ArrayList();
Users user = new Users();
user.setName("Name");
user.setSurname("Surname");
users.add(user);
name.setCellValueFactory(new PropertyValueFactory<Users, String>("name"));
surname.setCellValueFactory(new PropertyValueFactory<Users, String>("surname"));
usersTable.setItems(FXCollections.observableArrayList(users));
}
AddUserController.java
private void handleAddUser(ActionEvent event) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.load(getClass().getResource("/fxml/main.fxml").openStream());
MainController mainController = fxmlLoader.getController();
Users user = new Users();
user.setName(name.getText());
user.setSurname(surname.getText());
user.setDateOfBirth(dateOfBirth.getValue().toString());
usersService.add(user);
mainController.populateUsersTable();
}
添加用户后,该表不会更新,但是如果我尝试使用usersTable.getItems();
列表在那里,到目前为止有什么问题?
//更新:
尝试从MainController.java执行此操作,它工作正常
public void setTestUser(){
List<Users> users = new ArrayList();
Users user = new Users();
user.setName("Name");
user.setSurname("Surname");
users.add(user);
name.setCellValueFactory(new PropertyValueFactory<Users, String>("name"));
surname.setCellValueFactory(new PropertyValueFactory<Users, String>("surname"));
usersTable.setItems(FXCollections.observableArrayList(users));
}
原因可能是您每次处理“添加用户”事件时都在新窗格上创建了一个新控制器。 这显然是错误的,因为对其所做的更改不会影响实际显示的窗格。
相反,您应该在加载窗格时获取控制器,将其存储在某个地方,并在需要时引用它。
FXMLLoader myLoader = new FXMLLoader(
getClass().getResource(screen.getFile()),
resources);
Parent loadScreen = myLoader.load();
XYController myScreenController = myLoader.getController();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.