繁体   English   中英

JavaFX中的控制器之间无法通信

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM