我有一个帐单表,我想在其中列出帐单上的所有产品。我将ProductInBill
对象保存在帐单的ArrayList<ProductInBill>
中。
创建TableView
时,常见的方法是创建JavaFX字段。在控制器类上,我有我的字段:
@FXML public TableColumn<ProductInBill, String> finishedBillProductNameColumn;
@FXML public TableColumn<Integer, Integer> finishedBillProductNumberColumn;
@FXML public TableColumn<ProductInBill, Integer> finishedBillProductPriceBruttoLabel;
@FXML public TableColumn<Integer, Integer> finishedBillProductTotalAmountColumn;
@FXML public TableView finishedBillProductTable;
然后,我在代码中使用
setUp()
方法,例如:private void setUpFinishedBillProductTable() {
finishedBillProductNameColumn.setCellValueFactory(new PropertyValueFactory<ProductInBill, String>("productName"));
finishedBillProductPriceBruttoLabel.setCellValueFactory(new PropertyValueFactory<ProductInBill, Integer>("productPrice"));
}
还有一个
updateBillTable()
方法来加载必要的ProductInBill
对象,将它们保存到TableList并将其提供给表。 private void updateFinishedBillProductTable(Bill bill) {
LOG.info("Start reading all Products from Bill");
for(ProductInBill product : bill.getProducts()){
finishedBillProductCurrent.add(product);
}
finishedBillProductTable.getItems().clear();
if(!finishedBillProductCurrent.isEmpty()) {
for (ProductInBill p : finishedBillProductCurrent) {
finishedBillProductTableList.add(p);
}
//here i want to calculate some other Integer values based on the ProductInBill values and insert them to the table too.
finishedBillProductTable.setItems(finishedBillProductTableList);
}
}
这一切都很好。我现在的问题是,我的
TableView
上也有一个字段,该字段具有我不想保存在对象中的计算出的Integer值。以
finishedBillProductNumberColumn
为例。我想在我的ArrayList
上进行迭代,找到所有具有相同名称的产品,并将相同项目的数量填充到表中。我怎样才能做到这一点?我只找到了一些解决方案,其中必须使用对象中的值才能将某些内容插入到
TableView
中。 最佳答案
您只需要为这些情况编写一个自定义CellValueFactory,而不是使用预制的情况。使用PropertyValueFactory只是将成员填充到单元格中的便捷捷径。
例如:
finishedBillProductNameColumn.setCellValueFactory(new PropertyValueFactory<ProductInBill, String>("productName"));
只是一种较短的方法:
finishedBillProductNameColumn.setCellValueFactory( cellData -> {
ProductInBill productInBill = cellData.getValue();
return data == null ? null : new SimpleStringProperty(productInBill.getProductName());
});
就是说,我对第二种语法有100%的偏好。因为在第一个上,如果您重命名了成员,却忘记了在其中进行更改,那么直到在应用程序中找到该错误,您才知道存在错误。此外,它还可以显示除成员以外的其他值。
作为
finishedBillProductNumberColumn
的具体示例,您可以执行以下操作:首先更改定义(第一个通用类型是通过
cellData.getValue()
收到的定义:@FXML public TableColumn<ProductInBill, Integer> finishedBillProductNumberColumn;
然后定义您想要的CellValueFactory:
finishedBillProductNumberColumn.setCellValueFactory( cellData -> {
ProductInBill productInBill = cellData.getValue();
if(productionInBill != null){
Long nbProduct = finishedBillProductTable.getItems().stream().filter(product -> product.getProductName().equals(productInBill.getProductName())).count();
return new SimpleIntegerProperty(nbProduct.intValue()).asObject();
}
return null;
});
希望能有所帮助!