JavaFX中筛选后的ObservableList属性列表

时间:2020-10-22 16:42:03

标签: java javafx java-stream

我上过课:

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上显示序列,我现在需要一个可观察到的所有序列的列表,这些序列都启用了graph属性,例如:

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

该图表未显示任何内容。

1 个答案:

答案 0 :(得分:1)

解决方案是@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;
    }
};
相关问题