如何解决Java Swing中相邻JTextField乘积仅显示最后结果的问题
问题解决:Java Swing中EARNING字段未正确显示对应组乘积
问题原因分析
你的代码逻辑存在两处核心错误,导致所有EARNING字段只显示最后一组的乘积:
- 嵌套循环覆盖计算结果:内层循环
for(JTextField fields : arr1.subList(i, arr1.size()))会持续用当前TOTAL文本框与POINTS列表中从第i位到末尾的元素相乘,每次都会覆盖summation的值,最终summation仅保留当前TOTAL与最后一个POINTS的乘积。 - 批量赋值同一结果:最后遍历
arr2时,将所有EARNING文本框都设置为同一个summation(即最后一组的计算结果),自然所有字段显示相同值。
修正后的代码
private void calcCredit() { try { // 校验三组字段数量一致,避免索引越界 if (arr.size() != arr1.size() || arr.size() != arr2.size()) { return; } // 按索引遍历每组对应的TOTAL、POINTS、EARNING字段 for (int i = 0; i < arr.size(); i++) { JTextField totalField = arr.get(i); JTextField pointsField = arr1.get(i); JTextField earningField = arr2.get(i); // 解析数值并计算乘积 double total = Double.parseDouble(totalField.getText()); double points = Double.parseDouble(pointsField.getText()); double earning = total * points; // 赋值给对应位置的EARNING字段 earningField.setText(String.valueOf(earning)); } } catch (NumberFormatException ex) { // 处理用户输入非数字的情况 ex.printStackTrace(); // 可添加提示用户输入合法数值的逻辑,例如:JOptionPane.showMessageDialog(null, "请输入有效的数字"); } catch (Exception ex) { ex.printStackTrace(); } }
关键改动说明
- 取消嵌套循环,按索引一一对应:直接遍历数组索引,确保每组的TOTAL、POINTS、EARNING字段严格匹配,避免无效的多对一计算。
- 添加长度校验:防止因三组字段数量不一致导致的索引越界异常。
- 细化异常处理:将空catch块改为捕获具体的
NumberFormatException,便于调试用户输入错误的场景,同时保留通用异常捕获。 - 实时赋值对应字段:每组计算完成后立即将结果赋值给对应的EARNING文本框,保证每组结果独立显示。
内容的提问来源于stack exchange,提问作者CSE
相关产品推荐
相关产品推荐

