【问题标题】:How to monitor changes on objects contained in an ObservableList JavaFX如何监视 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 list javafx java-8


【解决方案1】:

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

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

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

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

【讨论】:

【解决方案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 中 @ 提及我
  • 根本不回答这个问题:是关于在修改包含元素的属性时收到通知,而不是在修改列表时收到通知
猜你喜欢
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 2010-11-19
  • 2013-12-28
  • 2017-08-10
相关资源
最近更新 更多