所以我正在尝试学习使用 JavaFX 和场景生成器,但是我在尝试让小费计算器工作时遇到了问题,因为我试图得到它,以便当我移动 slider 更改小费百分比,小费金额和总额会自动更改,无需单击计算按钮,这里是代码和应用程序的图片!任何帮助表示赞赏!
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));
}
});
}
}
最佳答案
向 amountTextField
的 text
属性和 tipPercentageSlider
的 value
属性添加监听器以更新计算。此外,您可以使用绑定(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/