假设我有一个用 JavaFX 编写的简单应用程序。
它有一个包含两列的 TableView,一列包含元素名称,另一列包含元素值。
现在我想要计算 TableView 中可见项目的平均值,并在每次按名称过滤元素时更新它。
这是我已经拥有的:
@FXML
public void filterProducts() {
filteredProducts = new FilteredList<>(FXCollections.observableArrayList(mainApp.getProductList()), p -> true);
filterBtn.setOnMouseClicked(event -> {
filteredProducts.setPredicate(product -> {
return checkFilteringForNetPrice(product) && checkFilteringForManufacturer(product);
});
});
SortedList<Product> sortedProducts = new SortedList<>(filteredProducts);
sortedProducts.comparatorProperty().bind(productTable.comparatorProperty());
productTable.setItems(sortedProducts);
computeAverageAfterFiltering(sortedProducts);
}
通过调用 computeAverageAfterFiltering(sortedProducts)
方法,我一直在尝试计算 sortedProducts
元素的平均值,但它包含的元素数量与 完全相同mainApp.getProductList()
.
我希望在 sortedProducts
中仅找到经过筛选和排序的元素。
怎么了?
最佳答案
您仅在按下按钮时应用过滤器;但是,您立即调用方法computeAverageAfterFiltering,即在应用过滤器之前。
您可以使用绑定(bind)维护过滤列表中元素的平均值:
DoubleBinding average = Bindings.createDoubleBinding(
() -> computeAverage(sortedProducts),
sortedProducts);
createDoubleBinding
的第一个参数是评估绑定(bind)的函数,第二个参数是要观察更改的对象列表。在本例中,我们只传递排序后的列表,因此每当列表内容发生更改时,都会重新计算绑定(bind)。
然后你可以做类似的事情
Label averageLabel = new Label();
averageLabel.textProperty().bind(average.asString("Average price: %f"));
与
private double computeAverage(List<Product> products) {
return products.stream()
// adjust Product::getPrice to give the values you want to average:
.collect(Collectors.averagingDouble(Product::getPrice));
}
关于java - 计算 FilteredList 中项目(元素)的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36058940/