Как связать ширину и высоту сцены в JavaFX? - PullRequest
0 голосов
/ 16 марта 2020

Я хочу связать ширину и высоту сцены, чтобы пользователь мог изменить ее размер только, сохранив соотношение сторон.
Это не работает:

stage.widthProperty().bind(stage.heightProperty());  

Есть еще один способ:

stage.minHeightProperty().bind(scene.widthProperty().multiply(1.3));  
stage.maxHeightProperty().bind(scene.widthProperty().multiply(1.3));  

Но таким образом я устанавливаю только значение ширины.
Как я могу решить эту проблему?

Спасибо,
Тибор

1 Ответ

2 голосов
/ 16 марта 2020

Поскольку свойства 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).

...