JavaFX 中已过滤的 ObservableList 属性

Filtered ObservableList of properties in JavaFX

我有一个 class:

class Person {
    private SimpleBooleanProperty graph = new SimpleBooleanProperty(false);
    private XYChart.Series<Date, Number> series = new XYChart.Series<>();

    public boolean isGraph() {
        return graph.get();
    }

    public XYChart.Series<Date, Number> getSeries() {
        return series;
    }
}

它有一个布尔值提取器 graphProperty

private Callback<Person, Observable[]> extractor = person -> new Observable[] {
    person.graphProperty(),
};

为了在 XYChart 上显示系列,我现在需要一个包含所有系列的可观察列表,这些系列启用了图表 属性,例如:

    ObservableList<XYChart.Series<Date, Number>> filteredSeries = persons
        .filtered(Person::isGraph)
        .stream()
        .map(Person::getSeries)
        .collect(Collectors.toCollection(FXCollections::observableArrayList));

不幸的是,FXCollections::observableArrayList 不受人员列表的支持。所以问题是如何创建正确的 ObservableList<XYChart.Series<Date, Number> 人员列表?

更新:

我尝试通过

从人们那里得到一个过滤列表
FilteredList<Person> graphedPersons = new FilteredList<>(persons);
graphedPersons.setPredicate(Person::isGraph);

正如@kleopatra 建议的那样,我尝试将 graphedPersons 包装在 TranformationList:

ObservableList<XYChart.Series<Date, Number>> graphedSeries = new TransformationList<XYChart.Series<Date, Number>, Person>() {

    @Override
    public int size() {
        return getSource().size();
    }

    @Override
    public XYChart.Series<Date, Number> get(int index) {
       return getSource().get(index).getSeries();
    }

    @Override
    protected void sourceChanged(ListChangeListener.Change<? extends Person> c) {

    }

    @Override
    public int getSourceIndex(int index) {
        return index;
    }
};

图表未显示任何内容。

解决方案是@klepatra 建议将筛选列表包装在 TransformationList

FilteredList<Person> graphedPersons = new FilteredList<>(persons);
graphedPersons.setPredicate(Person::isGraph);

变换列表

ObservableList<XYChart.Series<Date, Number>> graphedSeries = new TransformationList<XYChart.Series<Date, Number>, Person>(graphedPersons) {

    @Override
    public int size() {
        return getSource().size();
    }

    @Override
    public XYChart.Series<Date, Number> get(int index) {
        return getSource().get(index).getSeries();
    }

    @Override
    protected void sourceChanged(ListChangeListener.Change<? extends Person> c) {
        beginChange();
        while (c.next()) {
            if (c.wasReplaced()) {
                nextReplace(c.getFrom(), c.getTo(), c.getRemoved().stream().map(Person::getSeries).collect(Collectors.toList()));
            } else if (c.wasRemoved()) {
                nextRemove(c.getFrom(), c.getRemoved().stream().map(Person::getSeries).collect(Collectors.toList()));
            } else if (c.wasAdded()) {
                nextAdd(c.getFrom(), c.getTo());
            }
        }
        endChange();
    }

    @Override
    public int getSourceIndex(int index) {
        return index;
    }
};