我上过课:
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;
}
};
该图表未显示任何内容。
答案 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;
}
};