如何在JavaFX中监听舞台的调整大小事件?

26

我希望在表单(或者不管是Scene还是Stage)缩放事件上执行一些功能。

但是如何在JavaFX中检测到表单的缩放事件呢?

3个回答

55
您可以监听StagewidthPropertyheightProperty的变化:
stage.widthProperty().addListener((obs, oldVal, newVal) -> {
     // Do whatever you want
});

stage.heightProperty().addListener((obs, oldVal, newVal) -> {
     // Do whatever you want
});

注意:要监听宽度和高度的变化,可以非常简单地使用同一个侦听器:


ChangeListener<Number> stageSizeListener = (observable, oldValue, newValue) ->
    System.out.println("Height: " + stage.getHeight() + " Width: " + stage.getWidth());

stage.widthProperty().addListener(stageSizeListener);
stage.heightProperty().addListener(stageSizeListener); 

我正在尝试像这里建议的那样在stageSizeListener中获取窗格大小。它可以工作,但是会出现错误。似乎我的窗格大小在触发stage监听器后被重新调整了。这会导致我的全屏大小和反向大小颠倒。非常糟糕。如果我缓慢调整大小,看起来还不错,但是当我快速调整大小时就不行了。 - urkon
3
这样会调用"随你便"两次,有更优雅的方式吗? - Thomas
理论上可以构建一个更改缓冲区,并仅在达到某个阈值后处理它,就像在文本区域中输入并且只有在“停止”输入时才触发更改事件一样。构建通用的DelayedChangeListener甚至会非常简单。 - DVarga
我可以让这段代码在舞台上运行,但我不明白如何在堆栈中捕获它。或者即使你能。例如,如果您在舞台上检测到变化,我是否必须在场景上触发事件,然后将其上移?假设Stage->Scene->vbox->vbox2->node。我该如何在vbox2中过滤对舞台的更改? - Dave

3
保持固定的宽高比例:
stage.minHeightProperty().bind(stage.widthProperty().multiply(0.5));
stage.maxHeightProperty().bind(stage.widthProperty().multiply(0.5));

0

长话短说:

container.widthProperty().addListener(new ChangeListener<Number>() {
        @Override
        public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
            if (newValue.floatValue()!=oldValue.floatValue()) resizeKids(newValue);
        }
    });

同时您可能需要检查新的宽度/高度和旧值以避免重复


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接