问题:为什么使用“ 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
确实为oldValue
和newValue
获取了不同的对象,因为现在值本身已更改(而不仅仅是修改) 。