Получение прослушивателя событий JavaFX для общения с моим методом - PullRequest
0 голосов
/ 07 октября 2018

У меня есть калькулятор с несколькими полями и слайдер.Сумма чаевых , всего и на человека должна рассчитываться на основе ползунка Сумма , (процент чаевых)) и # людей.

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

К сожалению, лямбда не работала, и я подозревал, что мне нужно использовать changelistener, а не простослушатель и передать новые значения.Однако, когда я создал отдельные списки изменений и прокомментировал исходных слушателей, общее количество и количество не смогли измениться вообще.Единственный способ сохранить его частично работоспособным - использовать дублирующих слушателей.Тем не менее, когда я изменяю сумму от 100 до 200 сумм на человека, обновления и чаевые и итоги не обновляются.Ошибки указывают на проблему с одним направленным связыванием, но не дают подсказки, как ее исправить.Что я делаю не так?

package application;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URL;
import java.text.NumberFormat;
import java.util.ResourceBundle;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.Labeled;
import javafx.scene.control.Slider;
import javafx.scene.control.TextField;

public class TipCalculatorController2 {

private static final NumberFormat currency = NumberFormat.getCurrencyInstance();
private static final NumberFormat percent = NumberFormat.getPercentInstance();

private BigDecimal tipPercentage = new BigDecimal(0.15);


@FXML
private Label amountLabel;

@FXML
private Label tipPercentageLabel;

@FXML
private TextField amountTextField;

@FXML
private TextField tipTextField;

@FXML
private Slider tipPercentageSlider;

@FXML
private TextField totalTextField;

@FXML
private TextField perPersonTextField;

@FXML
private TextField numPeopleTextField;

BigDecimal amount;
BigDecimal numPeople;
BigDecimal total;
BigDecimal tip;
BigDecimal splitTip;
//BigDecimal tipPercentage nope this breaks everything;
protected long number;

@FXML 
private void calculate() {

    try {
        amount = new BigDecimal(amountTextField.getText());     
        numPeople = new BigDecimal(numPeopleTextField.getText());
        }
    catch (NumberFormatException ex) {
        return;
        }
    tip = amount.multiply(tipPercentage);
    total = amount.add(tip);
    BigDecimal tipPercentage = BigDecimal.valueOf(tipPercentageSlider.getValue());
    splitTip = tip.divide(numPeople);
    perPersonTextField.setText(currency.format(splitTip));
    tipTextField.setText(currency.format(tip));
    totalTextField.setText(currency.format(total));

}

 @FXML
 public void initialize() {
    currency.setRoundingMode(RoundingMode.HALF_UP);
    tipTextField.textProperty().bind(tipPercentageSlider.valueProperty().asString("%.0f"));
    amountTextField.textProperty().addListener(e -> calculate());
    tipTextField.textProperty().addListener(e -> calculate());
    totalTextField.textProperty().addListener(e -> calculate());

    amountTextField.textProperty().addListener(new ChangeListener<String>(){
        @Override
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
            number = Long.parseLong(newValue);
            amount = BigDecimal.valueOf(number);
            //amountTextField.setText(currency.format(amount));
            calculate();
        }
    });

    tipTextField.textProperty().addListener(new ChangeListener<String>() {
        @Override
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
            number = Long.parseLong(newValue);
            tip = BigDecimal.valueOf(number);
            //tipTextField.setText(currency.format(tip));
        }
    });

    totalTextField.textProperty().addListener(new ChangeListener<String>() {
        @Override
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
            number = Long.parseLong(newValue);
            total = BigDecimal.valueOf(number);
            //totalTextField.setText(currency.format(total));
        }
    });

    tipPercentageSlider.valueProperty().addListener(new ChangeListener<Number>() {
        @Override
        public void changed(ObservableValue<? extends Number> ov, Number oldValue, Number newValue) {
            tipPercentage = BigDecimal.valueOf(newValue.intValue() / 100.0);
            tipPercentageLabel.setText(percent.format(tipPercentage));
            totalTextField.setText(currency.format(total));
            perPersonTextField.setText(currency.format(splitTip));
        }
   });

 }

}

Повторяющаяся ошибка в трассировке стека: Исключение в потоке "Поток приложения JavaFX" java.lang.RuntimeException: Невозможно установить связанное значение.в javafx.scene.control.TextInputControl $ TextProperty.set (TextInputControl.java:1321) в javafx.scene.control.TextInputControl.setText (TextInputControl.java:349) в приложении.TipCalculatorControl2.application.TipCalculatorController2.access $ 0 (TipCalculatorController2.java:57) в application.TipCalculatorController2 $ 4. Изменено (TipCalculatorController2.java:116)

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