简体   繁体   English

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

[英]Cannot communicate between controllers in JavaFX

I am trying to develop a demo app using JavaFX where I have 2 controllers MainController and AddUserController, each of them has its own .fxml file, main.fxml contains table that displays the list of users, and a button that opens the window for adding user with some fields. 我正在尝试使用JavaFX开发一个演示应用程序,其中有2个控制器MainController和AddUserController,每个控制器都有其自己的.fxml文件,main.fxml包含显示用户列表的表,以及一个用于打开添加窗口的按钮某些字段的用户。 So the list of users is contained in a in-memory DB. 因此,用户列表包含在内存数据库中。

So when adding an user the table isn't filled with the list. 因此,在添加用户时,表中不会包含该列表。

MainController.java 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 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();
}

After adding the user the table isn't updated, but if I try to usersTable.getItems(); 添加用户后,该表不会更新,但是如果我尝试使用usersTable.getItems(); the list is there, what's the problem so far? 列表在那里,到目前为止有什么问题?

// UPDATE: //更新:

Trying to execute this from MainController.java and it is working OK 尝试从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));
    }

The reason might be that you create a new controller on a new pane each time you handle an "add user" event. 原因可能是您每次处理“添加用户”事件时都在新窗格上创建了​​一个新控制器。 This is plainly wrong, as changes to it don't affect the pane which is actually displayed. 这显然是错误的,因为对其所做的更改不会影响实际显示的窗格。

Instead, you should get the controller when you load your pane, store it somewhere and refer to it whenever you need it. 相反,您应该在加载窗格时获取控制器,将其存储在某个地方,并在需要时引用它。

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