JavaFX 在辅助窗口的关闭/隐藏时以数据形式保存更改



我正在尝试使我的应用程序关闭用户单击[X]按钮时在数据表单中所做的更改。 在应用程序中,用户可以双击 TableView 中的行来编辑该行。 如果进行了更改并且用户单击了 [X],则我想提示用户确认更改,然后保存更改。 下面的代码是我到目前为止所拥有的。

主控制器:

Scene scene = new Scene(decorator);     scene.getStylesheets().add(LawnCareSystem.class.getResource("/resources/css/style.css").toExternalForm());
        stage.setScene(scene);
        stage.setOnHidden(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent event) {
                EditCustomerController.saveChanges();
            }
        });
        stage.show();

辅助控制器:

public static void saveChanges(CustomerRow cr){
        StringBuilder sb = new StringBuilder(100);
        sb.append("update Customers");
        if(!cFName.getText().equals(cr.getFirstName())){
            sb.append(" set FirstName = '"+cFName.getText()+"',");
        }
        if(!cLName.getText().equals(cr.getLastName())){
            sb.append(" set LastName = '"+cLName.getText()+"',");
        }
        if(!cEMail.getText().equals(cr.getEmail())){
            sb.append(" set Email = '"+cEMail.getText()+"',");
        }
        if(!cPhoneNumber.getText().equals(cr.getPhoneNumber())){
            sb.append(" set PhoneNumber = '"+cPhoneNumber.getText()+"',");
        }
        sb.deleteCharAt(sb.length()-1);
        sb.append(" where Customer_ID = "+cCustomerID);
        . . .
        . .
        .
    }

问题是 saveChanges 必须设为静态才能在事件处理程序中访问它。 一定有更好的解决方案,我希望你们能指出我这个方向。

应使saveChanges方法非静态,并使用对控制器的引用而不是控制器类来调用它。您可以从 FXML 加载程序获取对控制器的引用。

您没有显示用于加载 FXML 的代码,但假设您在创建 SceneStage 之前执行此操作,您将执行以下操作:

FXMLLoader loader = new FXMLLoader(getClasS().getResource("/path/to/fxml"));
Parent decorator = loader.load();
EditCustomerController editCustomerController = loader.getController();
Scene scene = new Scene(decorator);     scene.getStylesheets().add(LawnCareSystem.class.getResource("/resources/css/style.css").toExternalForm());
stage.setScene(scene);
stage.setOnHidden(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent event) {
        editCustomerController.saveChanges();
    }
});
stage.show();

当然,在控制器中,只需从saveChanges()方法中删除 static 关键字:

public void saveChanges(CustomerRow cr){
    // ...
}

相关内容

  • 没有找到相关文章

最新更新