繁体   English   中英

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

[英]How to refresh parent window after closing child window in JavaFX?

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

FirsName:约翰

名字:布朗

年龄:18

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

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

James_D的答案(更好)

感谢@James_D ,您应该使用setOnHidden而不是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中进行自动字段更新的最佳方法是使用属性。 如果父窗口中的名称字段绑定到SimpleStringProperty,则只需在子窗口关闭时设置属性的值,以通知父窗口更新。

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

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

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

这是一个有趣的话题。 我将尽快制作一个完整的例子并在我的“一杯java”博客中发布。

如果使用弹出窗口,则可以将方法设置为showandwait,而不是仅从Stage对象中显示,并在运行更新GUI的方法之后。 因为showandwait方法在弹出窗口运行时暂停主框架,所以一旦弹出窗口关闭,它将运行您的更新代码。

stage.showAndWait();
updateGUI();

我们认为我们有两个阶段(窗口),1个父级阶段,2个子窗口(弹出窗口)

  1. 首先将父级的阶段对象发送到子阶段

  2. 在儿童舞台集:

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

`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM