Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ObservableList.sublist和ListChangeListener_Java_Javafx - Fatal编程技术网

Java ObservableList.sublist和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>

ObservableList.sublist()返回的排序列表是否会正确触发ObservableList的ListChangeListener的事件

我有这样的情况,一切都好:

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);
    });