JavaFX作业求助:替换TextField为ComboBox后计算功能失效
JavaFX年份ComboBox替换TextField后的问题解决
核心问题分析
- 局部变量覆盖成员变量:
start方法中重新声明了ComboBox<Integer> yearCombo = new ComboBox<>();,覆盖了类的成员变量yearCombo,导致calculateButtonClicked方法中访问的成员变量未绑定到界面控件,调用getValue()会出错。 - 旧TextField引用未清理:代码仍保留
yearsField.getText()调用,但yearsField已被替换为ComboBox,此时yearsField为null,触发空指针异常。 - 验证逻辑不匹配:ComboBox选中值为Integer类型,无需用文本解析验证,应直接检查是否有选中项。
具体修改步骤
1. 修复变量覆盖问题
删除start方法中局部的ComboBox声明,直接使用类成员变量:
grid.add(new Label("Years:"), 0, 2); // 移除局部变量声明,直接使用成员变量yearCombo yearCombo.setPromptText("Select Years"); Integer[] years = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; for(int year: years){ yearCombo.getItems().add(year); } grid.add(yearCombo, 1,2);
2. 清理旧TextField引用
- 删除类成员变量
private TextField yearsField; - 修改
calculateButtonClicked中的验证与取值逻辑:
private void calculateButtonClicked() { Validation v = new Validation(); String errorMsg = ""; errorMsg += v.isDouble(investmentField.getText(), "Monthly Investment"); errorMsg += v.isDouble(interestRateField.getText(), "Yearly Interest Rate"); // 替换原文本验证,检查ComboBox是否选中 if (yearCombo.getValue() == null) { errorMsg += "Please select a value for Years.\n"; } if (errorMsg.isEmpty()) { double investment = Double.parseDouble(investmentField.getText()); double rate = Double.parseDouble(interestRateField.getText()); // 直接获取ComboBox选中值 int years = yearCombo.getValue(); // 后续计算逻辑... } else { Alert alert = new Alert(Alert.AlertType.ERROR); alert.setHeaderText("Invalid Data"); alert.setContentText(errorMsg); alert.showAndWait(); } }
3. 修复年份计算错误
calculateFutureValue方法中currentYear的运算顺序错误,修改为:
// 原错误代码:int currentYear = (i-1/12+1); int currentYear = (i-1)/12 + 1;
4. 修复结果展示错误
原代码试图格式化ListView对象,需改为格式化最终计算的未来值。可修改calculateFutureValue返回结果与ListView:
import javafx.util.Pair; public Pair<ListView<String>, Double> calculateFutureValue(double investment, double rate, int years) { double futureValue = 0.0; ListView<String> listview = new ListView<>(); double monthlyInterestRate = rate / 12 / 100; int months = years * 12; for (int i = 1; i <= months; i++) { futureValue = (futureValue + investment) * (1 + monthlyInterestRate); int currentYear = (i-1)/12 + 1; if(i % 12 == 0){ listview.getItems().add("Year " + currentYear + ": $" + String.format("%.2f", futureValue)); } } return new Pair<>(listview, futureValue); }
然后在calculateButtonClicked中接收结果:
Pair<ListView<String>, Double> result = calculateFutureValue(investment, rate, years); futureValueView.getItems().setAll(result.getKey().getItems()); NumberFormat currency = NumberFormat.getCurrencyInstance(); futureValueField.setText(currency.format(result.getValue()));
内容的提问来源于stack exchange,提问作者Puddy Dub
相关产品推荐
相关产品推荐

