JavaFX widthProperty 不刷新

标签 java user-interface layout properties javafx

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

相关文章:

python - 面向仅使用过控制台的学生的 GUI 入门

c++ - 在 Windows (Vista) 上使用 C++、Qt 的 GUI 设计问题

Java 函数从 C++ 代码 Eclipse jni 获取结果

java - 意外字符 ('F' (代码 70)) : expected a valid value (number, 字符串、数组、对象、 'true' 、 'false' 或 'null' ) 这是什么意思?

java - JPanel 中 JLabel 的间距问题

objective-c - 从 C++ 循环启动 Cocoa GUI 并传递引用

java - 分析内存时使用哪个 GC?

html - Div 没有获取其父级的完整高度(使用 `vh` 统一)?

ruby-on-rails - 初始化会破坏rails中的布局设置吗?

html - 为什么这个 html/css/rails 模板没有正确嵌套?