我想将舞台的宽度和高度绑定在一起,因此用户只能通过保持宽高比来调整其大小。这不起作用:
stage.widthProperty().bind(stage.heightProperty());
还有另一种方法:
stage.minHeightProperty().bind(scene.widthProperty().multiply(1.3));
stage.maxHeightProperty().bind(scene.widthProperty().multiply(1.3));
但是以这种方式,我仅设置宽度值。我该如何解决?
谢谢,Tibor
由于width
和height
属性是只读的,因此您无法将它们绑定到任何东西,更不用说彼此了。它们为只读的原因是documented:
Stage
的许多属性都是只读的,因为它们可以由基础平台在外部进行更改,因此它们不可绑定[因为无法设置绑定属性]。
width
和height
属性在其文档中都有相似的语句。
您仍然可以为每个属性添加一个侦听器,并且当一个属性更改时,将另一个属性设置为新值。为确保这不会导致StackOverflowError
,您必须跟踪当前是否在侦听器中设置该值。例如:
// not actually "binding" in the context of Property.bind(...)
public static void bindWidthAndHeightTogether(Window window) {
ChangeListener<Number> listener =
new ChangeListener<>() {
private boolean changing;
@Override
public void changed(ObservableValue<? extends Number> obs, Number ov, Number nv) {
if (!changing) {
changing = true;
try {
if (obs == window.widthProperty()) {
window.setHeight(nv.doubleValue());
} else {
window.setWidth(nv.doubleValue());
}
} finally {
changing = false;
}
}
}
};
window.widthProperty().addListener(listener);
window.heightProperty().addListener(listener);
}
以上内容在使用JavaFX 14的Windows 10上为我工作。请注意,这会阻止窗口正常最大化,但无法全屏显示(至少在Windows 10上如此。)>