为了账号安全,请及时绑定邮箱和手机立即绑定

我们什么时候会在 ListChangeListener.Change<E> 中获得多项更改?

我们什么时候会在 ListChangeListener.Change<E> 中获得多项更改?

守着一只汪 2022-05-25 10:03:24
来自JavaFX ListChangeListener.Change API公共抽象布尔下一个()转到下一个更改。Change 实例在其初始状态下是无效的,需要在调用其他方法之前调用 next()。第一次 next() 调用将使该对象代表第一次更改。所以,如果我们有第一个变化,我们可以有第二个等等。现在,考虑下面的代码:public class NewMain {    public static void main(String[] args) throws InterruptedException {        ObservableList<String> list = FXCollections.observableArrayList("Z", "Y", "X");        list.addListener((ListChangeListener)(event) -> {            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());            }        });        System.out.println("REPLACING");        list.set(0, "W");        System.out.println("\nCLEARING");        list.clear();    }}这是输出:REPLACINGAdded:truePermutated:falseRemoved:trueReplaced:trueUpdated:falseCLEARINGAdded:falsePermutated:falseRemoved:trueReplaced:falseUpdated:false如果更换的一项更改很明确 -replaced + removed + added那么如何解释当我们明确时,我们无论如何都会得到一项更改。请解释一下,当我们在 ListChangeListener.Change 中获得多项更改时?
查看完整描述

1 回答

?
MM们

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 次替换更改。


查看完整回答
反对 回复 2022-05-25
  • 1 回答
  • 0 关注
  • 111 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号