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

时间:2016-01-04 12:06:38

标签: java javafx fxml

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

FirsName:John

姓氏:布朗

年龄:18

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

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

4 个答案:

答案 0 :(得分:4)

James_D&#39>答案(更好)

感谢 @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)));

答案 1 :(得分:4)

我认为在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());

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

这是一个有趣的话题。我将尽快制作一个完整的例子并在我的'a cup of java' blog中发布。

答案 2 :(得分:3)

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

stage.showAndWait();
updateGUI();

答案 3 :(得分:0)

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

  1. 首先将父级的舞台对象发送到子级

  2. 在子阶段集中
  3. childStage.setOnHidden(event->{ Parent root=FXMLLoader.load(getClass().getResource(parent fxml)); Scene scene=new Scene(root); parentStage.SetScene(scene); parentStage.show();

  4. `