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());
});
等等
我是 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());
});
等等