JavaFX 小费计算器 slider

标签 java javafx

所以我正在尝试学习使用 JavaFX 和场景生成器,但是我在尝试让小费计算器工作时遇到了问题,因为我试图得到它,以便当我移动 slider 更改小费百分比,小费金额和总额会自动更改,无需单击计算按钮,这里是代码和应用程​​序的图片!任何帮助表示赞赏!

Tip Calculator

package tipcalculator;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.control.TextField;

/**
 *
 * @author joshd
 */
public class TipCalculatorController {

    private static final NumberFormat currency = NumberFormat.getCurrencyInstance();
    private static final NumberFormat percent
            = NumberFormat.getPercentInstance();
    private BigDecimal tipPercentage = new BigDecimal(0.15);
    @FXML
    private TextField amountTextField;
    @FXML
    private Label tipPercentageLabel;
    @FXML
    private Slider tipPercentageSlider;
    @FXML
    private TextField tipTextField;
    @FXML
    private TextField totalTextField;

    @FXML
    private void calculateButtonPressed(ActionEvent event) {
        try {
            BigDecimal amount = new BigDecimal(amountTextField.getText());
            BigDecimal tip = amount.multiply(tipPercentage);
            BigDecimal total = amount.add(tip);
            tipTextField.setText(currency.format(tip));
            totalTextField.setText(currency.format(total));
        } catch (NumberFormatException ex) {
            amountTextField.setText("Enter amount");
            amountTextField.selectAll();
            amountTextField.requestFocus();
        }
    }

    public void initialize() {
        currency.setRoundingMode(RoundingMode.HALF_UP);
        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));
            }
        }); 
    }

}

最佳答案

amountTextFieldtext 属性和 tipPercentageSlidervalue 属性添加监听器以更新计算。此外,您可以使用绑定(bind)来设置 tipPercentageLabel 的文本:

private static final NumberFormat currency = NumberFormat.getCurrencyInstance();
private static final BigDecimal HUNDRED = BigDecimal.valueOf(100);

@FXML
private TextField amountTextField;
@FXML
private Label tipPercentageLabel;
@FXML
private Slider tipPercentageSlider;
@FXML
private TextField tipTextField;
@FXML
private TextField totalTextField;

private void update() {
    BigDecimal amount;
    try {
        amount = new BigDecimal(amountTextField.getText());
    } catch (NumberFormatException ex) {
        tipTextField.setText("Invalid Input");
        totalTextField.setText("Invalid Input");
        return;
    }
    BigDecimal tipFactor = BigDecimal.valueOf(tipPercentageSlider.getValue()).divide(HUNDRED, 2, RoundingMode.HALF_UP);
    BigDecimal tip = amount.multiply(tipFactor);
    BigDecimal total = amount.add(tip);
    tipTextField.setText(currency.format(tip));
    totalTextField.setText(currency.format(total));
}

@FXML
private void initialize() {
    // assuming slider value = 100 -> 100%
    tipPercentageLabel.textProperty().bind(tipPercentageSlider.valueProperty().asString("%.0f %%"));

    currency.setRoundingMode(RoundingMode.HALF_UP);
    tipPercentageSlider.valueProperty().addListener(o -> update());
    amountTextField.textProperty().addListener(o -> update());
}

关于JavaFX 小费计算器 slider ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49972662/

相关文章:

java - Hibernate多对多关系查询

java - 与 JSSC 的同步/异步串口通信

java - 在java中存储数字对

java - BC 日期、LocalDate 和 DatePicker

eclipse - 无法从 Eclipse 部署 JavaFX 2 jar

java - 在 JavaFX 中使用 CheckBox 更新 TableRow

java - 使用 DirectoryChooser 保存文件时访问被拒绝

JavaFx如何使用时间轴移动窗口位置

java - 与 Sentry 分组

Java-高效地执行 .setBounds(int, int, int, int);