我正在开发一个 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/