ListChangeListener.Change:如何正确处理更新和排列的项目

ker*_*000 3 javafx changelistener

来自 JavaDoc:

ObservableList theList = ...;

 theList.addListener(new ListChangeListener<Item>() {
     public void onChanged(Change<tem> c) {
         while (c.next()) {
             if (c.wasPermutated()) {
                     for (int i = c.getFrom(); i < c.getTo(); ++i) {
                          //permutate
                     }
                 } else if (c.wasUpdated()) {
                          //update item
                 } else {
                     for (Item remitem : c.getRemoved()) {
                         remitem.remove(Outer.this);
                     }
                     for (Item additem : c.getAddedSubList()) {
                         additem.add(Outer.this);
                     }
                 }
             }
         }
     });
 }
Run Code Online (Sandbox Code Playgroud)

添加和删​​除项目是直截了当的,但是//update itemand// permutate呢?

我如何知道哪些项目已被哪些其他项目置换?

更新具体是什么意思?它只是再次将相同的项目添加到列表中吗?

还有呢

for (Item remitem : c.getRemoved()) {
remitem.remove(Outer.this);
}
or (Item additem : c.getAddedSubList()) {
additem.add(Outer.this);
}
Run Code Online (Sandbox Code Playgroud)

什么Outer.this意思?

Jam*_*s_D 5

我如何知道哪些项目已被哪些其他项目置换?

更改有一个getPermutation()方法,用于描述元素如何排列。


更新具体是什么意思?

如果属于元素的属性发生更改,则更新列表,尽管相同的元素仍保留在列表中(以相同的顺序)。例如,给定一个类

public class Item {

    private final IntegerProperty value = new SimpleIntegerProperty();

    public final IntegerProperty valueProperty() {
        return value ;
    }

    public final int getValue() {
        return valueProperty().get();
    }

    public final void setValue(int value) {
        valueProperty().set(value);
    }

    public Item(int value) {
        setValue(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

调用setValue()列表的元素可能会触发更新。请注意,文档指出更新是“可选的”,可能不会被所有列表触发。具体来说,要获取触发更新的列表,请使用提取器创建它:

ObservableList<Item> list = FXCollections.observableArrayList(
    item -> new Observable[] {item.valueProperty()});

list.addAll(new Item(1), new Item(2), new Item(3));

list.addListener((Change<? extends Item> c) -> {
    while (c.next()) {
        if (c.wasUpdated()) {
            System.out.println("Items from "+c.getFrom()+" to "+c.getTo()+" changed");
        }
    }
});

list.get(1).setValue(42);
Run Code Online (Sandbox Code Playgroud)

最后一行代码不会更改列表中的哪些元素或它们的顺序,但会更改其中一个元素的属性。因此,此更改将触发更新。


什么Outer.this意思?

它只是对周围类的当前对象的引用(假定它具有类名Outer);即不是 的匿名内部类实现的当前对象ListChangeListener。请参阅Java(以及许多其他人)中Class.this 和 this 之间的区别是什么。我认为文档中代码片段的上下文应该是一个实现ObservableList和维护自己ObservableList实例(装饰器模式)的类。它观察列表实例并更新自身以与其保持同步。