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

时间:2017-11-15 22:54:59

标签: java javafx event-handling javafx-8

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

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

我怎样才能在之前获得舞台的界限?这是否可以使用当前的API?

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

3 个答案:

答案 0 :(得分:1)

当我们按下按钮以最大化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));
});

答案 1 :(得分:1)

我遇到了同样的问题。问题是 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();
}

答案 2 :(得分:0)

嗯,阿拉斯泰尔没错。

javaFX Stage有一个youtubevideos = new Vector<>(); //Load video list youtubevideos.add(new Youtubevideo("My video link here")); 和一个widthProperty(继承自heightProperty的getter和Setters。 您可以向两个属性注册Window,并在监听器捕获事件时保护其状态。

ChangeListener Doc

height- and widthproperty docs in Window.