我是 JavaFX 的新手,我在设置与父窗口位置相关的新窗口位置时遇到问题。我想在父窗口的中心打开新窗口。
我尝试了这两种方式:
1) Init owner - 我以为 init owner 会在父级的中心打开我的窗口,但事实并非如此
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 函数之前将子窗口位置设置在父窗口的中心?
最佳答案
正如其他答案正确指出的那样,JavaFX 在显示窗口时计算舞台宽度和高度。 onShowing() 属性在计算发生之前和窗口设置为可见之前被调用,因此在此处放置 stage.hide() 命令实际上什么都不做。正如问题所述,在重新定位窗口之前在屏幕上看到一个光点是一个不太理想的结果。
我发现解决这个问题的唯一方法(虽然我很想知道是否存在更好的方法)是将监听器添加到舞台的宽度和高度属性,并让它们触发事件以更改窗口的位置。然后,一旦窗口可见,就移除监听器。
例如:
//Let's say we want to center the new window in the parent window
ChangeListener<Number> widthListener = (observable, oldValue, newValue) -> {
double stageWidth = newValue.doubleValue();
stage.setX(parentStage.getX() + parentStage.getWidth() / 2 - stageWidth / 2);
};
ChangeListener<Number> heightListener = (observable, oldValue, newValue) -> {
double stageHeight = newValue.doubleValue();
stage.setY(parentStage.getY() + parentStage.getHeight() / 2 - stageHeight / 2);
};
stage.widthProperty().addListener(widthListener);
stage.heightProperty().addListener(heightListener);
//Once the window is visible, remove the listeners
stage.setOnShown(e -> {
stage.widthProperty().removeListener(widthListener);
stage.heightProperty().removeListener(heightListener);
});
stage.show();
关于JavaFX - 将子阶段居中到父阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40104688/