package view; import controller.ExamController; import model.Question; import javax.swing.*; import java.awt.*; import java.util.List; public class ExamFrame extends JFrame { private List questions; private int current = 0; private int[] answers; private ButtonGroup group; private JButton nextBtn; private JButton prevBtn; public ExamFrame(ExamController controller, List questions) { this.questions = questions; this.answers = new int[questions.size()]; for (int i = 0; i < answers.length; i++) answers[i] = -1; setTitle("考试"); setSize(500, 300); setLocationRelativeTo(null); JPanel panel = new JPanel(new BorderLayout()); JLabel questionLabel = new JLabel(); group = new ButtonGroup(); JRadioButton[] options = new JRadioButton[4]; JPanel optionsPanel = new JPanel(new GridLayout(4, 1)); for (int i = 0; i < 4; i++) { options[i] = new JRadioButton(); group.add(options[i]); optionsPanel.add(options[i]); int index = i; options[i].addActionListener(e -> answers[current] = index); } prevBtn = new JButton("上一题"); nextBtn = new JButton("下一题"); JButton submit = new JButton("提交"); JPanel buttonPanel = new JPanel(); prevBtn.addActionListener(e -> showQuestion(current - 1, questionLabel, options)); nextBtn.addActionListener(e -> { if (current == questions.size() - 1) { // 已经是最后一题,提示用户 JOptionPane.showMessageDialog(this, "已经是最后一题!\n请点击提交按钮完成考试。", "提示", JOptionPane.INFORMATION_MESSAGE); } else { showQuestion(current + 1, questionLabel, options); } }); submit.addActionListener(e -> { // 检查是否有未答题目 int unanswered = 0; for (int answer : answers) { if (answer == -1) unanswered++; } String message; if (unanswered > 0) { message = "还有 " + unanswered + " 道题目未作答,确定要提交吗?"; } else { message = "确定要提交试卷吗?"; } // 确认提交对话框 int result = JOptionPane.showConfirmDialog( this, message, "确认提交", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE ); if (result == JOptionPane.YES_OPTION) { int score = 0; for (int i = 0; i < questions.size(); i++) { if (answers[i] == questions.get(i).getCorrectAnswer()) score++; } controller.showResult(score, questions.size()); dispose(); } }); buttonPanel.add(prevBtn); buttonPanel.add(nextBtn); buttonPanel.add(submit); panel.add(questionLabel, BorderLayout.NORTH); panel.add(optionsPanel, BorderLayout.CENTER); panel.add(buttonPanel, BorderLayout.SOUTH); add(panel); showQuestion(0, questionLabel, options); setVisible(true); } private void showQuestion(int index, JLabel label, JRadioButton[] options) { if (index < 0 || index >= questions.size()) return; current = index; Question q = questions.get(index); label.setText("第" + (index + 1) + "题: " + q.getContent() + " (" + (index + 1) + "/" + questions.size() + ")"); List optionTexts = q.getOptions().getOptions(); // 先清空所有选项的选择状态 group.clearSelection(); // 设置选项文本,并根据当前题目的答案状态设置选择 for (int i = 0; i < 4; i++) { options[i].setText(optionTexts.get(i)); if (answers[current] == i) { options[i].setSelected(true); } } // 更新按钮状态 updateButtonStates(); } private void updateButtonStates() { // 上一题按钮状态 prevBtn.setEnabled(current > 0); // 下一题按钮状态 nextBtn.setEnabled(current < questions.size() - 1); // 如果是最后一题,修改下一题按钮文本为提示 if (current == questions.size() - 1) { nextBtn.setText("最后一题"); } else { nextBtn.setText("下一题"); } } }