You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 10:04:35