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


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

    公共类ObservableMapExample {

        SimpleMapProperty地图;

        MyChangeListener类实现ChangeListener> {
            @Override
            公共无效已更改(ObservableValue>已更改,
                    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”);

        }

        公共静态void main(String [] args){
            System.out.println(“ ObservableMapExample”);
            新的ObservableMapExample();

        }
    }



输出:

ObservableMapExample
已更改MapProperty [值:MapProperty [值:{a = 1}]]旧:MapProperty [值:{a = 1}]新:MapProperty [值:{a = 1}]
已更改MapProperty [值:MapProperty [值:{a = 1,b = 2}]]旧:MapProperty [值:{a = 1,b = 2}]新:MapProperty [值:{a = 1,b = 2 }]
已更改MapProperty [值:MapProperty [值:{a = 1,b = 3}]]旧:MapProperty [值:{a = 1,b = 3}]新:MapProperty [值:{a = 1,b = 3 }]

最佳答案

由于值本身不会改变,因此它与添加键值对之前设置的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获取了不同的对象,因为现在值本身已更改(而不仅仅是修改) 。

08-04 16:29