如何在 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)

  1. 先将parent stage的stage对象发送给child stage

  2. 在儿童舞台布景中:

    childStage.setOnHidden(event->{ Parent root=FXMLLoader.load(getClass().getResource(parent fxml)); Scene scene=new Scene(root); parentStage.SetScene(scene); parentStage.show();

`