如何在 JavaFX 中监听 Stage 的 resize 事件?

Posted

技术标签:

【中文标题】如何在 JavaFX 中监听 Stage 的 resize 事件?【英文标题】:How to listen resize event of Stage in JavaFX? 【发布时间】:2016-11-08 01:09:35 【问题描述】:

我想对表单的 resize 事件执行一些功能(或 SceneStage 不管它是什么)。

但是如何在 JavaFX 中检测表单的调整大小事件?

【问题讨论】:

【参考方案1】:

你可以听听widthPropertyStageheightProperty的变化:

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 上的窗格大小,就像这里建议的那样。它有效,但有错误。触发舞台侦听器后,似乎我的窗格大小已调整大小。这会在全屏和反转时反转我的尺寸。真的很糟糕。如果我慢慢调整大小,它看起来不错,但是当我快速调整大小时就不行了。 这会调用两次“随心所欲”,有没有更优雅的方式? 理论上可以构建一个更改缓冲区并仅在某个阈值之后对其进行处理,这与您在文本区域中键入时的方式相同,并且仅当您“停止”键入时才会触发更改事件.构建一个通用的 DelayedChangeListener 甚至会非常简单。 我可以让这段代码在舞台上工作,但我不明白如何将它赶上堆栈。或者即使你可以。例如,如果你检测到舞台上的变化,我是否必须在场景中触发一个事件,然后向上堆栈?假设舞台 -> 场景 -> vbox -> vbox2 -> 节点。如何在 vbox2 中过滤以了解阶段的更改?【参考方案2】:

保持固定的宽高比:

stage.minHeightProperty().bind(stage.widthProperty().multiply(0.5));
stage.maxHeightProperty().bind(stage.widthProperty().multiply(0.5));

【讨论】:

【参考方案3】:

长话短说:

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);
        
    );

您可能还想用旧值检查新的宽度/高度,以防止重复

【讨论】:

以上是关于如何在 JavaFX 中监听 Stage 的 resize 事件?的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听

JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听

如何在 JavaFX 中获取 Stage 的窗口句柄 (hWnd)?

JavaFX:如何在初始化期间从控制器获取阶段?

如何在javafx中定位窗口舞台?

在 JavaFX 的舞台上设置图标