我是JavaFX的新手,我在设置新窗口的位置时遇到问题,与父窗口位置有关 . 我想在父窗口的中心打开新窗口 .
我试过这两种方式:
1)初始所有者 - 我认为init所有者将在父母的中心打开我的窗口,但事实并非如此
FXMLLoader fxmlLoader = new FXMLLoader(AddUserController.class.getResource("/view/addUserStage.fxml"));
Parent root = fxmlLoader.load();
Stage stage = new Stage();
stage.initOwner(parentStage);
stage.showAndWait();
2)当窗口显示时重新定位 - 它工作但是在显示窗口后我可以看到它的第一个位置然后我看到它被移动到新的计算位置 . 我不能接受 .
FXMLLoader fxmlLoader = new FXMLLoader(AddUserController.class.getResource("/view/addUserStage.fxml"));
Parent root = fxmlLoader.load();
Stage stage = new Stage();
stage.initOwner(parentStage);
stage.setOnShown(event -> controller.onWindowShown());
stage.showAndWait();
在onWindowShown函数中,我正在设置窗口的新X和Y位置,因为只有在显示窗口的宽度和高度之后,我才能轻松计算新位置 .
如何在showAndWait函数之前将子窗口位置设置在父窗口的中心?
3 回答
如果要显示
Stage
,则必须将从FXML文件加载的内容放入Scene
,并且Scene
将设置为Scene
.不幸的是
Stage
的大小在呈现之前是未知的(如你所提到的),但要将其重新定位到父级的中心Stage
,你必须知道大小 .一个可行的技巧是在显示之前hide
Stage
,重新定位它,然后在新位置再次make it visible .Example
正如另一个答案所正确指出的那样,JavaFX会在显示窗口时计算舞台宽度和高度 . onShowing()属性在计算发生之前调用,并且在窗口设置为可见之前调用,因此将stage.hide()命令放在那里实际上什么都不做 . 正如问题所述,在窗口重新定位之前看到屏幕上的一个短片是一个不太理想的结果 .
我找到解决这个问题的唯一方法(尽管我很想知道是否存在更好的方法)是将监听器添加到舞台的宽度和高度属性中,然后让它们触发事件来改变窗口的位置 . 然后,一旦窗口可见,请删除监听器 .
例如:
您可以在显示
Stage
之前布置Scene
并根据Scene
大小确定位置 . 然而,这不会考虑窗户装饰,所以位置可能稍微偏离,除非你有一个具有相同装饰的窗口,以考虑这些装饰的大小: