JavaFX提示计算器滑块

JavaFX提示计算器滑块,java,javafx,Java,Javafx,所以我正在尝试学习使用JavaFX和scene builder,但是我在尝试使用小费计算器时遇到了一个问题,因为我正在尝试使用它,这样当我移动滑块来更改小费百分比时,小费金额和总额会自动更改,而无需单击“计算”按钮,下面是代码,还有一张应用程序的图片!感谢您的帮助 package-tipcalculator; 导入java.math.BigDecimal; 导入java.math.RoundingMode; 导入java.text.NumberFormat; 导入javafx.beans.va

所以我正在尝试学习使用JavaFX和scene builder,但是我在尝试使用小费计算器时遇到了一个问题,因为我正在尝试使用它,这样当我移动滑块来更改小费百分比时,小费金额和总额会自动更改,而无需单击“计算”按钮,下面是代码,还有一张应用程序的图片!感谢您的帮助

package-tipcalculator;
导入java.math.BigDecimal;
导入java.math.RoundingMode;
导入java.text.NumberFormat;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.event.ActionEvent;
导入javafx.fxml.fxml;
导入javafx.scene.control.Label;
导入javafx.scene.control.Slider;
导入javafx.scene.control.TextField;
/**
*
*@作者joshd
*/
公共类TipCalculator控制器{
私有静态final NumberFormat currency=NumberFormat.getCurrencyInstance();
专用静态最终数字格式百分比
=NumberFormat.getPercentInstance();
私有BigDecimal TipperEntage=新的BigDecimal(0.15);
@FXML
私有TextField amountTextField;
@FXML
自有品牌tipPercentageLabel;
@FXML
私人滑杆式翻斗车;
@FXML
私有文本字段tipTextField;
@FXML
私有文本字段totalTextField;
@FXML
private void CalculateButton按下(ActionEvent事件){
试一试{
BigDecimal金额=新的BigDecimal(amountTextField.getText());
BigDecimal tip=金额乘以(TipperEntage);
BigDecimal合计=金额。添加(提示);
tipTextField.setText(currency.format(tip));
totalTextField.setText(currency.format(total));
}捕获(NumberFormatException ex){
amountTextField.setText(“输入金额”);
amountTextField.selectAll();
amountTextField.requestFocus();
}
}
公共无效初始化(){
货币。设置舍入模式(舍入模式。向上舍入一半);
TipperEntageSlider.valueProperty().addListener(新的ChangeListener()){
@凌驾

public void已更改(observeValue将侦听器添加到更新计算的
amountTextField
text
属性和
tipPercentageSlider
value
属性中。此外,您可以使用绑定设置
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());
}

将侦听器添加到更新计算的
amountTextField
text
属性和
tipPercentageSlider
value
属性。此外,您可以使用绑定设置
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());
}

这段代码有什么问题?正如我在帖子中所说,我正在尝试获取它,这样当我移动滑块时,它会自动更新总金额和小费金额,而无需按下“计算”按钮,但无论我尝试什么,它要么根本不起作用,要么给我一个参数不匹配错误。您需要向我们展示您的尝试,并解释到底什么不起作用。如果您只是将代码从
calculateButtonPressed
复制并粘贴到
TipperEntageSlider
的侦听器,会发生什么情况?此代码有什么问题?正如我在帖子中所说,我正在尝试获取它,这样当我移动滑块时,它会自动更新总金额和小费金额,而无需按“计算”按钮,但无论我尝试什么,它要么根本不起作用,要么给我一个参数不匹配错误。您需要向我们展示您的尝试,并解释到底什么不起作用。如果您只是将代码从
calculateButtonPressed
复制并粘贴到
TipperEntageSlider
的侦听器,会发生什么?