ObservableList:如何可靠地检测一个集合全部?
2022-09-02 22:38:54
在某些情况下,有必要在ListChangeListener中检测“所有数据都已交换”,例如,当我们需要清除某些状态(如选择)时,在全新的数据上,旧状态是没有意义的。
通过以下方式可以访问全新的数据
- list.setAll(...)
- list.set(otherObservableList) if list is a ListProperty
考虑哪种类型的更改可以在 setAll 上触发(c 是更改,items 是观察到的列表,“subChangeCount”伪代码用于计算子更改):
// initially empty
assertEquals(0, items.size());
items.setAll(1, 2, 4);
assertEquals(1, c.subChangeCount());
assertTrue(c.wasAdded() && !c.wasReplaced());
assertEquals(0, c.getFrom());
assertEquals(c.getList().size(), c.getAddedSize());
// initially not empty
assertTrue(items.size() > 0);
items.setAll(1, 2, 4);
assertEquals(1, c.subChangeCount());
assertTrue(c.wasReplaced());
assertEquals(0, c.getFrom());
assertEquals(c.getList().size(), c.getAddedSize());
这似乎允许进行实用程序检查,例如:
boolean wasSetOrClearedAll(Change c) {
if (c.getList().isEmpty()) return true;
c.next();
if (c.getAddedSize() == c.getList().size()) return true;
return false;
}
相比之下,内部fx代码,f.i.在听ComboBox的项目时:
while (c.next()) {
comboBox.wasSetAllCalled = comboBox.previousItemCount == c.getRemovedSize();
...
}
comboBox.previousItemCount = getItemCount();
存储旧的 itemCount 并将其与当前的 removeedSize 进行比较(我对此感到不舒服,旧状态对于我的口味来说太频繁了),但是我很有可能在我的方法中遗漏了一些东西。
问题是:
在哪种情况下,我的效用方法会失败(核心方法会正确检测集合)?