我有一个显示人的父窗口,即:
FirsName:John
姓氏:布朗
年龄:18
我单击编辑按钮,子窗口打开,更改名字然后单击接受,子窗口关闭,更改在mysql数据库中保存,但父窗口仍显示旧值。我有一个可用的刷新方法,但是如何从子窗口调用它或将其设置为在关闭子窗口后调用?
父窗口和子窗口都有控制器和fxml。任何帮助将不胜感激。
答案 0 :(得分:4)
感谢 @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个子窗口(弹出窗口)
首先将父级的舞台对象发送到子级
:
childStage.setOnHidden(event->{
Parent root=FXMLLoader.load(getClass().getResource(parent fxml));
Scene scene=new Scene(root);
parentStage.SetScene(scene);
parentStage.show();
`