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

Posted

技术标签:

【中文标题】如何监视 ObservableList JavaFX 中包含的对象的更改【英文标题】:How to monitor changes on objects contained in an ObservableList JavaFX 【发布时间】:2015-01-06 10:12:21 【问题描述】:

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

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

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

谢谢

【问题讨论】:

Java 8: Observable List - Invalidation Listener nor Change Listener is called in case of property change的可能重复 另见这篇博文:Properties Extractor: Best way to get the ListView instantly updating its elements 【参考方案1】:

如果您想监控列表内对象的变化而不是列表本身,那么您必须将侦听器附加到列表的对象而不是列表。

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

改为查看ObservableValue 接口。实现此接口的对象支持您正在寻找的这种监视。 ObservableValue 的 javadoc 页面列出了所有实现此接口的 JavaFX 内置类(列表非常冗长)。

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

【讨论】:

已有 API 用于执行此操作:请参阅 ***.com/questions/26730034/…【参考方案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() 时)。此外,如果您将事件打印出来,您会得到一个字符串,该字符串可以准确地告诉您发生了什么。您错误地认为它对整个列表进行了更改!

【讨论】:

我对这个答案有一些问题。首先,c 不是一个事件,它是一个Change(这是一个很好的描述性名称,为什么不使用它呢?)。其次,Changenot 和索引。它不是一,也不代表一。它确实发生在一个索引上。如果你解决了这个问题,我会撤回我的反对票并删除我的评论。确保在 cmets 中 @ 提及我 根本不回答这个问题:是关于在修改包含元素的属性时收到通知,而不是在修改列表时收到通知

以上是关于如何监视 ObservableList JavaFX 中包含的对象的更改的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX,将 ArrayList 转换为 ObservableList

如何向combobox java添加监听器

如何使用windows性能监视器监控磁盘性能

监视器的sync接口如何使用

如何将 JavaFX 11 项目导出到 Jar 中?

在VS2010里如何在分步执行时,监视变量当前的值