2015-04-05 72 views
1

要收聽ObservableList我使用監聽器下面的代碼:如果使用foreach進行迭代,在哪裏調用next()JavaFX中的更改?

@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()表達式的快捷方式。

回答

0

重要提示:在調用任何 其他變更方法之前,需要調用next()方法。調用reset()後同樣適用。只有在任何時候工作的方法都是getList()。

所以,是的,它被稱爲,如:。

這實際上是一個快捷方式到c.getList()子列表(c.getFrom(), c.getTo()) ;

它還調用c.getFrom()c.getTo()

3

對於無法用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 
      } 
     } 
    } 
} 
+0

想知道,如果你的意思的removeAll爲不相交的子改變的例子:SETALL觸發一次更換(如舊/新內容不爲空),或添加/如果任老刪除/新內容爲空。或者我可能會錯過一些東西,並渴望瞭解我忽略的東西:-) – kleopatra 2015-04-06 08:42:46

+0

是的,'removeAll(...)'是一個更好的例子。我在想'FXCollections.observableList(「A」,「B」,「C」)。setAll(「1」,「B」,「2」);'可以傳播多個子變化;它可以,但它不(在當前的實施中)。 – 2015-04-06 12:43:33

+0

ahh謝謝,......查看你的意思:如果新內容在同一位置包含舊元素,則不會觸發? – kleopatra 2015-04-06 14:10:48

相關問題