Java Swing成绩计算器中do-while循环退出、弹窗异常及输入框清空问题咨询
Java Swing成绩计算器中do-while循环退出、弹窗异常及输入框清空问题咨询
嘿,我来帮你搞定这两个问题!咱们一步步拆解和解决:
问题1:do-while循环弹窗异常与输入校验问题
你当前的循环逻辑没处理好输入有效性校验和循环终止条件,导致点击弹窗的Yes后一直重复,甚至未填完输入框就触发了后续逻辑。解决思路是:
- 在计算成绩前先校验所有输入框是否都填写了合法数字
- 用弹窗的返回值来控制是否继续循环,而不是把do-while直接放在计算后
问题2:输入框清空实现
你可以写一个专门的clearInput()方法,遍历所有分数输入框清空内容,同时重置结果标签和表格数据,在用户选择继续时调用这个方法。
修改后的完整代码
import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class finals extends JFrame { private JTextField[] txtScores; private JButton btnCalculate; private JLabel lblResult; private JTable tblGrades; private DefaultTableModel tableModel; public finals() { setTitle("Grade Calculator"); setSize(600, 400); setDefaultCloseOperation(EXIT_ON_CLOSE); setLayout(new BorderLayout()); // 输入面板 JPanel inputPanel = new JPanel(); inputPanel.setLayout(new GridLayout(0, 2)); txtScores = new JTextField[7]; // 7科成绩输入框 for (int i = 0; i < txtScores.length; i++) { inputPanel.add(new JLabel("科目 " + (i + 1) + " 成绩:")); txtScores[i] = new JTextField(); inputPanel.add(txtScores[i]); } add(inputPanel, BorderLayout.NORTH); // 计算按钮 btnCalculate = new JButton("计算成绩"); add(btnCalculate, BorderLayout.CENTER); // 结果面板(包含标签和表格) JPanel resultPanel = new JPanel(new BorderLayout()); lblResult = new JLabel("请输入所有科目成绩后点击计算", JLabel.CENTER); resultPanel.add(lblResult, BorderLayout.NORTH); // 成绩表格 String[] columnNames = {"科目", "成绩", "等级"}; tableModel = new DefaultTableModel(columnNames, 0); tblGrades = new JTable(tableModel); resultPanel.add(new JScrollPane(tblGrades), BorderLayout.CENTER); add(resultPanel, BorderLayout.SOUTH); // 按钮点击事件 btnCalculate.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { boolean isValidInput = true; double[] scores = new double[txtScores.length]; String[] grades = new String[txtScores.length]; // 1. 校验输入并转换成绩 for (int i = 0; i < txtScores.length; i++) { String input = txtScores[i].getText().trim(); if (input.isEmpty()) { JOptionPane.showMessageDialog(null, "请填写所有科目成绩!", "输入错误", JOptionPane.ERROR_MESSAGE); isValidInput = false; break; } try { scores[i] = Double.parseDouble(input); // 简单的等级判定(可根据需求调整) if (scores[i] >= 90) grades[i] = "A"; else if (scores[i] >= 80) grades[i] = "B"; else if (scores[i] >= 70) grades[i] = "C"; else if (scores[i] >= 60) grades[i] = "D"; else grades[i] = "F"; } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(null, "科目 " + (i + 1) + " 请输入有效数字!", "输入错误", JOptionPane.ERROR_MESSAGE); isValidInput = false; break; } } if (!isValidInput) return; // 2. 计算平均分并显示结果 double average = 0; for (double score : scores) average += score; average /= scores.length; lblResult.setText("平均分: " + String.format("%.2f", average) + " | 整体等级: " + getGrade(average)); // 3. 更新表格数据 tableModel.setRowCount(0); for (int i = 0; i < scores.length; i++) { tableModel.addRow(new Object[]{"科目 " + (i + 1), scores[i], grades[i]}); } // 4. 询问是否继续计算 int choice = JOptionPane.showConfirmDialog(null, "是否继续计算新的成绩?", "继续操作", JOptionPane.YES_NO_OPTION); if (choice == JOptionPane.YES_OPTION) { clearInput(); // 用户选择继续,清空输入 } else { dispose(); // 用户选择退出,关闭窗口 } } }); setLocationRelativeTo(null); // 窗口居中 setVisible(true); } // 清空输入的方法 private void clearInput() { for (JTextField txt : txtScores) { txt.setText(""); // 清空每个输入框 } lblResult.setText("请输入所有科目成绩后点击计算"); // 重置结果标签 tableModel.setRowCount(0); // 清空表格数据 } // 根据平均分获取等级 private String getGrade(double average) { if (average >= 90) return "A"; else if (average >= 80) return "B"; else if (average >= 70) return "C"; else if (average >= 60) return "D"; else return "F"; } public static void main(String[] args) { SwingUtilities.invokeLater(finals::new); } }
关键修改点说明
- 输入校验:在计算前遍历所有输入框,检查是否为空或非数字,有问题直接弹窗提示并终止后续逻辑
- 循环控制:用
JOptionPane.showConfirmDialog的返回值判断用户选择,点击Yes就调用clearInput()重置,点击No就关闭窗口 - 清空逻辑:
clearInput()方法统一处理输入框、结果标签和表格的重置,代码更整洁
这样调整后,就能解决你遇到的弹窗重复、输入未完成就触发逻辑的问题,同时实现了点击Yes清空输入的需求。
备注:内容来源于stack exchange,提问作者roms
相关产品推荐
相关产品推荐

