JavaFX:在最大化之前获取阶段的边界



我想在用户最大化之前获取/记住Stage的边界。我注意到我可以将事件处理程序添加到阶段的最大化属性中,但这对我没有帮助。此时阶段已最大化,getX()getWidth()在最大化阶段后已报告位置或大小。

myStage.maximizedProperty().addListener((observable, oldValue, newValue) -> {
    double x = myStage.getX(); // already too late, x has changed
    ...

如何在舞台大小发生变化之前获得舞台的边界?使用当前的 API 甚至可能做到这一点吗?

PS:更大的目标是记住舞台的位置、状态和屏幕。如果用户定位舞台,最大化它,退出应用程序,然后再次重新启动它,那么我希望舞台的位置与用户退出应用程序之前一样。这意味着我需要首先将新阶段定位在先前未最大化的位置,然后将其最大化,以恢复以前的状态。但是在最大化这个接缝之前不知道尺寸是不可能的。

当我们按下按钮以最大化 JavaFX 窗口时,首先将阶段最大化,然后更新其宽度和高度的属性。因此,只有在没有最大化的情况下,才应记住舞台的尺寸。

例如,在我们的项目中,我们将舞台尺寸保存在配置文件中,也遇到了类似的问题。解决方案如下:

stage.widthProperty().addListener((obs, oldVal, newVal) -> {
    if (!stage.isMaximized()) {
        config.setWidth(newVal.intValue());
    }
});
stage.heightProperty().addListener((obs, oldVal, newVal) -> {
    if (!stage.isMaximized()) {
        config.setHeight(newVal.intValue());
    }
});
stage.maximizedProperty().addListener((obs, oldVal, newVal) -> {
    config.setMaximized(newVal));
});

我遇到了同样的问题。 问题是 X 和 Y 属性是在最大化标志之前设置的,因此在最大化时,XY 将用于最大化窗口。

对我来说,解决方案是保存 X 和 Y 的旧值,并在窗口最大化时恢复它们。

private Integer stageWidth;
private Integer stageHeight;
private Integer stageX;
private Integer stageY;
private boolean isMaximized = false;
//this values will hold the x and y before maximized
private Integer oldStageX;
private Integer oldStageY;
public void setupStageListeners(Stage stage) {
    stage.heightProperty().addListener((obs, oldVal, newVal) -> {
        if (!isMaximized) {
            stageHeight = newVal.intValue();
        }
    });
    stage.widthProperty().addListener((obs, oldVal, newVal) -> {
        if (!isMaximized) {
            stageWidth = newVal.intValue();
        }
    });
    stage.xProperty().addListener((obs, oldVal, newVal) -> {
        if (!stage.isMaximized()) {
            stageX = newVal.intValue();
            //save old value in case of maximizing
            oldStageX = oldVal.intValue();
        }
    });
    stage.yProperty().addListener((obs, oldVal, newVal) -> {
        if (!isMaximized) {
            stageY = newVal.intValue();
            oldStageY = oldVal.intValue();
        }
    });
    stage.maximizedProperty().addListener((obs, oldVal, newVal) -> {
        isMaximized = newVal;
        //if maximized save the X and Y old values
        if(isMaximized) {
            stageX = oldStageX;
            stageY = oldStageY;
        }
    });
}

public void saveWindowState() {
    properties.setProperty(STAGE_WIDTH, String.valueOf(stageWidth));
    properties.setProperty(STAGE_HEIGHT, String.valueOf(stageHeight));
    properties.setProperty(STAGE_X, String.valueOf(stageX));
    properties.setProperty(STAGE_Y, String.valueOf(stageY));
    properties.setProperty(IS_MAXIMIZED, String.valueOf(isMaximized));
    savePropertiesFile();
}

好吧,阿拉斯泰尔并没有错。

javaFX Stage 有一个widthProperty和一个heightProperty(继承自 Window getter 和 Setters(。可以将ChangeListener注册到这两个属性,并在侦听器捕获事件时保护其状态。

更改侦听器文档

高度和宽度属性文档在窗口中。

相关内容

  • 没有找到相关文章

最新更新