1 回答

TA贡献1886条经验 获得超2个赞
单个更改可以负责修改一系列值(您可以通过检查from和的to属性来确定Change)。通常ObservableLists 尝试触发尽可能少的部分更改,为了清楚起见,这是一个删除更改,其中单个部分的from值为 0,to值等于调用之前的列表大小clear()。
触发的确切更改取决于ObservableList实现,但可用的实现ObservableListBase在分组修改方面做得很好。此类是所ObservableList使用的许多实现的超类。
在标准实现中很少会触发单个事件中的多部分更改ObservableList,但retainAll可以做到这一点(感谢@kleopatra 提到这一点):
ObservableList<Integer> ol = FXCollections.observableArrayList();
for (int i = 0; i < 10; i++) {
ol.add(i);
}
ol.addListener((ListChangeListener.Change<? extends Integer> event) -> {
System.out.println("new change----------------------------------------------");
while(event.next()) {
System.out.println("Added:" + event.wasAdded());
System.out.println("Permutated:" + event.wasPermutated());
System.out.println("Removed:" + event.wasRemoved());
System.out.println("Replaced:" + event.wasReplaced());
System.out.println("Updated:" + event.wasUpdated());
}
});
ol.retainAll(1, 3, 5, 7, 9);
输出:
new change----------------------------------------------
Added:false
Permutated:false
Removed:true
Replaced:false
Updated:false
Added:false
Permutated:false
Removed:true
Replaced:false
Updated:false
Added:false
Permutated:false
Removed:true
Replaced:false
Updated:false
Added:false
Permutated:false
Removed:true
Replaced:false
Updated:false
Added:false
Permutated:false
Removed:true
Replaced:false
Updated:false
任何ObservableList实现都可以定义新的操作,这些操作分组执行多个更改,从而导致侦听器的单个通知。实现这一点的最简单方法是使用ObservableListBase'sbeginChange和endChange方法:
class Ol extends ModifiableObservableListBase<Integer> {
private final List<Integer> list = new ArrayList<>(Arrays.asList(2, 4, 6, 8));
@Override
public Integer get(int index) {
return list.get(index);
}
@Override
public int size() {
return list.size();
}
@Override
protected void doAdd(int index, Integer element) {
list.add(index, element);
}
@Override
protected Integer doSet(int index, Integer element) {
return list.set(index, element);
}
@Override
protected Integer doRemove(int index) {
return list.remove(index);
}
public void modify() {
if (size() < 4) {
throw new IllegalStateException();
}
beginChange();
set(0, 3);
set(3, 7);
endChange();
}
}
modify()如果成功,则触发 2 次替换更改。
添加回答
举报