猿问

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

来自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();

    }

}

这是输出:


REPLACING

Added:true

Permutated:false

Removed:true

Replaced:true

Updated:false


CLEARING

Added:false

Permutated:false

Removed:true

Replaced:false

Updated:false

如果更换的一项更改很明确 -replaced + removed + added那么如何解释当我们明确时,我们无论如何都会得到一项更改。请解释一下,当我们在 ListChangeListener.Change 中获得多项更改时?


守着一只汪
浏览 112回答 1
1回答

MM们

单个更改可以负责修改一系列值(您可以通过检查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++) {&nbsp; &nbsp; ol.add(i);}ol.addListener((ListChangeListener.Change<? extends Integer> event) -> {&nbsp; &nbsp; System.out.println("new change----------------------------------------------");&nbsp; &nbsp; while(event.next()) {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Added:" +&nbsp; event.wasAdded());&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Permutated:" +&nbsp; event.wasPermutated());&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Removed:" +&nbsp; event.wasRemoved());&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Replaced:" +&nbsp; event.wasReplaced());&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Updated:" +&nbsp; event.wasUpdated());&nbsp; &nbsp; }});ol.retainAll(1, 3, 5, 7, 9);输出:new change----------------------------------------------Added:falsePermutated:falseRemoved:trueReplaced:falseUpdated:falseAdded:falsePermutated:falseRemoved:trueReplaced:falseUpdated:falseAdded:falsePermutated:falseRemoved:trueReplaced:falseUpdated:falseAdded:falsePermutated:falseRemoved:trueReplaced:falseUpdated:falseAdded:falsePermutated:falseRemoved:trueReplaced:falseUpdated:false任何ObservableList实现都可以定义新的操作,这些操作分组执行多个更改,从而导致侦听器的单个通知。实现这一点的最简单方法是使用ObservableListBase'sbeginChange和endChange方法:class Ol extends ModifiableObservableListBase<Integer> {&nbsp; &nbsp; private final List<Integer> list = new ArrayList<>(Arrays.asList(2, 4, 6, 8));&nbsp; &nbsp; @Override&nbsp; &nbsp; public Integer get(int index) {&nbsp; &nbsp; &nbsp; &nbsp; return list.get(index);&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public int size() {&nbsp; &nbsp; &nbsp; &nbsp; return list.size();&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; protected void doAdd(int index, Integer element) {&nbsp; &nbsp; &nbsp; &nbsp; list.add(index, element);&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; protected Integer doSet(int index, Integer element) {&nbsp; &nbsp; &nbsp; &nbsp; return list.set(index, element);&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; protected Integer doRemove(int index) {&nbsp; &nbsp; &nbsp; &nbsp; return list.remove(index);&nbsp; &nbsp; }&nbsp; &nbsp; public void modify() {&nbsp; &nbsp; &nbsp; &nbsp; if (size() < 4) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new IllegalStateException();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; beginChange();&nbsp; &nbsp; &nbsp; &nbsp; set(0, 3);&nbsp; &nbsp; &nbsp; &nbsp; set(3, 7);&nbsp; &nbsp; &nbsp; &nbsp; endChange();&nbsp; &nbsp; }}modify()如果成功,则触发 2 次替换更改。
随时随地看视频慕课网APP

相关分类

Java
我要回答