gpt4 book ai didi

java - ChangeListener ObservableMap "oldValue"是 newValue 的副本

转载 作者:太空宇宙 更新时间:2023-11-04 10:42:24 26 4
gpt4 key购买 nike

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

    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();        }    }

输出:

ObservableMapExamplechanged 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}]

最佳答案

由于值本身不会改变,因此它与您在添加键值对之前设置的 SimpleMapProperty 相同。

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

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

ChangeListener只能通知你 map 发生了变化,但它不能告诉你发生了什么变化,因为值就是 map 。

但是,如果您使用新的 SimpleMapProperty 对象再次调用 setValue,您将看到您的 ChangeListener 确实为 oldValuenewValue 获取了不同的对象,因为现在值本身已更改(而不仅仅是修改)。

关于java - ChangeListener ObservableMap "oldValue"是 newValue 的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48835665/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com