计算 TableView 中不同列的总和

Calculating the sum of diffrent columns in TableView

我有一个 Table 看起来像下面 table

TableVeiw<Transaction>

 ---------------------------------------------------------------------
| id | Transaction date |  Name | type  | Debit Amount | Credit Amount|
|---------------------------------------------------------------------|
| 1  |   21/02/2016     |Invoice|Credit |              |      12000   |
|---------------------------------------------------------------------|
| 2  |    21/02/2016    |Payment|Debit  |  20000       |              |
|---------------------------------------------------------------------|
                                        |  Total Debit | Total Credit | 
                                         -----------------------------

借方金额和贷方金额中的数据来自一个 属性 交易对象如何填充这些列的代码片段如下:

 tcCreditAmmout.setCellValueFactory(cellData -> {
            Transaction transaction = cellData.getValue() ;
            BigDecimal value = null;
            if(transaction.getKindOfTransaction() == KindOfTransaction.CREDIT){
                value = transaction.getAmountOfTransaction();
            }

            return new ReadOnlyObjectWrapper<BigDecimal>(value);
        });

        tcDebitAmmout.setCellValueFactory(cellData -> {
            Transaction transaction = cellData.getValue() ;
            BigDecimal value = null;
            if(transaction.getKindOfTransaction() == KindOfTransaction.DEBIT){
                value = transaction.getAmountOfTransaction();
            }

            return new ReadOnlyObjectWrapper<BigDecimal>(value);
        });

每次 TableView 项目更改时,我都需要计算总借方(参见上面 table)和总贷方(参见上面 table) Javafx 绑定,但我不知道如何实现它。

注意:总借方和总贷方是标签,

假设你有

TableView<Transaction> table = ... ;
Label totalDebit = ... ;
Label totalCredit = ... ;

那么你只需要:

totalDebit.textProperty().bind(Bindings.createObjectBinding(() -> 
    table.getItems().stream()
         .filter(transaction -> transaction.getKindOfTransaction() == KindOfTransaction.DEBIT)
         .map(Transaction::getAmountOfTransaction)
         .reduce(BigDecimal.ZERO, BigDecimal::add),
         table.getItems())
    .asString("%.3f"));

当然还有

totalCredit.textProperty().bind(Bindings.createObjectBinding(() -> 
    table.getItems().stream()
         .filter(transaction -> transaction.getKindOfTransaction() == KindOfTransaction.CREDIT)
         .map(Transaction::getAmountOfTransaction)
         .reduce(BigDecimal.ZERO, BigDecimal::add),
         table.getItems())
    .asString("%.3f"));

如果 getAmountOfTransaction 可能会在交易是 table 的一部分时发生变化,那么您的 table 的项目列表必须使用 extractor 构建。