当前位置: 首页 > 知识库问答 >
问题:

ChangeListener观察地图"oldValue"是newValue的副本

司空思聪
2023-03-14

问题:为什么用“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个答案

拓拔俊艾
2023-03-14

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

如果您单步浏览代码,您将在com中找到这段代码。太阳javafx。结合MapExpressionHelper

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

ChangeListener只能通知您映射已更改,但不能告诉您更改了什么,因为值就是映射。

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

 类似资料:
  • 问题:为什么用“oldValue”调用ChangeListener ObservableMap是NewValue的副本? 输出:

  • 本文向大家介绍深入理解vue.js中$watch的oldvalue与newValue,包括了深入理解vue.js中$watch的oldvalue与newValue的使用技巧和注意事项,需要的朋友参考一下 $watch中的oldvalue和newValue 大家都知道,在vue.js中给我们提供了$watch的方法来做对象变化的监听,而且在callback中会返回两个对象,分别是oldValue和n

  • 我想知道是否可以使用来填充?我使用了而不是,因为我需要经常添加和删除,所以我需要最小化成本。 我的hashMap使用一个大整数作为键字段,一个具有许多属性的类型作为值字段。在我的tableView中,我只想显示每个属性都有一列的值。我希望你说清楚了 谢谢

  • 嗨,我有collectionView,在我的自定义单元格中有一个radioButton。我在我的集合视图的cellforAt函数中分配了cell.radioButton.tag=indexPath.Row。然后,我创建了一个属性观察器,如下所示。我点击了不同的数据,但是oldValue用相同的值打印。(你可以在照片中看到我点击了shooter和strategy。)

  • 跳过值无效时: 问题:和是,因此无法正确重写。 问题:如何获得不执行检查的类型? 这个问题和这个问题有关。

  • 问题内容: 我一直在阅读Observer模式,以保持UI处于最新状态,但仍然看不到它的用途。即使在我的特定对象中通知了我的MainActivity然后运行update();方法我仍然无法使用Pet对象来获取更新值,因为该对象是在Oncreate中创建的…而我只是无法创建新对象,因为那时变量会有所不同..这是我的实施,它似乎不起作用。 观察者/ MainActivity 可观察/宠物 问题答案: 首