注册列表更改侦听器时出现异常

Sar*_*abo 2 java generics user-interface javafx exception

我刚刚将这段代码添加到我的列表程序中,我得到了一个例外.我不确定发生了什么,它避免了我用它调试的努力.具体而言,异常发生在新列表的分配上.rankList是一个ListView<Rank>

 rankList.getItems().addListener(new ListChangeListener<Rank>() {
            @Override
            public void onChanged(ListChangeListener.Change<? extends Rank> c) {

                 List<? extends Rank> ranks = c.getAddedSubList();
                 Collections.sort(ranks, (Rank t, Rank t1)
                 -> Long.compare(t.getNumericalRankApproximation(),
                 t1.getNumericalRankApproximation()));
                 setValue(ranks.get(ranks.size()).getNumericalRankApproximation());
                 increment();
            }
        });
Run Code Online (Sandbox Code Playgroud)

例外:

Caused by: java.lang.IllegalStateException: Invalid Change state: next() must be called before inspecting the Change.
Run Code Online (Sandbox Code Playgroud)

Jam*_*s_D 8

您必须迭代change传递给onChanged方法的内容.有关详细信息,请参阅文档,但有类似的内容

 rankList.getItems().addListener(new ListChangeListener<Rank>() {
            @Override
            public void onChanged(ListChangeListener.Change<? extends Rank> c) {
                 while (c.next()) {
                     if (c.wasAdded()) {
                         List<? extends Rank> ranks = c.getAddedSubList();
                         Collections.sort(ranks, (Rank t, Rank t1)
                         -> Long.compare(t.getNumericalRankApproximation(),
                         t1.getNumericalRankApproximation()));
                         setValue(ranks.get(ranks.size()).getNumericalRankApproximation());
                         increment();
                     }
                 }
            }
        });
Run Code Online (Sandbox Code Playgroud)