Прослушиватель событий для выполнения арифметических c операций над полями текста - PullRequest
0 голосов
/ 24 марта 2020

Я запутался с выполнением блока кода. У меня есть 4 текстовых поля, каждое из которых quantity, price, vat и amount.

Я хочу добавить прослушиватель событий в текстовые поля price и quantity, чтобы при каждом изменении текста в каждом из них новые вычисления vat и новые значения amount автоматически отображались в соответствующих текстовые поля.

Я думаю о чем-то вроде этого:

    private void addEventListeners() {
        txtInvoiceQuantity.textProperty().addListener((ChangeListener) (observable, oldVal, newVal) -> calculateVATAmount((String) oldVal, (String) newVal));
    }

    private void calculateVATAmount(String oldVal, String newVal) {
 if (newVal.length() > oldVal.length()) {
            if (txtInvoiceQuantity.getText().length() > 0 && txtInvoicePrice.getText().length() > 0) {
                try {
                    double quantity = Double.parseDouble(newVal);
                    double price = Double.parseDouble(txtInvoicePrice.getText());
                    double vat = Double.parseDouble(lblVAT.getText()) / 100;
                    double vatamount = quantity * price * vat;
                    txtInvoiceVAT.setText(String.valueOf(vatamount));
                    double invoiceAmount = (price * quantity) + vatamount;
                    txtInvoiceAmount.setText(String.valueOf(invoiceAmount));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

Я, очевидно, не могу использовать это событие, как оно есть на txtInvoiceQuantity. Так как я могу изменить calculateVATAmount(oldVal,newVal) так, чтобы он делал то, что я хочу?

Как я также учитываю oldVal (в случае, если пользователь нажимает пробел)?

1 Ответ

0 голосов
/ 24 марта 2020

Насколько я понимаю, вам придется дублировать этот блок кода, поскольку вы передаете параметры из разных текстовых полей в каждом обработчике.

Что касается факторизации старого значения, просто удалите if(newVal.length() > oldVal.length()) {}. Это должно выглядеть так:

   private void quantityHandler(String oldVal, String newVal) {
            if (txtInvoiceQuantity.getText().length() > 0 && txtInvoicePrice.getText().length() > 0) {
                try {
                    double quantity = Double.parseDouble(newVal);
                    double price = Double.parseDouble(txtInvoicePrice.getText());
                    double vat = Double.parseDouble(lblVAT.getText()) / 100;
                    double vatamount = quantity * price * vat;
                    txtInvoiceVAT.setText(String.valueOf(round(vatamount,2)));
                    double invoiceAmount = (price * quantity) + vatamount;
                    txtInvoiceAmount.setText(String.valueOf(round(invoiceAmount,2)));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    }
    private void priceHandler(String oldVal, String newVal) {
            if (txtInvoiceQuantity.getText().length() > 0 && txtInvoicePrice.getText().length() > 0) {
                try {
                    double quantity = Double.parseDouble(txtInvoiceQuantity.getText());
                    double price = Double.parseDouble(newVal);
                    double vat = Double.parseDouble(lblVAT.getText()) / 100;
                    double vatamount = quantity * price * vat;
                    txtInvoiceVAT.setText(String.valueOf(round(vatamount,2)));
                    double invoiceAmount = (price * quantity) + vatamount;
                    txtInvoiceAmount.setText(String.valueOf(round(invoiceAmount,2)));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    }

Поскольку вы работаете с денежными значениями, я нашел метод, который преобразует в указанное количество десятичных знаков, найдите его здесь

Округление до 2 знаков после запятой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...