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

Ana*_*kie 3 java javafx fxml

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

姓名:约翰

姓氏:布朗

年龄:18

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

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

Eri*_*ric 5

James_D 的答案(更好)

感谢@James_D,您应该使用setOnHidden而不是setOnCloseRequest,这样您就可以再次调用.close()并调用EventHandlerwill 。


我的答案

你可以利用setOnCloseRequest

childStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    public void handle(WindowEvent we) {
        // Refresh the parent window here
    }
});
Run Code Online (Sandbox Code Playgroud)

要在子表单上调用此关闭请求,您可以执行以下操作:

    childStage.getOnCloseRequest().handle(new WindowEvent(childStage, WindowEvent.WINDOW_CLOSE_REQUEST));
    // or
    childStage.fireEvent(new WindowEvent(childStage, WindowEvent.WINDOW_CLOSE_REQUEST));
Run Code Online (Sandbox Code Playgroud)

所以你可以像这样在子舞台上实现关闭按钮:

Button closeButton = new Button("Close");
closeButton.setOnAction(event -> childStage.fireEvent(new WindowEvent(childStage, WindowEvent.WINDOW_CLOSE_REQUEST)));
Run Code Online (Sandbox Code Playgroud)

  • 这有点像黑客。使用 `childStage.setOnHidden(...)`,它会在窗口隐藏时(无论如何)触发,而不是 `childStage.setOnCloseRequest(....)`,后者 [仅由操作系统级别触发请求关闭窗口](http://docs.oracle.com/javase/8/javafx/api/javafx/stage/Window.html#onCloseRequestProperty)(例如通过按下操作系统的“关闭”按钮)。更好的是,按照 Antonio 的回答中的建议,使用 JavaFX 属性并将您的标签等绑定到它们。 (2认同)

Ant*_*oso 5

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

我做了一个小的父/子示例来测试这个概念,相关的一段代码是这样的,放在子创建方法上:

FXMLLoader loader = new FXMLLoader(getClass().getResource("Child.fxml"));
Parent root = loader.load();
ChildController controller = loader.getController();
name.textProperty().bind(controller.name.textProperty());
Run Code Online (Sandbox Code Playgroud)

字段名称是父项中的 Label 和子项中的 TextField。子文本中的任何更改都会立即反映在父文本中。

这是一个有趣的话题。我会尽快做一个完整的例子并在我的“a cup of java”博客中发布ir 。