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是是否得分):
- 定义全局变量:
private Map<Integer, Boolean> questionScoreMap = new HashMap<>();
- 修改
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
相关产品推荐
相关产品推荐

