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

Java+MySQL考试系统单选框取消选中后分数不递减问题求助

问题分析与解决方案

嘿,我来帮你搞定这两个头疼的问题!先拆解下代码里的核心问题,然后一步步修复:


1. 单选框无法清空的问题

你的answercheck()方法逻辑有明显错误,而且切换题目时没有重置单选框状态,导致状态混乱:

错误点:

  • 在if(r1.isSelected())的else分支里,你居然把r2/r3/r4设为setSelected(true),这完全搞反了逻辑——这个分支本来是处理r1未选中的情况,结果反而把其他单选框全选中了,直接导致单选框状态错乱。
  • 切换上/下一题时,没有清空所有单选框的选中状态,上一题的选择会残留到下一题。

修复方案:

第一步:重构answercheck()的单选框逻辑

删掉那些错误的else分支,单选框本身是互斥的,只要处理选中的那个,其他显式设为未选中即可(用ButtonGroup管理会更省心,后面会提):

public void answercheck() {
    String studentanswer = "";
    
    if(r1.isSelected()) {
        studentanswer = r1.getText();
        r2.setSelected(false);
        r3.setSelected(false);
        r4.setSelected(false);
    } else if(r2.isSelected()) {
        studentanswer = r2.getText();
        r1.setSelected(false);
        r3.setSelected(false);
        r4.setSelected(false);
    } else if(r3.isSelected()) {
        studentanswer = r3.getText();
        r1.setSelected(false);
        r2.setSelected(false);
        r4.setSelected(false);
    } else if(r4.isSelected()) {
        studentanswer = r4.getText();
        r1.setSelected(false);
        r2.setSelected(false);
        r3.setSelected(false);
    } else {
        // 没有选中任何选项的情况
        studentanswer = "";
    }

    // 分数计算逻辑后面再调整
}

第二步:切换题目时清空单选框

在下一题和上一题按钮逻辑的末尾,添加清空代码:

// 下一题按钮逻辑末尾添加
r1.setSelected(false);
r2.setSelected(false);
r3.setSelected(false);
r4.setSelected(false);

// 上一题按钮逻辑末尾也添加同样代码
r1.setSelected(false);
r2.setSelected(false);
r3.setSelected(false);
r4.setSelected(false);

2. 改选错误答案时分数不回0的问题

当前你的分数逻辑是只要选中正确答案就加1分,但没有处理「之前选对现在改选错」的回退场景,还可能出现重复加分的情况(比如多次点同一正确答案会重复累加)。

错误点:

  • 没有记录每道题的得分状态,全局累加的方式无法回退分数。
  • 每次调用answercheck()都会执行加分逻辑,容易重复计分。

修复方案:

我们可以给每道题维护一个得分状态,确保每道题最多得1分,选错时能回退分数:

方案一:用全局变量记录当前题得分状态

添加一个全局变量private boolean currentQuestionScored = false;,用来标记当前题是否已经获得分数:

修改answercheck()的分数计算部分:

// 判断当前答案是否正确
boolean isCorrect = studentanswer.equals(answer);

if(isCorrect) {
    // 只有当前题还没得分时,才加1分
    if(!currentQuestionScored) {
        marks += 1;
        currentQuestionScored = true;
    }
} else {
    // 如果之前这道题得分了,现在改选错,要扣回1分
    if(currentQuestionScored) {
        marks -= 1;
        currentQuestionScored = false;
    }
}

// 更新分数显示
txtc.setText(String.valueOf(marks));

然后在**切换题目(上/下一题)**时,重置这个状态:

// 下一题按钮逻辑里添加
currentQuestionScored = false;

// 上一题按钮逻辑里也添加
currentQuestionScored = false;

方案二:用Map记录所有题的得分(更严谨)

如果需要支持来回切换题目时保留每道题的选择和得分,可以用Map<Integer, Boolean>存储(key是题目id,value是是否得分):

  1. 定义全局变量:
private Map<Integer, Boolean> questionScoreMap = new HashMap<>();
  1. 修改answercheck():
// 获取当前题目id
int currentQuestionId = Integer.parseInt(txtqu.getText());
String studentanswer = "";

// 单选框处理逻辑和之前一致...

boolean isCorrect = studentanswer.equals(answer);
Boolean previousScore = questionScoreMap.get(currentQuestionId);

if(isCorrect) {
    // 之前没得分才加分
    if(previousScore == null || !previousScore) {
        marks += 1;
        questionScoreMap.put(currentQuestionId, true);
    }
} else {
    // 之前得分了就扣分
    if(previousScore != null && previousScore) {
        marks -= 1;
        questionScoreMap.put(currentQuestionId, false);
    }
}

txtc.setText(String.valueOf(marks));

额外的小优化建议

  • 你的Connection()方法里,while(rs.next())会遍历所有题目,最后只显示最后一道题,这明显不对!去掉while循环,只加载第一条数据:
public void Connection() {
    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://localhost/onlineex","root","");
        stat = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
        rs = stat.executeQuery("select id,question,option1,option2,option3,option4,answer from questions order by id DESC");
        // 只加载第一条数据
        if(rs.next()) {
            txtqu.setText(rs.getString("id"));
            txtques.setText(rs.getString("question"));
            r1.setText(rs.getString(3));
            r2.setText(rs.getString(4));
            r3.setText(rs.getString(5));
            r4.setText(rs.getString(6));
            answer = rs.getString(7);
        }
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace(); // 不要空catch,打印异常方便调试
    } catch (SQLException ex) {
        ex.printStackTrace();
    }
}
  • 用ButtonGroup管理单选框,默认就会互斥,不需要手动设置其他单选框为未选中,代码更简洁。
  • 不要留空的catch块,打印异常信息能帮你快速定位问题。

内容的提问来源于stack exchange,提问作者kishan sooo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:47:47