计算TableView中不同列的总和

时间:2016-02-21 20:57:16

标签: tableview javafx-8 observable tablecolumn

我有一个Table Witch,如下表所示

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 | 
                                         -----------------------------

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

 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项目通过Javafx Bindings更改时,我需要计算总计:总借记(参见上表)和总计信用(参见上表),但我不知道如何实现这一点。

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

1 个答案:

答案 0 :(得分:1)

假设你有

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可能会发生变化,那么您的表格项目列表必须使用extractor构建。