ReadOnlyStringWrapper.ReadOnlyPropertyImpl从何处获取ChangeListener的oldValue?

时间:2019-01-27 09:16:36

标签: java javafx

我正在研究JavaFX11的ReadOnlyStringWrapper.ReadOnlyPropertyImpl类,即:

private class ReadOnlyPropertyImpl extends ReadOnlyStringPropertyBase {

    @Override
    public String get() {
        return ReadOnlyStringWrapper.this.get();
    }

    @Override
    public Object getBean() {
        return ReadOnlyStringWrapper.this.getBean();
    }

    @Override
    public String getName() {
        return ReadOnlyStringWrapper.this.getName();
    }
};

ReadOnlyPropertyImpl的实例将返回给可以在read only模式下使用的客户端。我无法理解的是ReadOnlyPropertyImploldValue换成ChangeListener的地方。如我们所见,它仅覆盖get方法的当前值,该方法是从包装器获取的。谁能解释?

1 个答案:

答案 0 :(得分:3)

当前值存储在用于事件处理的帮助器类中,请参见com.sun.javafx.binding.ExpressionHelper。例如。如果您看一下SingleChange静态内部类中的具体实现:

private T currentValue;

...

@Override
protected void fireValueChangedEvent() {
    final T oldValue = currentValue;
    currentValue = observable.getValue();

    ...
    listener.changed(observable, oldValue, currentValue);
    ...
}

Generic,另一个用于处理变更事件的类也具有类似的实现。

添加侦听器将导致创建ExpressionHelper实例(或对现有实例进行修改),并且此对象负责调用事件处理程序。 (ExpressionHandler存储在属性对象的字段中,在这种情况下,存储在ReadOnlyStringPropertyBase的{​​{1}}字段中。)