2016-02-21 2 views
0

У меня есть таблица Witch выглядеть таблицу нижеВычисление суммы diffrent столбцов в TableView

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); 
     }); 

Мне нужно рассчитать общее количество: Общий дебет (см таблицу выше) и Total Credit (см таблицу выше) каждый раз, когда изменяется пункт Tableview через JavaFX креплениями, но у меня есть не знаю, как добиться этого.

Примечание: Общий дебет и Total Кредит являются этикетки,

+0

Как это отличается от второй части http://stackoverflow.com/questions/35187145/javafx-tableview-items-prevent-duplicates? Кажется, вы неоднократно задавали тот же вопрос. –

+0

Нет, это сложно, transaction.getAmountOfTransaction() разбивается на столбцы на основе типа транзакции. Мне нужно вычислить сумму для каждого столбца tcCreditAmmout и tcDebitAmmout –

+0

Но это всего лишь суммы 'transaction.getAmountOfTransaction()' для всех транзакций, которые имеют транзакцию.getKindOfTransaction() == KindOfTransaction.CREDIT' и 'transaction.getKindOfTransaction() == KindOfTransaction.DEBIT', соответственно, не так ли? –

ответ

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.

+0

Я думаю, что в вашем коде есть опечатка: вы должны использовать 'Bindings.createObjectBinding()' вместо 'Bindings.computeObjectBinding()' – Kachna

+0

Да, извините, не знаю, как это произошло. Отредактировано для исправления. –

+0

Для: table.getItems()) .asString ("%. 3f")); , как я могу настроить шаблон? –