package com.example.myapp.controller; import com.example.myapp.Main; import com.example.myapp.model.Exam; import com.example.myapp.model.Question; import com.example.myapp.service.ExamService; import javafx.fxml.FXML; import javafx.scene.control.*; public class ExamController { @FXML private Label questionNumberLabel; @FXML private Label questionTextLabel; @FXML private RadioButton optionARadio; @FXML private RadioButton optionBRadio; @FXML private RadioButton optionCRadio; @FXML private RadioButton optionDRadio; @FXML private Label optionALabel; @FXML private Label optionBLabel; @FXML private Label optionCLabel; @FXML private Label optionDLabel; @FXML private Button previousBtn; @FXML private Button nextBtn; @FXML private Button submitBtn; @FXML private ProgressIndicator progressIndicator; private String email; private ExamService examService = ExamService.getInstance(); private int currentQuestionIndex = 0; private ToggleGroup optionsToggleGroup; // 添加初始化方法,使用 @FXML 注解确保在FXML加载后立即执行 @FXML public void initialize() { // 在这里初始化 ToggleGroup,确保在FXML加载完成后立即执行 this.optionsToggleGroup = new ToggleGroup(); optionARadio.setToggleGroup(optionsToggleGroup); optionBRadio.setToggleGroup(optionsToggleGroup); optionCRadio.setToggleGroup(optionsToggleGroup); optionDRadio.setToggleGroup(optionsToggleGroup); // 设置默认禁用状态 previousBtn.setDisable(true); submitBtn.setDisable(true); } public void initExam(String email) { this.email = email; // 确保有考试数据 Exam exam = examService.getCurrentExam(email); if (exam == null || exam.getQuestions().isEmpty()) { showAlert("错误", "没有找到考试数据,请重新选择学段"); try { Main.showGradeSelection(email); } catch (Exception e) { e.printStackTrace(); } return; } loadQuestion(0); } @FXML public void onPreviousQuestion() { saveCurrentAnswer(); if (currentQuestionIndex > 0) { loadQuestion(currentQuestionIndex - 1); } } @FXML public void onNextQuestion() { saveCurrentAnswer(); Exam exam = examService.getCurrentExam(email); if (currentQuestionIndex < exam.getQuestions().size() - 1) { loadQuestion(currentQuestionIndex + 1); } } @FXML public void onSubmitExam() { saveCurrentAnswer(); // 计算分数 int score = examService.calculateScore(email); // 显示分数界面 try { Main.showScorePage(email, score); } catch (Exception e) { e.printStackTrace(); } } private void loadQuestion(int index) { Exam exam = examService.getCurrentExam(email); if (exam == null || index < 0 || index >= exam.getQuestions().size()) { return; } currentQuestionIndex = index; Question question = exam.getQuestions().get(index); // 更新界面 questionNumberLabel.setText("第 " + (index + 1) + " 题 / 共 " + exam.getQuestions().size() + " 题"); questionTextLabel.setText(question.getQuestionText()); optionALabel.setText("A. " + question.getOptionA()); optionBLabel.setText("B. " + question.getOptionB()); optionCLabel.setText("C. " + question.getOptionC()); optionDLabel.setText("D. " + question.getOptionD()); // 清除选择 optionsToggleGroup.selectToggle(null); // 恢复用户之前的选择 if (question.getUserAnswer() != null) { switch (question.getUserAnswer()) { case "A": optionARadio.setSelected(true); break; case "B": optionBRadio.setSelected(true); break; case "C": optionCRadio.setSelected(true); break; case "D": optionDRadio.setSelected(true); break; } } // 更新按钮状态 previousBtn.setDisable(index == 0); nextBtn.setDisable(index == exam.getQuestions().size() - 1); submitBtn.setDisable(index != exam.getQuestions().size() - 1); // 更新进度 progressIndicator.setProgress((double) (index + 1) / exam.getQuestions().size()); } private void saveCurrentAnswer() { // 添加空值检查 if (optionsToggleGroup == null) { return; } RadioButton selectedRadio = (RadioButton) optionsToggleGroup.getSelectedToggle(); if (selectedRadio != null) { String answer = ""; if (selectedRadio == optionARadio) answer = "A"; else if (selectedRadio == optionBRadio) answer = "B"; else if (selectedRadio == optionCRadio) answer = "C"; else if (selectedRadio == optionDRadio) answer = "D"; examService.submitAnswer(email, currentQuestionIndex, answer); } } private void showAlert(String title, String message) { Alert alert = new Alert(Alert.AlertType.ERROR); alert.setTitle(title); alert.setHeaderText(null); alert.setContentText(message); alert.showAndWait(); } }