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