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

时间:2015-04-05 17:19:24

标签: java javafx-8

要监听ObservableList我在监听器中使用以下代码:

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

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

java.lang.IllegalStateException: Invalid Change state: next() must be called before inspecting the Change.

我应该在循环之前拨打next()吗?但这与ListChangeListener javadoc getList() getAddedSubList()任何时候应该有效的陈述相矛盾,getList()只是{{1}}表达的捷径。

2 个答案:

答案 0 :(得分:4)

对于无法由ListChangeListener.Change.getXXX()方法的单组结果表示的单个事件,可能会触发更改事件。 (例如,如果在某些情况下在可观察列表上调用setAll(...)。)要考虑此类更改,您必须迭代“更改表示”的集合,获取每个更改的信息。正确使用的习语是

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

答案 1 :(得分:0)

  

重要提示:在调用any之前调用next()方法是必要的   其他改变方法。调用reset()后也是如此。该   只有在任何时候都可以使用的方法是getList()。

所以是的,它必须被称为:

  

这实际上是c.getList()。subList(c.getFrom()的快捷方式,   c.getTo());

它还会调用c.getFrom()c.getTo()