Will sorting list returned by ObservableList.sublist() correctly fire events of the ObservableList's ListChangeListener?
I have such situation and everything is ok:
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;
}
}
but when I change the sorting part:
observableList.sort((o1, o2) -> {
int val1 = Integer.parseInt(o1.getId());
int val2 = Integer.parseInt(o2.getId());
return Integer.compare(val1, val2);
});
to this:
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);
});
I'll get the exception:
java.lang.IllegalStateException: TestClass ID: 1 is already in use!
Is there anything I'm doing wrong?