如何监视 ObservableList JavaFX 中包含的对象的更改

2022-09-03 07:50:01

我真的很难理解 ObservableList 对象在 JavaFX 中是如何工作的。我想监视 中的对象是否已被修改。到目前为止,我只看到我可以监视,作为实体本身,是否已被修改...但不是 :ListListList

ObservableList<Stuff> myList = FXCollections.<Stuff>observableArrayList();
myList.add(someStuff);

myList.addListener((ListChangeListener.Change<? extends Stuff> change) -> {
    while(change.next()){
        if(change.wasUpdated()){
            System.out.println("Update detected");
        }
        else if(change.wasPermutated()){

        }
        else{
            for (Stuff remitem : change.getRemoved()) {
                //do things
            }
            for (Stuff additem : change.getAddedSubList()) {
                //do things
            }
        }
    }
});
someStuff.setThing("clobber"); // trigger listener

有没有办法做到这一点?我正在寻找一个工作流,以便对对象的修改触发对列表→修改,→刷新某些视图。

谢谢


答案 1

如果要监视列表内对象的更改而不是列表本身,则必须将侦听器附加到列表的对象而不是列表。

当然,为了能够做到这一点,对象必须支持这一点。 不支持此操作。java.lang.Object

相反,请查看 ObservableValue 接口。实现此接口的对象支持您要查找的这种监视。javadoc页面列出了实现此接口的所有JavaFX内置类(该列表非常令人沮丧)。ObservableValue

要么你必须使用其中任何一个,要么你必须自己实现接口。并将更改侦听器添加到对象而不是列表中。


答案 2
public static void main(String[] args) {
    ArrayList<Integer> intList = new ArrayList();
    intList.add(0);
    intList.add(1);

    ObservableList<Integer> ob = FXCollections.observableArrayList(intList);
    ob.addListener(new ListChangeListener<Integer>() {
        @Override
        public void onChanged(javafx.collections.ListChangeListener.Change<? extends Integer> c) {
            System.out.println("Changed on " + c);
            if(c.next()){
                System.out.println(c.getFrom());
            }

        }

    });

    ob.set(0, 1);
}

事件(在我的例子中为c)是发生更改的索引(当您执行.getFrom()时)。此外,如果将事件打印出来,则会收到一个字符串,告诉您确切发生了什么。您错误地将其解释为整个列表上正在进行更改!