我想在用户最大化之前获取/记住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
注册到这两个属性,并在侦听器捕获事件时保护其状态。
更改侦听器文档
高度和宽度属性文档在窗口中。