我希望在用户最大化之前获取/记住Stage
的边界。我注意到我可以将事件处理程序添加到舞台的最大化属性中,但它对我没有帮助。此时此阶段已经最大化,getX()
或getWidth()
已经在舞台最大化后报告了位置或大小。
myStage.maximizedProperty().addListener((observable, oldValue, newValue) -> {
double x = myStage.getX(); // already too late, x has changed
...
我怎样才能在之前获得舞台的界限?这是否可以使用当前的API?
PS:更大的目标是记住舞台的位置,状态和屏幕。如果用户定位舞台,最大化它,退出应用程序,然后重新启动它,那么我希望舞台的位置与用户退出应用程序之前的位置相同。这意味着我需要将新舞台首先定位在之前的未最大化位置,然后将其最大化,以恢复之前的状态。但是在最大化这种接缝之前不知道尺寸是不可能的。
答案 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
,并在监听器捕获事件时保护其状态。