ChangeListener ObservableMap" oldValue"是newValue的副本

时间:2018-02-16 22:20:57

标签: java javafx

问题:为什么用" oldValue"调用ChangeListener ObservableMap? newValue的副本?


    import javafx.beans.property.SimpleMapProperty;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableMap;

    public class ObservableMapExample {

        SimpleMapProperty map;

        class MyChangeListener implements ChangeListener> {
            @Override
            public void changed(ObservableValue> changed,
                    ObservableMap oldValue, ObservableMap  newValue) {
                System.out.println("changed "+changed+" old:"+oldValue+" new:"+newValue);
            }

        }

        ObservableMapExample() {
            map = new SimpleMapProperty();
            map.setValue(new SimpleMapProperty(FXCollections.observableHashMap()));
            map.addListener(new MyChangeListener());
            map.put("a", "1");
            map.put("b", "2");
            map.put("b", "3");

        }

        public static void main(String[] args) {
            System.out.println("ObservableMapExample");
            new ObservableMapExample();

        }
    }

输出:

ObservableMapExample
changed MapProperty [value: MapProperty [value: {a=1}]] old:MapProperty [value: {a=1}] new:MapProperty [value: {a=1}]
changed MapProperty [value: MapProperty [value: {a=1, b=2}]] old:MapProperty [value: {a=1, b=2}] new:MapProperty [value: {a=1, b=2}]
changed MapProperty [value: MapProperty [value: {a=1, b=3}]] old:MapProperty [value: {a=1, b=3}] new:MapProperty [value: {a=1, b=3}]

1 个答案:

答案 0 :(得分:0)

因为值本身不会更改,所以它与您在添加键值对之前设置的SimpleMapProperty相同。

如果您单步执行代码,则会在com.sun.javafx.binding.MapExpressionHelper中找到这段代码:

@Override
protected void fireValueChangedEvent(MapChangeListener.Change<? extends K, ? extends V> change) {
    listener.changed(observable, currentValue, currentValue);
}

ChangeListener只能通知您地图已更改,但无法告诉您更改的内容,因为该值是地图。

如果您使用新的setValue对象再次致电SimpleMapProperty,您会发现ChangeListener确实为oldValuenewValue获取了不同的对象,因为现在价值本身已经改变(不仅仅是修改过)。