JavaFX - 属性“无效”的含义

Posted

技术标签:

【中文标题】JavaFX - 属性“无效”的含义【英文标题】:JavaFX - meaning of property "invalid" 【发布时间】:2015-03-28 01:57:02 【问题描述】:

在 JavaFX 的上下文中,属性在什么意义上在更改时“无效”?我不明白使用这个词的原因。

JavaFX 属性是一个可观察并包装字段值的对象。所以当属性更新或变为无效时,它的侦听器/观察者会收到通知。这是什么意思?

【问题讨论】:

这里是 JavaFX 2 属性和绑定实现的前首席开发人员的blog on changes versus invalidations。 【参考方案1】:

我在这里找到了很好的解释。

当调用 intProperty.set(7168) 时,它会触发一个失效事件 到其他财产。收到此失效事件后, otherProperty 只是记下它的值是 no 有效期更长。它不会立即重新计算其 通过查询 intProperty 的值来获取值。重新计算是 稍后在调用 otherProperty.get() 时执行。想象一下,如果 在上面的代码中只调用一次 intProperty.set() 我们调用 intProperty.set() 多次; otherProperty 仍然重新计算其 值只有一次。

经过测试,我找到了这个例子。

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;

public class InvalidMean
    public static void main(String[] args)
        IntegerProperty num1 = new SimpleIntegerProperty(15);
        IntegerProperty num2 = new SimpleIntegerProperty(10);
        // num2.bind(num1);
        // num1.set(56);
        System.out.println(num2);
    

运行这段代码你会得到这个输出:

IntegerProperty [value: 10]

现在从注释行中删除注释。你会得到这个输出。

IntegerProperty [bound, invalid]

num2 的值无效,因为新值到达但尚未更新。正如JavaFX Doc 描述的那样,只是因为懒惰的评估。

JavaFX 绑定和属性实现都支持惰性 评估,这意味着当发生变化时,该值不 立即重新计算。重新计算会在以后发生,如果并且当 随后请求值。

如果您希望该值应该是有效的,请调用num2.getValue();num2.get();System.out.println(num2); 之前,您将看到属性将是有效的。

注意:在上面的示例中,num2.bind(num1);num1.set(56); 都会使 num2 的值无效,因为 bind 已经更改了 num2 的值,set() 也试图更改该值。

【讨论】:

【参考方案2】:

这都是关于惰性评估的。这个video Devoxx 2011 的一次会议对我理解这个概念很有帮助。

对你来说有趣的东西从 ~5:00 开始。

【讨论】:

@UnKnown 找不到视频了,抱歉。 @Spotted 没问题。如果您愿意,我还会添加对此问题的答案,如果我错了,请告诉我。谢谢。

以上是关于JavaFX - 属性“无效”的含义的主要内容,如果未能解决你的问题,请参考以下文章

javafx的鼠标事件对于带有透明的图片在部分区域无效

在 JavaFX 的舞台上设置图标

JavaFX 项目的有效 JAR 签名

无效的列索引,使用 PreparedStatement 更新

将布尔(Property)绑定到JavaFX中的List操作

android:layout_margin真实含义 及 自己定义复合控件 layout()运行无效的问题解决