【问题标题】:ChangeListener ObservableMap "oldValue" is copy of newValueChangeListener ObservableMap "oldValue" 是 newValue 的副本
【发布时间】:2018-07-27 21:18:19
【问题描述】:

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

导入 javafx.beans.property.SimpleMapProperty; 导入 javafx.beans.value.ChangeListener; 导入 javafx.beans.value.ObservableValue; 导入 javafx.collections.FXCollections; 导入 javafx.collections.ObservableMap; 公共类 ObservableMapExample { SimpleMap 属性图; 类 MyChangeListener 实现 ChangeListener> { @覆盖 公共无效更改(ObservableValue> 更改, ObservableMap oldValue, ObservableMap newValue) { System.out.println("改变了"+changed+" old:"+oldValue+" new:"+newValue); } } ObservableMapExample() { 地图 = 新的 SimpleMapProperty(); map.setValue(new SimpleMapProperty(FXCollections.observableHashMap())); map.addListener(new MyChangeListener()); map.put("a", "1"); map.put("b", "2"); map.put("b", "3"); } 公共静态无效主要(字符串[]参数){ System.out.println("ObservableMapExample"); 新的 ObservableMapExample(); } }

输出:

ObservableMap示例 更改 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 }]

【问题讨论】:

  • 它不是用旧值的副本调用的:它是用oldValue == newValue 调用的。如果这是预期的行为,我在 javadocs 中找不到任何信息,因为它没有定义更改属性值的含义。如果这意味着发生了某些事件,其效果是该事件之前的属性值的副本将不再被视为等于新值,那么观察到的行为确实是正确的......

标签: java javafx


【解决方案1】:

因为值本身没有变化,所以和你在添加键值对之前设置的SimpleMapProperty是一样的。

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

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

ChangeListener 只能告诉你地图发生了变化,但不能告诉你发生了什么变化,因为值就是地图。

如果您再次使用新的SimpleMapProperty 对象调用setValue,您将看到您的ChangeListener 确实为oldValue 和newValue 获得了不同的对象,因为现在值本身已经改变(不是刚刚修改)。

【讨论】:

    猜你喜欢
    • 2015-08-02
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多