如何在JavaFX中绑定舞台的宽度和高度?

问题描述 投票:-1回答:1

我想将舞台的宽度和高度绑定在一起,因此用户只能通过保持宽高比来调整其大小。这不起作用:

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

还有另一种方法:

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

但是以这种方式,我仅设置宽度值。我该如何解决?

谢谢,Tibor

java javafx bind stage
1个回答
0
投票

由于widthheight属性是只读的,因此您无法将它们绑定到任何东西,更不用说彼此了。它们为只读的原因是documented

Stage的许多属性都是只读的,因为它们可以由基础平台在外部进行更改,因此它们不可绑定[因为无法设置绑定属性]。

widthheight属性在其文档中都有相似的语句。

您仍然可以为每个属性添加一个侦听器,并且当一个属性更改时,将另一个属性设置为新值。为确保这不会导致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上如此。)>

© www.soinside.com 2019 - 2024. All rights reserved.