ListChangeListener 是一个很好的方法,因为它只需要使用一个监听器。
public static class Item {
private final IntegerProperty index = new SimpleIntegerProperty();
@Override
public String toString() {
return Integer.toString(index.get());
}
}
ObservableList<Item> items = FXCollections.observableArrayList();
items.addListener((ListChangeListener.Change<? extends Item> c) -> {
boolean hadNext;
while ((hadNext = c.next()) && c.wasPermutated()) {
int to = c.getTo();
for (int i = c.getFrom(); i < to; i++) {
items.get(i).index.set(i);
}
}
while (hadNext) {
if (c.wasReplaced()) {
int to = c.getTo();
for (int i = c.getFrom(); i < to; i++) {
items.get(i).index.set(i);
}
} else {
if (!c.wasUpdated()) {
// add/remove change
int to = items.size();
for (int i = c.getFrom(); i < to; i++) {
items.get(i).index.set(i);
}
}
break;
}
hadNext = c.next();
}
});
或者,您可以使用FXCollections.observableList 并让后备列表处理此问题:
private static class ItemsList extends AbstractList<Item> {
private final List<Item> data = new ArrayList<>();
@Override
public Item get(int index) {
return data.get(index);
}
@Override
public int size() {
return data.size();
}
private void updateFromIndex(int index) {
int size = size();
for (; index < size; index++) {
data.get(index).index.set(index);
}
}
@Override
public Item remove(int index) {
Item result = data.remove(index);
updateFromIndex(index);
return result;
}
@Override
public void add(int index, Item element) {
data.add(index, element);
updateFromIndex(index);
}
@Override
public Item set(int index, Item element) {
element.index.set(index);
return data.set(index, element);
}
}
ObservableList<Item> items = FXCollections.observableList(new ItemsList());
请注意,可以对支持列表进行多次插入/删除操作的处理进行了优化。
在这两种情况下
for (int i = 0; i < 5; i++) {
System.out.println(items);
items.add(new Item());
}
System.out.println(items);
Collections.swap(items, 0, 4);
System.out.println(items);
Collections.swap(items, 2, 3);
System.out.println(items);
Collections.swap(items, 0, 2);
System.out.println(items);
产生以下控制台打印输出:
[]
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]