问题:为什么用" 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}]
答案 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
确实为oldValue
和newValue
获取了不同的对象,因为现在价值本身已经改变(不仅仅是修改过)。