簡體   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