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;
}
};
我有一个 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;
}
};