如何监视 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
(这是一个很好的描述性名称,为什么不使用它呢?)。其次,Change
是 not 和索引。它不是一,也不代表一。它确实发生在一个索引上。如果你解决了这个问题,我会撤回我的反对票并删除我的评论。确保在 cmets 中 @ 提及我
根本不回答这个问题:是关于在修改包含元素的属性时收到通知,而不是在修改列表时收到通知以上是关于如何监视 ObservableList JavaFX 中包含的对象的更改的主要内容,如果未能解决你的问题,请参考以下文章