gpt4 book ai didi

JavaFX - 将子阶段居中到父阶段

转载 作者:搜寻专家 更新时间:2023-10-31 19:37:10 24 4
gpt4 key购买 nike

我是 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com