JavaFX width/height 属性只触发一次

JavaFX width/height properties fire only once

我是 JavaFX 的新手,我正在尝试监视 window 上的调整大小事件,以便我可以触发布局的重新计算。

如果我创建一个舞台并像下面的示例那样设置场景,我只会触发每个调整大小事件一次。无论我调整多少次 window.

Stage stage = new Stage();
stage.setScene(someScene);
stage.setTitle("Some Title");
stage.initModality(Modality.APPLICATION_MODAL);
stage.show();
stage.widthProperty().addListener(observable -> {
    System.out.println("Width changed");
});
stage.heightProperty().addListener(observable -> {
    System.out.println("Height changed");
});

第一注:

I'm trying to monitor the resize events on a window so that I can trigger a recalculation of the layout.

这几乎可以肯定是错误的做法。当舞台和场景改变大小时,将自动触发布局重新计算。如果您使用标准布局窗格,则无需注册侦听器。如果你真的需要一个自定义布局(这不太可能),你应该子类化 Pane 并覆盖 layoutChildren() (和其他适当的方法)以连接到相同的布局系统。

但是,为了解释您所观察到的内容:

您正在为每个 属性 注册一个 InvalidationListener,当 属性 从有效状态变为无效状态时,它会收到通知。

无效状态只有在您实际请求 属性 的值(例如 stage.getWidth())时才会再次有效。由于您从不这样做,因此 属性 永远不会变为有效,因此永远不会再次从有效变为无效。

相反,为每个 属性:

注册一个 ChangeListener
stage.widthProperty().addListener((observable, oldWidth, newWidth) -> {
    System.out.println("Width changed");
});
stage.heightProperty().addListener((observable, oldHeight, newHeight) -> {
    System.out.println("Height changed");
});

或者,您可以通过请求值来强制验证(尽管我认为上面的更改侦听器实际上达到了您正在尝试做的事情):

stage.widthProperty().addListener(observable -> {
    System.out.println("Width changed: "+stage.getWidth());
});

等等