Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在ObservableList中编辑多个元素,并且仅在上次更改后激发更改侦听器_Java_Javafx_Observable - Fatal编程技术网

Java 在ObservableList中编辑多个元素,并且仅在上次更改后激发更改侦听器

Java 在ObservableList中编辑多个元素,并且仅在上次更改后激发更改侦听器,java,javafx,observable,Java,Javafx,Observable,我有一个ObservableList,它不仅在添加或删除元素时触发已注册的ListChangeListeners,而且在这些元素中的特定可观察属性发生更改时也会触发ListChangeListeners,例如人员列表,当人员的地址发生更改时,ListChangeListeners会触发。 如何编辑多个人的地址,并让侦听器对所有更改一起只触发一次?observeList默认情况下不提供此功能。如果您进行扩展,则可以使外部代码可以访问它的beginChange()和endChange()功能 尽管该

我有一个ObservableList,它不仅在添加或删除元素时触发已注册的ListChangeListeners,而且在这些元素中的特定可观察属性发生更改时也会触发ListChangeListeners,例如人员列表,当人员的地址发生更改时,ListChangeListeners会触发。
如何编辑多个人的地址,并让侦听器对所有更改一起只触发一次?

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(虽然不知道其当前状态)删除所有注册的侦听器,执行批量更改,在最后一次静默更改之后添加注册的侦听器。