首页 > 解决方案 > java - 如何在Java中使用观察者模式来检测Java列表中的变化?

问题描述

我想检测我的 ArrayList 的变化myList。每次我从 ArrayList 添加、删除或更新任何内容时。我想通知用户。我已经使用了以下代码。setValues当函数用于设置列表时,它会通知用户。有没有其他方法可以实现它,以便每次我更改列表用户都会收到通知?谢谢你。

// observable class which will contain my List. 
package com.psl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Observable;

public class MyList extends Observable{

      private List<Map<String,Object>> values;    
    public List<Map<String, Object>> getValues() {
        return values;
    }

    public void setValues(List<Map<String, Object>> values) {

        if(getValues()==null && values!=null){

            setChanged();
            notifyObservers();
        }

        else if( !this.values.equals(values)){
            setChanged();
            notifyObservers();
        }

        this.values = values;
    }

    public static void main(String[] args) {

        MyList myList = new MyList();
        List<Map<String, Object>> values = new ArrayList<Map<String, Object>>();
        Notify notify = new Notify();
        myList.addObserver(notify);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("string_value", null);
        myList.setValues(values);                       
    }


}
// Observer which will notify user when list is updated. 

package com.psl;

import java.util.Observable;
import java.util.Observer;

public class Notify implements Observer{

    @Override
    public void update(Observable o, Object arg) {
            System.out.println("List has been changed");                
    }

}

标签: javaarraylist

解决方案


JavaFX 有 ObservableList 的实现,也许你可以使用它:

javafx.collections.ObservableList a = javafx.collections.FXCollections.observableArrayList();
a.addListener(new javafx.collections.ListChangeListener<String>() {
    @Override
    public void onChanged(Change<? extends String> c) {
        System.out.println(c);
    }});

a.add("aa");
a.add("bb");

推荐阅读