Javafx 更改:如何正确处理更新和置换的项

Javafx 更改:如何正确处理更新和置换的项,javafx,changelistener,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 =

从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);
                     }
                 }
             }
         }
     });
 }
这是什么意思

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

更改有一个方法描述元素的排列方式


更新到底意味着什么

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

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);
    }
}
对列表中的元素调用
setValue()
,可能会触发更新。请注意,更新的状态是“可选”的,并且可能不会被所有列表触发。具体而言,要获取触发更新的列表,请使用以下命令创建它:

ObservableList=FXCollections.observableRayList(
item->new Observable[]{item.valueProperty()});
列表。添加所有(新项目(1)、新项目(2)、新项目(3));

list.addListener((更改)非常感谢您的解释!还有一个关于Outer.this.的问题,代码是否应该是
Outer.this.remove(remotem)
Outer.this.add(additem)
intead?我想在我的解释中,您建议的代码会更直观。也许这个想法是周围的类(
Outer
)是某种监听器,代码正在注册/取消注册监听器到添加和删除的项目。不确定文档中的意图是什么。
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);
    }
}
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);