JavaFX中属性的筛选ObservableList



我确实有一个类:

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

其具有布尔CCD_ 1 的提取器

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所建议的那样,我尝试用TranformationList:包装graphedPersons

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

最新更新