JavaFX FliteredList不遵循基础列表的更改

时间:2016-09-11 15:51:19

标签: javafx observablelist

我有一个Integers的ArrayList(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, 

1 个答案:

答案 0 :(得分:2)

预期(或至少可解释)行为。 documentation for FXCollections.observableList(...)说:

  

请注意,直接对基础列表进行的变异操作不会报告给包装它的任何ObservableList的观察者。

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