JavaFX FliteredList 不跟随基础列表的变化

JavaFX FliteredList not following the change of underlying list

我有一个整数数组列表 (aList),然后从 aList 制作了一个 ObservableList (oList)。将 0 到 10 添加到 aList,然后从 oList 中创建一个 FilteredList (fList)。最后,我将 10 添加到 aList,将 11 添加到 oList。我希望在 fList 中同时看到 10 和 11,但令人惊讶的是,10 不在 fList 中。这是预期的行为还是错误?

    List<Integer> aList = new ArrayList<>();
    ObservableList<Integer> oList = FXCollections.observableList(aList);
    for (Integer i = 0; i < 10; i++)
        aList.add(i);
    FilteredList<Integer> fList = new FilteredList<Integer>(oList, i -> { return i > 5; });
    aList.add(10);
    oList.add(11);
    System.out.print("O: ");
    for (Integer i : oList)
        System.out.print(i + ", ");
    System.out.println("");

    System.out.print("F: ");
    for (Integer i : fList)
        System.out.print(i + ", ");
    System.out.println("");

这是输出,10 不在 fList 中:

    O: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
    F: 6, 7, 8, 9, 11, 

这是预期的(或至少是可解释的)行为。 documentation for FXCollections.observableList(...) 表示:

Note that mutation operations made directly to the underlying list are not reported to observers of any ObservableList that wraps it.

FilteredList 通过观察其源列表 (oList) 并在 oList 的内容更改时更新其内容来工作。由于没有触发 oList 添加值 10 的通知,过滤后的列表永远不会添加它。