Java ObservableList.sublist和ListChangeListener
ObservableList.sublist()返回的排序列表是否会正确触发ObservableList的ListChangeListener的事件 我有这样的情况,一切都好:Java ObservableList.sublist和ListChangeListener,java,javafx,Java,Javafx,ObservableList.sublist()返回的排序列表是否会正确触发ObservableList的ListChangeListener的事件 我有这样的情况,一切都好: public final class Main extends Application { @Override public void start(Stage primaryStage) throws Exception { ObservableList<TestClass>
public final class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
ObservableList<TestClass> observableList = initList();
observableList.addAll(new TestClass("4"), new TestClass("2"),
new TestClass("3"), new TestClass("1"));
System.out.println(observableList);
observableList.sort((o1, o2) -> {
int val1 = Integer.parseInt(o1.getId());
int val2 = Integer.parseInt(o2.getId());
return Integer.compare(val1, val2);
});
System.out.println(observableList);
}
private ObservableList<TestClass> initList() {
ObservableList<TestClass> observableList = FXCollections.observableArrayList();
observableList.addListener((ListChangeListener<TestClass>) change -> {
while (change.next()) {
List<? extends TestClass> srcList = change.getList();
if (change.wasPermutated()) {
List<? extends TestClass> affectedRange = srcList.subList(change.getFrom(), change.getTo());
affectedRange.forEach(testClass -> testClass.setInUse(false));
affectedRange.forEach(testClass -> testClass.setInUse(true));
} else if (change.wasRemoved() || change.wasAdded()) {
if (change.wasRemoved()) {
change.getRemoved().forEach(testClass -> testClass.setInUse(false));
}
if (change.wasAdded()) {
change.getAddedSubList().forEach(testClass -> testClass.setInUse(true));
}
}
}
});
return observableList;
}
}
public final class TestClass {
private final String id;
private boolean inUse;
public TestClass(String id) {
this.id = id;
}
public void setInUse(boolean val) {
if (val && inUse) {
throw new IllegalStateException(toString() + " is already in use!");
}
this.inUse = val;
}
public String getId() {
return id;
}
@Override
public String toString() {
return "TestClass ID: " + id;
}
}
为此:
observableList.subList(0, observableList.size()).sort((o1, o2) -> {
int val1 = Integer.parseInt(o1.getId());
int val2 = Integer.parseInt(o2.getId());
return Integer.compare(val1, val2);
});
我会得到一个例外:
java.lang.IllegalStateException:TestClass ID:1已在使用中
有什么我做错了吗?从技术上讲,区别在于ObservableListWrapper是一个SortedList(触发预期的排列),而子列表是一个普通的核心列表,它使用调用单个集合的默认排序(导致触发多个列表更改事件,而不是一个带有多个子更改的更改)-在后一种情况下,您认为删除/添加是具有相同索引的对的假设不成立。
observableList.subList(0, observableList.size()).sort((o1, o2) -> {
int val1 = Integer.parseInt(o1.getId());
int val2 = Integer.parseInt(o2.getId());
return Integer.compare(val1, val2);
});