Java ObservableList:如何可靠地检测setAll?

Java ObservableList:如何可靠地检测setAll?,java,javafx,javafx-8,observablelist,Java,Javafx,Javafx 8,Observablelist,在某些情况下,有必要检测-在ListChangeListener中,没有对列表本身的控制-一个“所有数据交换出去”,即f.i.当我们需要清除一些状态(如选择)时,在完全新的数据上,旧的状态是没有意义的 完全新的数据可以通过 list.setAll(…) 如果列表是ListProperty,则设置(otherObservableList) 考虑可以在setAll上触发哪种类型的更改(c是更改,items是观察到的列表,用于计算子更改的“subChangeCount”伪代码): 这似乎允许进行如

在某些情况下,有必要检测-在ListChangeListener中,没有对列表本身的控制-一个“所有数据交换出去”,即f.i.当我们需要清除一些状态(如选择)时,在完全新的数据上,旧的状态是没有意义的

完全新的数据可以通过

  • list.setAll(…)
  • 如果列表是ListProperty,则设置(otherObservableList)
考虑可以在setAll上触发哪种类型的更改(c是更改,items是观察到的列表,用于计算子更改的“subChangeCount”伪代码):

这似乎允许进行如下实用程序检查:

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;
}