当我在JavaFx中的场景2视图中时如何更新场景1数据视图?

问题描述 投票:0回答:1

我面临的问题是我试图通过Excel文件获取数据并将其插入到我的数据库中,之后表上的数据应该更新,但它没有发生。

这是我的主类,它会打开一个新框架,通过它我可以上传 Excel 数据并将其插入到我的数据库中。

AddNewAccountHolderController.java
文件。

@FXML
void onImport() {
    ImportAccountHoldersData accountHolder = new ImportAccountHoldersData();
    Stage stage = new Stage();
    try {
        accountHolder.start(stage);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

}

此功能打开一个新视图,其控制器是

ImportAccountHoldersDataController.java
。现在,在这个控制器中,我有一个插入函数,可以将数据插入数据库中。

这是函数:

@FXML
void onInsert() {
    try {
        // Check if the table is not empty
        if (accountHoldersTableView.getItems().isEmpty()) {
            MessageDialogs.showErrorMessage("No account holders to insert.");
            return; // Exit the method since there's nothing to insert
        }

        DatabaseConnection db = new DatabaseConnection();
        CallableStatement statement = db.connection.prepareCall("{CALL sp_create_account_holder(?, ?, ?, ?, ?, ?)}");

        boolean allRecordsInserted = true;

        for (AccountHolder accountHolder : accountHoldersTableView.getItems()) {
            // Set the input parameters for the stored procedure
            statement.setString(1, accountHolder.getName());
            String cnicNo = accountHolder.getCnicNo().replaceAll("-", "");
            statement.setBigDecimal(2, BigDecimal.valueOf(Long.parseLong(cnicNo)));
            statement.setString(3, accountHolder.getAddress());
            statement.setString(4, accountHolder.getPhone());
            statement.setBoolean(5, accountHolder.isisRetailer());

            statement.registerOutParameter(6, Types.VARCHAR);

            // Execute the stored procedure
            statement.execute();

            // Retrieve the result message
            String resultMessage = statement.getString(6);

            if (!resultMessage.equals("Account holder added successfully.")) {
                allRecordsInserted = false;
            }
        }

        // Close the database connection and statement
        db.connection.close();
        statement.close();

        if (allRecordsInserted) {
            MessageDialogs.showMessageDialog("All account holders created successfully.");

                AddNewAccountHolderController controller = new AddNewAccountHolderController();
controller.populateAccountHoldersTable();


        } else {
            MessageDialogs.showErrorMessage("Error inserting account holder(s).");
        }
    } catch (Exception e) {
        // Log the exception for debugging purposes
        log.error("Error inserting account holders(s): " + e.getMessage(), e);

        // Show a user-friendly error message
        MessageDialogs.showErrorMessage("An error occurred while inserting account holder(s).");
    }
}

现在成功插入所有记录后可以看到。我想更新先前称为

AddNewAccountHolderController.java
文件视图的表格视图。但这给了我一个空指针异常。

ERROR com.al_makkah_traders_app.controller.ImportAccountHoldersDataController - Error inserting account holders(s): Cannot invoke "com.al_makkah_traders_app.controller.AddNewAccountHolderController.populateAccountHoldersTable()" because "this.addNewAccountHolderController" is null
java.lang.NullPointerException: Cannot invoke "com.al_makkah_traders_app.controller.AddNewAccountHolderController.populateAccountHoldersTable()" because "this.addNewAccountHolderController" is null

我不知道如何防止它并更新表视图。

java exception javafx nullpointerexception
1个回答
0
投票

在新舞台的控制器中:

添加 Runnable 类的一个属性,名称为“callbackOnClose”。 为此属性创建一个设置器。 在“onInsert”结束时执行“callbackOnClose.run()”。

在父阶段:

在加载新的舞台/场景之前,获取它的控制器并使用您创建的 setter 方法设置回调。 您可以创建一个 Runnable 并将其作为参数传递,或者使用 Lambda 来执行此操作。 因为您位于父视图控制器中,所以您可以访问其属性。

注:

我在所有项目中都是这样做的,每次都很有效。

注2:

您可以使用任何类型的 Interface 来代替 Runnable。如果需要,您可以创建自己的界面。

© www.soinside.com 2019 - 2024. All rights reserved.