Java ObservableList:如何可靠地检测setAll?
在某些情况下,有必要检测-在ListChangeListener中,没有对列表本身的控制-一个“所有数据交换出去”,即f.i.当我们需要清除一些状态(如选择)时,在完全新的数据上,旧的状态是没有意义的 完全新的数据可以通过Java ObservableList:如何可靠地检测setAll?,java,javafx,javafx-8,observablelist,Java,Javafx,Javafx 8,Observablelist,在某些情况下,有必要检测-在ListChangeListener中,没有对列表本身的控制-一个“所有数据交换出去”,即f.i.当我们需要清除一些状态(如选择)时,在完全新的数据上,旧的状态是没有意义的 完全新的数据可以通过 list.setAll(…) 如果列表是ListProperty,则设置(otherObservableList) 考虑可以在setAll上触发哪种类型的更改(c是更改,items是观察到的列表,用于计算子更改的“subChangeCount”伪代码): 这似乎允许进行如
- list.setAll(…)
- 如果列表是ListProperty,则设置(otherObservableList)
boolean wasSetOrClearedAll(Change c) {
if (c.getList().isEmpty()) return true;
c.next();
if (c.getAddedSize() == c.getList().size()) return true;
return false;
}
相反,在收听ComboBox“项目”时,内部外汇代码f.i.:
while (c.next()) {
comboBox.wasSetAllCalled = comboBox.previousItemCount == c.getRemovedSize();
...
}
comboBox.previousItemCount = getItemCount();
存储旧的itemCount,并将其与当前removedSize进行比较(我对此感到不舒服,旧的状态对我的口味来说太过陈旧),但是我很有可能在我的方法中遗漏了一些东西
问题是:
在哪种情况下,我的实用方法会失败(核心方法会正确地检测setAll)?不幸的是,在监听器端没有可靠的方法来检测这一点 斗争从默认实现开始,主要如下所示:
@Override
public boolean setAll(Collection<? extends E> col) {
beginChange();
try {
clear();
addAll(col);
} finally {
endChange();
}
return true;
}
@覆盖
公共布尔setAll(collectionObservableList的具体类型是什么?看起来ListProperty是一个抽象类,它没有声明setAll(…)@zeki-hmm.。所有ObservableList都必须有一个setAll(T…item)-当然,可能不受支持,所以请选择任何实现了它的类(ListProperty没有什么特别的,它只是路由其支持列表的setAll)在这种情况下,您可以扩展ListProperty并让setAll在调用超级方法之前触发一个事件吗?@Zeki-hmm..看起来我的问题不太清楚(明天将尝试改写:-)-我的观点是,如果从听者的角度来看,只是看到更改而对发送者没有任何控制。@downvoter-需要解释吗?啊哈…甚至没有考虑核心实现;-)很好的论点,谢谢!clear/setAll保持不变就足够了-基本上我需要一些方法来可靠地丢弃所有与旧项相关的状态(没有对项目的引用,只引用它们以前的位置)。嗯…回到thinkingAnd ListChangeListener.Change.getRemoved()/getFrom()/getTo()对于清理来说还不够好?嗯..如果我遵循selectionModels的核心实现就不行了。不过,这些都是错误。可能需要从头开始思考,也许setAll毕竟不是这样一个特例:-)
@Override
public boolean setAll(Collection<? extends E> col) {
beginChange();
try {
clear();
addAll(col);
} finally {
endChange();
}
return true;
}