Java 在ObservableList中编辑多个元素,并且仅在上次更改后激发更改侦听器
我有一个ObservableList,它不仅在添加或删除元素时触发已注册的ListChangeListeners,而且在这些元素中的特定可观察属性发生更改时也会触发ListChangeListeners,例如人员列表,当人员的地址发生更改时,ListChangeListeners会触发。Java 在ObservableList中编辑多个元素,并且仅在上次更改后激发更改侦听器,java,javafx,observable,Java,Javafx,Observable,我有一个ObservableList,它不仅在添加或删除元素时触发已注册的ListChangeListeners,而且在这些元素中的特定可观察属性发生更改时也会触发ListChangeListeners,例如人员列表,当人员的地址发生更改时,ListChangeListeners会触发。 如何编辑多个人的地址,并让侦听器对所有更改一起只触发一次?observeList默认情况下不提供此功能。如果您进行扩展,则可以使外部代码可以访问它的beginChange()和endChange()功能 尽管该
如何编辑多个人的地址,并让侦听器对所有更改一起只触发一次?
observeList
默认情况下不提供此功能。如果您进行扩展,则可以使外部代码可以访问它的beginChange()
和endChange()
功能
尽管该类使用正确,但您需要小心。如果您没有执行相同数量的beginChange
和endChange
调用,则侦听器可能根本不会收到任何更新
以下代码不包含任何有关更新更改的实现。这件事由你决定。在调用beginChange
和endChange
之间,需要使用nextUpdate
。如果希望使用提取器功能,则可能需要向doXyz
方法添加附加功能以添加侦听器
public class BulkEditObservableList<T> extends ModifiableObservableListBase<T> {
private final List<T> backingList;
public BulkEditObservableList(List<T> backingList) {
if (backingList == null) {
throw new IllegalArgumentException();
}
this.backingList = backingList;
}
public BulkEditObservableList() {
this(new ArrayList<>());
}
@Override
public T get(int index) {
return backingList.get(index);
}
@Override
public int size() {
return backingList.size();
}
@Override
protected void doAdd(int index, T element) {
backingList.add(index, element);
}
@Override
protected T doSet(int index, T element) {
return backingList.set(index, element);
}
@Override
protected T doRemove(int index) {
return backingList.remove(index);
}
public void beginBulkChange() {
beginChange();
}
public void endBulkChange() {
endChange();
}
}
observeList
默认情况下不提供此功能。如果您进行扩展,则可以使外部代码可以访问它的beginChange()
和endChange()
功能
尽管该类使用正确,但您需要小心。如果您没有执行相同数量的beginChange
和endChange
调用,则侦听器可能根本不会收到任何更新
以下代码不包含任何有关更新更改的实现。这件事由你决定。在调用beginChange
和endChange
之间,需要使用nextUpdate
。如果希望使用提取器功能,则可能需要向doXyz
方法添加附加功能以添加侦听器
public class BulkEditObservableList<T> extends ModifiableObservableListBase<T> {
private final List<T> backingList;
public BulkEditObservableList(List<T> backingList) {
if (backingList == null) {
throw new IllegalArgumentException();
}
this.backingList = backingList;
}
public BulkEditObservableList() {
this(new ArrayList<>());
}
@Override
public T get(int index) {
return backingList.get(index);
}
@Override
public int size() {
return backingList.size();
}
@Override
protected void doAdd(int index, T element) {
backingList.add(index, element);
}
@Override
protected T doSet(int index, T element) {
return backingList.set(index, element);
}
@Override
protected T doRemove(int index) {
return backingList.remove(index);
}
public void beginBulkChange() {
beginChange();
}
public void endBulkChange() {
endChange();
}
}
这不是
可观察列表
的工作方式,但是您是否尝试将元素的副本中间存储在不同的列表中,在那里更改它们,然后执行addAll
?非常难看,但可能已经足够了…类ListChangeListener.Change
提供了一个选项来检查更新的元素(请参见wasUpdated()
)。在这种情况下,getFrom()
和getTo()
将指定更新元素的间隔。所以你说,尽管ListChangeListener框架支持这些更改,但没有支持多个更新的ObservableList实现?是的,当然-并非所有可以支持的都得到了支持(甚至花了数年时间才获得对单个项的属性更改通知的基本支持)要么接受它,要么自己动手,这并不难:看看ObservableListBase及其Sub的实现。忘记:在野外有支持延迟/摘要通知的库,f.i.reactfx(虽然不知道其当前状态)删除所有注册的侦听器,执行批量更改,在最后一次静默更改后添加注册的侦听器。这不是ObservableList
的工作方式,但是您是否尝试将元素的副本中间存储在不同的列表中,在那里更改它们,然后执行addAll
?非常难看,但可能已经足够了…类ListChangeListener.Change
提供了一个选项来检查更新的元素(请参见wasUpdated()
)。在这种情况下,getFrom()
和getTo()
将指定更新元素的间隔。所以你说,尽管ListChangeListener框架支持这些更改,但没有支持多个更新的ObservableList实现?是的,当然-并非所有可以支持的都得到了支持(甚至花了数年时间才获得对单个项的属性更改通知的基本支持)要么接受它,要么自己动手,这并不难:看看ObservableListBase及其Sub的实现。忘记:有一些库支持延迟/摘要通知,f.i.reactfx(虽然不知道其当前状态)删除所有注册的侦听器,执行批量更改,在最后一次静默更改之后添加注册的侦听器。