Умножение 2 цифр в TextField - Java FX - PullRequest
0 голосов
/ 11 ноября 2018

Я борюсь с ошибкой в ​​моем приложении. Основная идея заключалась в том, чтобы умножить базовую цену на аргумент слайдера, например, если для слайдера установлено значение 2, цена = 2 * цена

Проблема в том, что если я снова переключу ползунок, математические операции накапливаются. Например, когда я переключил ползунок на 2, затем на 3, после этого на 4, мой результат - цена * 2 * 3 * 4, но я ожидаю, что цена * 4 запомнится. Как я могу это исправить?

daysSlider.valueProperty().addListener(new ChangeListener() {

@Override
    public void changed(ObservableValue arg0, Object arg1, Object arg2) {
      int i = Integer.parseInt(priceTextField.getText());
        priceTextField.textProperty().setValue(
                String.valueOf((int) daysSlider.getValue()* i ));
    }
});

1 Ответ

0 голосов
/ 11 ноября 2018

Итак, проблема в том, что вы получаете строку из текстового поля и выполняете с ней математические операции.

Чтобы обойти эту проблему, можно проанализировать строку в целое число, выполнив следующие действия:

int baseCost = Integer.parseInt(textField.getValue());

Это даст вам базовую стоимость в виде целого числа, а затем вы можете умножить ее на число в слайдере, используя аналогичный метод. Теперь вы можете установить значение в priceTextField, выполнив следующие действия:

//totalCost is an integer value calculated by multiplying the base cost and the slider's value.
priceTextField.textProperty().setValue(Integer.toString(totalCost));

Надеюсь, это поможет!

С вашей новой проблемой вот почему это происходит:

Причина, по которой вы получаете проблему, заключается в том, что каждый раз, когда изменяется значение в ползунке, вы устанавливаете priceTextField в daySlider раз i. Затем в следующий раз, когда произойдет изменение, вы устанавливаете i равным значению, которое в настоящее время находится в priceTextField. Вот почему он делает несколько умножений.

Если я правильно помню, вы пытались умножить значение TextField на значение Slider и отобразить его в другом TextField. Поэтому вы можете сказать int i = Integer.parseInt(textField.getValue()), чтобы получить значение для вашей базовой стоимости. Затем вы можете умножить его на значение daysSlider и сделать priceTextField.textProperty().setValue( Integer.toString(i * sliderValue);

Чтобы решить вашу новую проблему:

ArrayList<Integer> baseCost = new ArrayList<>();

priceTextField.valueProperty().addListener(new ChangeListener(){
    @Override
    public void changed(ObservableValue arg0, Object arg1, Object arg2) {
        baseCost.add(Integer.parseInt(priceTextField.getText()));
    }
}
daysSlider.valueProperty().addListener(new ChangeListener() {

    @Override
    public void changed(ObservableValue arg0, Object arg1, Object arg2) {
        priceTextField.textProperty().setValue(
                String.valueOf((int) daysSlider.getValue() * baseCost.get(0) ));
    }

});

ОТВЕТЬТЕ на свой третий вопрос (можно найти в чате) :

Вот как вы можете сделать работоспособным:

daysSlider.valueProperty().addListener(new ChangeListener() {
    @Override
    public void changed(ObservableValue arg0, Object arg1, Object arg2) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
              priceTextField.textProperty().setValue(
              String.valueOf((int) daysSlider.getValue() * baseCost.get(0) ));
            }
        };

        Handler handler = new Handler();
        //Run the runnable after 3000 milliseconds or 3 seconds.
        handler.postDelayed(runnable, 3000);

    }

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