我有一个帐单表,我想在其中列出帐单上的所有产品。我将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;
});


希望能有所帮助!

07-27 18:34