在JavaFX中关闭子窗口后如何刷新父窗口?

在JavaFX中关闭子窗口后如何刷新父窗口?,java,javafx,fxml,Java,Javafx,Fxml,我有一个显示人员的父窗口,即: 名字:约翰 姓:布朗 年龄:18 我单击编辑按钮,子窗口打开,更改名字,然后单击接受,子窗口关闭,更改保存在mysql数据库中,但父窗口仍显示旧值。我确实有一个可用的刷新方法,但如何从子窗口调用它,或将其设置为在关闭子窗口后调用 父窗口和子窗口都有控制器和fxml。任何帮助都将不胜感激。James_D的回答(更好) 多亏了@James_D,您应该使用而不是,这样您就可以再次调用.close(),并调用事件处理程序 我的回答 您可以使用setOnCloseRequ

我有一个显示人员的父窗口,即:

名字:约翰

姓:布朗

年龄:18

我单击编辑按钮,子窗口打开,更改名字,然后单击接受,子窗口关闭,更改保存在mysql数据库中,但父窗口仍显示旧值。我确实有一个可用的刷新方法,但如何从子窗口调用它,或将其设置为在关闭子窗口后调用

父窗口和子窗口都有控制器和fxml。任何帮助都将不胜感激。

James_D的回答(更好) 多亏了@James_D,您应该使用而不是,这样您就可以再次调用
.close()
,并调用
事件处理程序


我的回答 您可以使用
setOnCloseRequest

childStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    public void handle(WindowEvent we) {
        // Refresh the parent window here
    }
});
因此,您可以在子阶段上执行关闭按钮,如下所示:

Button closeButton = new Button("Close");
closeButton.setOnAction(event -> childStage.fireEvent(new WindowEvent(childStage, WindowEvent.WINDOW_CLOSE_REQUEST)));

我认为在JavaFX中实现自动字段更新的最好方法是使用属性。如果父窗口中的名称字段绑定到SimpleStringProperty,则只需在关闭子窗口时设置该属性的值,即可将更新通知父窗口

我制作了一个小的父/子示例来测试这个概念,相关的代码如下,放在子创建方法上:

FXMLLoader loader = new FXMLLoader(getClass().getResource("Child.fxml"));
Parent root = loader.load();
ChildController controller = loader.getController();
name.textProperty().bind(controller.name.textProperty());
字段名是父字段中的标签,子字段中的文本字段。子文本中的任何更改都会立即反映在父文本中


这是一个有趣的话题。我将制作一个完整的示例,并尽快在我的中发布ir。

如果使用popup,您可以将方法设置为showandwait,而不是仅从Stage对象显示,然后运行更新GUI的方法。由于showandwait方法在弹出窗口运行时暂停主帧,因此一旦弹出窗口关闭,它将运行更新代码

stage.showAndWait();
updateGUI();
我们认为我们有两个阶段(窗口),一个父阶段,两个子窗口(弹出窗口)

  • 首先将父阶段的阶段对象发送给子阶段

  • 儿童舞台布景:

    childStage.setOnHidden(事件->{
    父根=FXMLLoader.load(getClass().getResource(父fxml));
    场景=新场景(根);
    parentStage.SetScene(场景);
    parentStage.show();


  • `

    当然没有,你应该用你的代码替换我的注释来刷新窗口内容。当然我添加了刷新方法,而不是你的注释我添加了
    refresh();
    不起作用,我添加了一个简单的
    System.out.println(“关闭窗口”);
    也不起作用,
    mytextArea.setText(“测试”);
    也不起作用…更新:如果我从右上角的红色x按钮关闭子窗口;
    setOnCloseRequest()
    起作用,但与
    stage.close()不起作用;
    这是一个小技巧。使用
    childStage.setOnHidden(…)
    ,每当窗口被隐藏时都会触发(无论如何),而不是
    childStage.setOnCloseRequest(..)
    ,后者是(例如,通过按下操作系统的“关闭”按钮)。更好的是,按照Antonio的回答,使用JavaFX属性并将标签等绑定到它们。我同意你@James_D,我在我的回答中加入了你的评论。当然,在现实生活中,你不应该像那样从你的控制器公开UI控件。你可以让你的控制器共享一个模型实例,并在t中绑定到/观察/修改属性模型。参见,例如。更好的管理方法是使用DI框架将模型注入控制器:就是为此而设计的。是的,我同意。请记住,这只是一个非常简单的示例,可以看到它的工作情况。在任何实际应用程序中,都不应该到处都有公开UI控件的公共字段。
    stage.showAndWait();
    updateGUI();