如何在 JavaFX 中关闭子 window 后刷新父 window?
How to refresh parent window after closing child window in JavaFX?
我有一个显示人的父项 Window 即:
名字:约翰
姓氏:布朗
年龄:18
我单击“编辑”按钮,子项 window 打开,更改名字,然后单击接受,子项 window 关闭,更改保存在 mysql 数据库中,但父项 window 仍然显示旧值。我确实有一个有效的刷新方法,但我如何从子 window 调用它或将其设置为在关闭子 window 后调用?
父子 Windows 都有控制器和 fxml。任何帮助将不胜感激。
James_D的回答(更好)
感谢 @James_D,你应该使用 setOnHidden
instead of setOnCloseRequest
,这样你就可以再次调用 .close()
和 EventHandler
将被调用。
我的回答
你可以利用 setOnCloseRequest
:
childStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
public void handle(WindowEvent we) {
// Refresh the parent window here
}
});
要在子表单上调用此关闭请求,您可以执行以下操作:
childStage.getOnCloseRequest().handle(new WindowEvent(childStage, WindowEvent.WINDOW_CLOSE_REQUEST));
// or
childStage.fireEvent(new WindowEvent(childStage, WindowEvent.WINDOW_CLOSE_REQUEST));
因此您可以像这样在子阶段实现关闭按钮:
Button closeButton = new Button("Close");
closeButton.setOnAction(event -> childStage.fireEvent(new WindowEvent(childStage, WindowEvent.WINDOW_CLOSE_REQUEST)));
我认为在 JavaFX 中进行自动字段更新的最佳方式是使用属性。如果父 window 中的 name 字段绑定到 SimpleStringProperty 你只需要在子 window 关闭时设置 属性 的值来通知父 window更新。
我做了一个小的父/子例子来测试这个概念,相关的代码是这样的,放在子创建方法上:
FXMLLoader loader = new FXMLLoader(getClass().getResource("Child.fxml"));
Parent root = loader.load();
ChildController controller = loader.getController();
name.textProperty().bind(controller.name.textProperty());
字段名称在父项中是Label,在子项中是TextField。子文本的任何更改都会立即反映在父文本中。
这是一个有趣的话题。我会尽快在我的 'a cup of java' blog 中制作一个完整的示例和 post ir。
如果您使用弹出窗口,您可以将方法设置为 showandwait 而不是仅从舞台对象显示,并且在 运行 更新 GUI 的方法之后。因为 showandwait 方法在弹出窗口 运行ning 时暂停主框架,一旦弹出窗口关闭,它将 运行 您的更新代码。
stage.showAndWait();
updateGUI();
我们认为我们有两个阶段(window),1-parent stage,2-child window(pop up window)
先将parent stage的stage对象发送给child stage
在儿童舞台布景中:
childStage.setOnHidden(event->{
Parent root=FXMLLoader.load(getClass().getResource(parent fxml));
Scene scene=new Scene(root);
parentStage.SetScene(scene);
parentStage.show();
`
我有一个显示人的父项 Window 即:
名字:约翰
姓氏:布朗
年龄:18
我单击“编辑”按钮,子项 window 打开,更改名字,然后单击接受,子项 window 关闭,更改保存在 mysql 数据库中,但父项 window 仍然显示旧值。我确实有一个有效的刷新方法,但我如何从子 window 调用它或将其设置为在关闭子 window 后调用?
父子 Windows 都有控制器和 fxml。任何帮助将不胜感激。
James_D的回答(更好)
感谢 @James_D,你应该使用 setOnHidden
instead of setOnCloseRequest
,这样你就可以再次调用 .close()
和 EventHandler
将被调用。
我的回答
你可以利用 setOnCloseRequest
:
childStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
public void handle(WindowEvent we) {
// Refresh the parent window here
}
});
要在子表单上调用此关闭请求,您可以执行以下操作:
childStage.getOnCloseRequest().handle(new WindowEvent(childStage, WindowEvent.WINDOW_CLOSE_REQUEST));
// or
childStage.fireEvent(new WindowEvent(childStage, WindowEvent.WINDOW_CLOSE_REQUEST));
因此您可以像这样在子阶段实现关闭按钮:
Button closeButton = new Button("Close");
closeButton.setOnAction(event -> childStage.fireEvent(new WindowEvent(childStage, WindowEvent.WINDOW_CLOSE_REQUEST)));
我认为在 JavaFX 中进行自动字段更新的最佳方式是使用属性。如果父 window 中的 name 字段绑定到 SimpleStringProperty 你只需要在子 window 关闭时设置 属性 的值来通知父 window更新。
我做了一个小的父/子例子来测试这个概念,相关的代码是这样的,放在子创建方法上:
FXMLLoader loader = new FXMLLoader(getClass().getResource("Child.fxml"));
Parent root = loader.load();
ChildController controller = loader.getController();
name.textProperty().bind(controller.name.textProperty());
字段名称在父项中是Label,在子项中是TextField。子文本的任何更改都会立即反映在父文本中。
这是一个有趣的话题。我会尽快在我的 'a cup of java' blog 中制作一个完整的示例和 post ir。
如果您使用弹出窗口,您可以将方法设置为 showandwait 而不是仅从舞台对象显示,并且在 运行 更新 GUI 的方法之后。因为 showandwait 方法在弹出窗口 运行ning 时暂停主框架,一旦弹出窗口关闭,它将 运行 您的更新代码。
stage.showAndWait();
updateGUI();
我们认为我们有两个阶段(window),1-parent stage,2-child window(pop up window)
先将parent stage的stage对象发送给child stage
在儿童舞台布景中:
childStage.setOnHidden(event->{ Parent root=FXMLLoader.load(getClass().getResource(parent fxml)); Scene scene=new Scene(root); parentStage.SetScene(scene); parentStage.show();
`