gpt4 book ai didi

java - ObservableList:如何可靠地检测 setAll?

转载 作者:太空狗 更新时间:2023-10-29 22:35:48 25 4
gpt4 key购买 nike

在某些情况下,有必要检测 - 在 ListChangeListener 中,不控制列表本身 - “所有数据已换出”,f.i.当我们需要清除某些状态(如选择)时——对于全新的数据,旧状态毫无意义。

可以通过以下方式获取全新的数据

  • list.setAll(...)
  • list.set(otherObservableList) 如果列表是一个 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;
}

相比之下,内部外汇代码,f.i.在听 ComboBox 的项目时:

while (c.next()) {
comboBox.wasSetAllCalled = comboBox.previousItemCount == c.getRemovedSize();
...
}
comboBox.previousItemCount = getItemCount();

存储旧的 itemCount 并将其与当前的 removedSize 进行比较(我对此感到不舒服,旧状态对我来说太过陈旧了),但是我的方法很可能遗漏了一些东西。

问题是:

我的实用程序方法在哪种情况下会失败(核心方法会正确检测到 setAll)?

最佳答案

不幸的是,没有可靠的方法可以在 Listener 端检测到这一点。

斗争从默认实现开始,它大部分看起来像这样:

@Override
public boolean setAll(Collection<? extends E> col) {
beginChange();
try {
clear();
addAll(col);
} finally {
endChange();
}
return true;
}

如果将空集合传递给 setAll,则结果和触发的事件都与调用 clear 时完全相同。

因此,当 clear 被调用时,您的方法 wasSetOrClearedAll 也返回 true(与核心实现一样)。

所以最后没有setAll的通用检测,这完全取决于您的用例。如果您可以缩小您尝试检测的范围,您可以为此编写一个过滤器。

关于java - ObservableList:如何可靠地检测 setAll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26994886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com