JavaFX 在 close/on 次要隐藏 window 上保存数据形式的更改
JavaFX saving changes in data form on close/on hide of a secondary window
我试图让我的应用程序在用户单击 [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 必须设为静态才能在 EventHandler 中访问它。一定有更好的解决方案,我希望你们能指出我的方向。
您应该使 saveChanges
方法成为非静态方法,并使用对控制器的引用而不是控制器 class 来调用它。您可以从 FXML 加载器获取对控制器的引用。
您没有显示加载 FXML 的代码,但假设您在创建 Scene
和 Stage
之前就这样做了,您会做:
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){
// ...
}
我试图让我的应用程序在用户单击 [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 必须设为静态才能在 EventHandler 中访问它。一定有更好的解决方案,我希望你们能指出我的方向。
您应该使 saveChanges
方法成为非静态方法,并使用对控制器的引用而不是控制器 class 来调用它。您可以从 FXML 加载器获取对控制器的引用。
您没有显示加载 FXML 的代码,但假设您在创建 Scene
和 Stage
之前就这样做了,您会做:
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){
// ...
}