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

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

 ObservableList myList = FXCollections.observableArrayList(); myList.add(someStuff); myList.addListener((ListChangeListener.Change 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.lang.Object不支持此function。

而是看一下ObservableValue接口。 实现此接口的对象支持您正在寻找的这种监视。 ObservableValue的javadoc页面列出了实现此接口的所有JavaFX内置类(列表非常looooong)。

您必须使用其中任何一个,或者您必须自己实现界面。 并将更改侦听器添加到对象而不是列表中。

 public static void main(String[] args) { ArrayList intList = new ArrayList(); intList.add(0); intList.add(1); ObservableList ob = FXCollections.observableArrayList(intList); ob.addListener(new ListChangeListener() { @Override public void onChanged(javafx.collections.ListChangeListener.Change c) { System.out.println("Changed on " + c); if(c.next()){ System.out.println(c.getFrom()); } } }); ob.set(0, 1); } 

事件(在我的情况下是c)是发生更改的索引(当你执行.getFrom()时)。 此外,如果你打印出事件,你会得到一个字符串,告诉你究竟发生了什么。 你错误地解释它在整个列表上做了改变!