Поскольку свойства width
и height
доступны только для чтения, вы не можете связать их ни с чем, не говоря уже друг о друге. Причина, по которой они доступны только для чтения, задокументирована :
Многие из свойств Stage
доступны только для чтения, поскольку они могут изменяться извне базовой платформой и поэтому не должны быть привязываемым [потому что связанные свойства не могут быть установлены].
Оба свойства width
и height
имеют аналогичные утверждения в своей документации.
Вы все еще можете добавить слушателя в каждое свойство и, когда одно свойство изменяется, установите другое свойство на новое значение. Чтобы убедиться, что это не приведет к StackOverflowError
, вам нужно будет отследить, устанавливаете ли вы в данный момент значение в слушателе. Например:
// not actually "binding" in the context of Property.bind(...)
public static void bindWidthAndHeightTogether(Window window, double widthToHeightRatio) {
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() / widthToHeightRatio);
} else {
window.setWidth(nv.doubleValue() * widthToHeightRatio);
}
} finally {
changing = false;
}
}
}
};
window.widthProperty().addListener(listener);
window.heightProperty().addListener(listener);
}
Вышеописанное сработало для меня на Windows 10 с использованием JavaFX 14. Обратите внимание, что это препятствует тому, чтобы окно максимизировалось должным образом, но не переходило в полноэкранный режим (по крайней мере, на Windows 10).