ObservableList.sublist and ListChangeListener

Viewed 93

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?

0 Answers
Related