Вычисление суммы разных столбцов в TableView

У меня 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 | 
                                         -----------------------------

Данные в сумме дебета и сумме кредита поступают из одного свойства объекта транзакции. Фрагмент кода для заполнения этих столбцов приведен ниже:

 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, но я понятия не имею, как это сделать.

Примечание. Общий дебет и общий кредит являются метками.


person abdou amer    schedule 21.02.2016    source источник
comment
Чем это отличается от второй части stackoverflow.com/ вопросы/35187145/? Вы, кажется, постоянно задаете один и тот же вопрос.   -  person James_D    schedule 22.02.2016
comment
Нет, дело в другом, transaction.getAmountOfTransaction() разбивается на столбцы в зависимости от типа транзакции. Мне нужно рассчитать сумму для каждого столбца tcCreditAmmout и tcDebitAmmout   -  person abdou amer    schedule 22.02.2016
comment
Но ведь это всего лишь суммы transaction.getAmountOfTransaction() для всех транзакций, у которых transaction.getKindOfTransaction() == KindOfTransaction.CREDIT и transaction.getKindOfTransaction() == KindOfTransaction.DEBIT соответственно, не так ли?   -  person James_D    schedule 22.02.2016
comment
Да, но мне нужно разделить их на сумму транзакции с типом CREDIT и сумму транзакции с типом DEBIT.   -  person abdou amer    schedule 22.02.2016
comment
Не совсем уверен, что понимаю, почему это так отличается, но см. Ответ.   -  person James_D    schedule 22.02.2016


Ответы (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 может измениться, пока транзакция является частью таблицы, список элементов вашей таблицы должен быть создан с использованием извлекатель.

person James_D    schedule 21.02.2016
comment
Я думаю, в вашем коде опечатка: вы должны использовать Bindings.createObjectBinding() вместо Bindings.computeObjectBinding() - person Kachna; 23.02.2016
comment
Да, извините, не знаю, как произошла эта опечатка. Отредактировано, чтобы исправить. - person James_D; 23.02.2016
comment
Для: table.getItems()) .asString(%.3f)); , как я могу настроить шаблон? - person abdou amer; 26.02.2016
comment
Просто прочитайте документы: asString(), который ссылается на java.util.Formatter - person James_D; 26.02.2016