代码之家  ›  专栏  ›  技术社区  ›  Pavel_K

readOnlyStringWrapper.readOnlyPropertyImpl从何处获取ChangeListener的oldValue?

  •  0
  • Pavel_K  · 技术社区  · 6 年前

    我在学习 ReadOnlyStringWrapper.ReadOnlyPropertyImpl javafx11的类,即:

    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 模式。我不明白的是 只读属性impl 将采取 oldValue 对于 ChangeListener . 正如我们看到的,它只覆盖 get 方法获取当前值,该值来自包装器。有人能解释一下吗?

    1 回复  |  直到 6 年前
        1
  •  3
  •   fabian    6 年前

    当前值存储在用于事件处理的帮助程序类中,请参见 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 实例(或对现有实例的修改)和此对象负责调用事件处理程序。(The ExpressionHandler 存储在属性对象的字段中,在本例中 ReadOnlyStringPropertyBase helper 字段)