gpt4 book ai didi

JavaFX widthProperty 不刷新

转载 作者:行者123 更新时间:2023-12-01 11:22:47 25 4
gpt4 key购买 nike

我正在开发一个 javaFX 项目,在该项目中我需要精确控制 Node 的大小。我的代码当前在需要时正确更新 prefWidthProperty,并且最小和最大尺寸设置为使用 pref 尺寸,但 widthProperty 没有更新。

我已经通过添加为属性监听器的打印语句验证了这一点。 PrefWidthProperty 更新,widthProperty 不更新(直到我单击节点,可能会获得焦点?)

我尝试请求其自身及其父级的布局(与焦点相同),但没有成功。

我目前不知道如何修复这个非常烦人的错误。看来目前一切总是落后 1 个布局 channel 。

用于设置大小并检查更改的代码:

//Set the size
this.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
this.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
this.prefWidthProperty().bind(getTotalWidthProperty());

public ObservableValue<? extends Number> getTotalWidthProperty() {
return rightArgument.layoutXProperty().add(rightArgument.translateXProperty()).add(rightArgument.widthProperty()).add(H_GAP);
}

//Check for change:
this.prefWidthProperty().addListener(p -> System.out.println("FB_Pref_"+System.currentTimeMillis() + " " + this.getPrefWidth()));
this.widthProperty().addListener(p -> System.out.println("FB______"+System.currentTimeMillis() + " " + this.getWidth()));

如前所述,FB_Pref 按时正确打印,FB_____ 打印得太晚了。

最佳答案

如果将 min/max 设置为 pref,这将创建一个固定大小的节点。最小/最大/首选尺寸将包含在第一个布局阶段。宽度“属性”反射(reflect)了节点上当前设置的宽度。因此,如果您不更改宽度,您的监听器将永远不会收到事件。您可以使用 getWidth sysout 宽度,这始终返回当前宽度。

JavaFX 中有两种类型的监听器:更改监听器和失效监听器。您添加了带有 lambda 的失效监听器。这个仅在需要时触发,而不是仅在重新布局时每次更改时触发。在这里查看更多信息:http://docs.oracle.com/javase/8/javafx/properties-binding-tutorial/binding.htm#sthref12

只需尝试一下这个:

this.prefWidthProperty().addListener(
(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {
System.out.println("FB_Pref_" + System.currentTimeMillis() + " " + this.getPrefWidth());
});

this.widthProperty().addListener(
(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {
System.out.println("FB______" + System.currentTimeMillis() + " " + this.getWidth())
});

关于JavaFX widthProperty 不刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31052912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com