如何正确地向Map.Entry添加值更改侦听器?

炸弹炸弹

目前正在执行的项目要求我确保在遍历地图的条目时,如果调用Entry.setValue,则将触发值更改事件。我看到我可以尝试在.put方法的Map类扩展中添加侦听器。我的问题是,更改条目会触发地图的put方法中的侦听器吗?还是会被迫扩展Map.Entry类并将侦听器逻辑粘贴到其setValue方法中?

如果这个问题是愚蠢的,请事先道歉-以这种方式使用Maps是新手,到目前为止,许多信息ive仅导致扩展Map本身,这似乎最简单,但我不知道它是否可以涵盖我的情况。

WJS

您可以在紧急情况下使用PropertyChangeSupport该类。这使得管理propertyChanges非常容易。这里没有太多要说的。想要侦听更改的各方将其侦听器注册到地图。然后,当映射修改该值时,支持将向所有侦听器触发一个事件。在Event类中返回的值可以更改为选择的值。

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.HashMap;

public class PropertyChangeDemo implements PropertyChangeListener {
    
    public static void main(String[] args) {
        // leave static context of main
        new PropertyChangeDemo().start();
    }
    public void start() {
        MyMap<String,Integer> map = new MyMap<>();
        map.addMapListener(this);
        map.put("B",20);
        map.put("B",99);
        map.put("A",44);
        
        map.entrySet().forEach(System.out::println);
    }

版画

source = map
oldValue = null
newValue = 20
source = map
oldValue = 20
newValue = 99
source = map
oldValue = null
newValue = 44
A=44
B=99

一个听众进行示范。

    public void propertyChange(PropertyChangeEvent pce) {
        System.out.println("source = " + pce.getPropertyName());
        System.out.println("oldValue = " + pce.getOldValue());
        System.out.println("newValue = " + pce.getNewValue());
    }
    
}

修改后的类

class MyMap<K,V> extends HashMap<K,V> {
        
    private PropertyChangeSupport ps = new PropertyChangeSupport(this);

    // method to add listener
    public void addMapListener(PropertyChangeListener pcl) {
        ps.addPropertyChangeListener(pcl);
    }
    
    @Override 
     public V put(K key, V value) {
        V ret = super.put(key,value);
        ps.firePropertyChange("map", ret, value);
        return ret;
    }
}   

注意:此简单解决方案可能遗漏了一些问题。测试应在投入生产之前进行。首先,有很多不同的方法来设置Entry's值。这仅put在由用户或由地图本身间接调用时才执行

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何正确地向QListWidgets添加字符串?

如何正确地向TypeScript添加带参数的回调类型?

如何正确地向Django用户模型添加权限?

如何正确地向新创建的组织添加个人回购

如何正确地向已经存在的树添加分支

Sprite不能正确地向播放器旋转如何解决此问题?

如何使用值更改侦听器更改JSF页面中的语言环境?

更改时如何为jtexfield添加侦听器?

如何更轻松、更正确地向索引添加附加条件以使代码更简单和覆盖?

jQuery:如何将侦听器放在Angular表带上的datetimepicker值更改?

如何正确地将更改推送到Heroku

如何正确地为此添加校验和标头?

如何正确地将UITextField添加到UITableViewCell

如何正确地通过引用传递迭代器?

正确添加ajax内容的侦听器

正确地向python matplotlib colorbar添加第二组刻度

如何正确地向另一个自定义控件添加一个自定义控件,使其以表格形式呈现?

Firestore 侦听器在向列表添加新项目时触发两项更改

如何向 React 组件添加事件侦听器?

如何向 ReactJs 中的对象数组添加侦听器

如何使用 React 将事件侦听器“更改时”添加到输入元素?

有没有一种方法可以更改Java属性而不会向其侦听器触发值更改事件?

如何将键侦听器更改为鼠标侦听器

在Javascript中向对象添加事件侦听器

向帧中的光标侦听器添加延迟

向推入数组的 DOM 元素添加事件侦听器

无法向 webNavigation.onCompleted 添加事件侦听器

我无法向对象添加事件侦听器

添加或删除 ViewTreeObserver 侦听器的正确位置是什么?