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

标签 java javafx javafx-8

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

相关文章:

java - 在 JPA 中注释包含非实体类的 Map

java - 如何在Java中将二进制数组成的字符串转换为十六进制数?

JavaFX TabPane 选项卡不更新位置

javafx - JavaFX 中的堆叠图表

JavaFX 8 : setting style for inner VBox doesn't apply

java - 需要有关 java 游戏循环的解释

java - 根据表结构在运行时动态创建 CRUD 表单

JavaFX FXML Controller - 构造函数与初始化方法

Java 服务器在使用 Javafx 单击按钮时停止

JavaFX 8 按钮单击显示其他场景