如果使用 foreach 迭代 JavaFX 中的 Change,在哪里调用 next()?

Suz*_*ioc 3 java javafx-8

要收听,ObservableList我在侦听器中使用以下代码:

@Override
public void onChanged(ListChangeListener.Change<? extends MyClass> c) {
    for(MyClass s : c.getAddedSubList()) {
        // process s
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我得到了很多例外:

java.lang.IllegalStateException: Invalid Change state: next() must be called before inspecting the Change.
Run Code Online (Sandbox Code Playgroud)

我应该next()在循环之前打电话吗?但这与ListChangeListenerjavadoc所说的“getList()应该在任何时候都有效”的说法相矛盾,这getAddedSubList()只是getList()表达的捷径。

Jam*_*s_D 5

对于不能由方法的单个结果集表示的单个事件,可能会触发更改事件ListChangeListener.Change.getXXX()。(例如,setAll(...)在某些情况下,如果您调用observable 列表。)为了说明此类更改,您必须遍历“更改表示”的集合,获取其中每个的信息。正确使用的习语是

@Override
public void onChanged(ListChangeListener.Change<? extends MyClass> c) {
    while (c.next()) {
        if (c.wasAdded()) {
            for(MyClass s : c.getAddedSubList()) {
                // process s
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)