pull/5/head
parent
9e2e947c1b
commit
eecf589782
@ -0,0 +1,19 @@
|
||||
import controller.NavigationController;
|
||||
import javax.swing.*;
|
||||
|
||||
public class MathLearningApp {
|
||||
public static void main(String[] args) {
|
||||
// Set system look and feel
|
||||
try {
|
||||
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// Start the application
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
NavigationController.showLoginView();
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,87 @@
|
||||
package controller;
|
||||
|
||||
import model.User;
|
||||
import view.*;
|
||||
|
||||
public class NavigationController {
|
||||
private static LoginView loginView;
|
||||
private static RegisterView registerView;
|
||||
private static MainView mainView;
|
||||
private static ExamView examView;
|
||||
private static ResultView resultView;
|
||||
private static User currentUser; // 保存当前登录用户
|
||||
|
||||
public static void showLoginView() {
|
||||
if (loginView == null) {
|
||||
loginView = new LoginView();
|
||||
}
|
||||
loginView.setVisible(true);
|
||||
hideAllExcept(loginView);
|
||||
}
|
||||
|
||||
public static void showRegisterView() {
|
||||
if (registerView == null) {
|
||||
registerView = new RegisterView();
|
||||
}
|
||||
registerView.setVisible(true);
|
||||
hideAllExcept(registerView);
|
||||
}
|
||||
|
||||
// 修改:传递用户信息到主界面
|
||||
public static void showMainView(User user) {
|
||||
currentUser = user;
|
||||
if (mainView != null) {
|
||||
mainView.dispose(); // 关闭旧的主界面
|
||||
}
|
||||
mainView = new MainView(user); // 创建新的主界面
|
||||
mainView.setVisible(true);
|
||||
hideAllExcept(mainView);
|
||||
}
|
||||
|
||||
// 新增:无参数版本,使用当前保存的用户
|
||||
public static void showMainView() {
|
||||
if (currentUser != null) {
|
||||
showMainView(currentUser);
|
||||
} else {
|
||||
// 如果没有保存的用户,返回登录界面
|
||||
showLoginView();
|
||||
}
|
||||
}
|
||||
|
||||
public static void showExamView(String difficulty, int questionCount) {
|
||||
if (examView == null) {
|
||||
examView = new ExamView();
|
||||
}
|
||||
examView.startNewExam(difficulty, questionCount);
|
||||
examView.setVisible(true);
|
||||
hideAllExcept(examView);
|
||||
}
|
||||
|
||||
public static void showResultView(int score, int total, double percentage) {
|
||||
if (resultView == null) {
|
||||
resultView = new ResultView();
|
||||
}
|
||||
resultView.setResults(score, total, percentage);
|
||||
resultView.setVisible(true);
|
||||
hideAllExcept(resultView);
|
||||
}
|
||||
|
||||
private static void hideAllExcept(javax.swing.JFrame visibleFrame) {
|
||||
javax.swing.JFrame[] frames = {loginView, registerView, mainView, examView, resultView};
|
||||
for (javax.swing.JFrame frame : frames) {
|
||||
if (frame != null && frame != visibleFrame) {
|
||||
frame.setVisible(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 新增:设置当前用户(在登录时调用)
|
||||
public static void setCurrentUser(User user) {
|
||||
currentUser = user;
|
||||
}
|
||||
|
||||
// 新增:获取当前用户
|
||||
public static User getCurrentUser() {
|
||||
return currentUser;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,96 @@
|
||||
package controller;
|
||||
|
||||
import model.Question;
|
||||
import model.QuestionGenerator;
|
||||
import utils.FileUtil;
|
||||
import java.util.*;
|
||||
|
||||
public class QuestionController {
|
||||
private QuestionGenerator generator = new QuestionGenerator();
|
||||
private List<Question> currentQuestions;
|
||||
private int currentQuestionIndex = 0;
|
||||
private int score = 0;
|
||||
private int[] userAnswers;
|
||||
private String currentDifficulty;
|
||||
private int currentQuestionCount;
|
||||
|
||||
public void startNewExam(String difficulty, int questionCount) {
|
||||
currentQuestions = generator.generateQuestions(questionCount, difficulty);
|
||||
currentQuestionIndex = 0;
|
||||
score = 0;
|
||||
userAnswers = new int[questionCount];
|
||||
Arrays.fill(userAnswers, -1);
|
||||
currentDifficulty = difficulty;
|
||||
currentQuestionCount = questionCount;
|
||||
|
||||
// 保存试卷到本地
|
||||
FileUtil.saveCurrentExam(currentQuestions, difficulty, questionCount);
|
||||
|
||||
System.out.println("🎯 生成新试卷: " + difficulty + " 难度, " + questionCount + " 道题");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 获取当前试卷信息
|
||||
*/
|
||||
public String getCurrentExamInfo() {
|
||||
if (currentDifficulty != null && currentQuestionCount > 0) {
|
||||
return currentDifficulty + "难度 - " + currentQuestionCount + "道题";
|
||||
}
|
||||
return "暂无试卷";
|
||||
}
|
||||
|
||||
// 其他方法保持不变...
|
||||
public Question getCurrentQuestion() {
|
||||
if (currentQuestions == null || currentQuestionIndex >= currentQuestions.size()) {
|
||||
return null;
|
||||
}
|
||||
return currentQuestions.get(currentQuestionIndex);
|
||||
}
|
||||
|
||||
public void submitAnswer(int answer) {
|
||||
if (currentQuestionIndex < userAnswers.length) {
|
||||
userAnswers[currentQuestionIndex] = answer;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean nextQuestion() {
|
||||
currentQuestionIndex++;
|
||||
return currentQuestionIndex < currentQuestions.size();
|
||||
}
|
||||
|
||||
public boolean previousQuestion() {
|
||||
if (currentQuestionIndex > 0) {
|
||||
currentQuestionIndex--;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public int calculateScore() {
|
||||
score = 0;
|
||||
for (int i = 0; i < currentQuestions.size(); i++) {
|
||||
if (userAnswers[i] != -1 && currentQuestions.get(i).isCorrect(userAnswers[i])) {
|
||||
score++;
|
||||
}
|
||||
}
|
||||
return score;
|
||||
}
|
||||
|
||||
public double getPercentage() {
|
||||
return (double) score / currentQuestions.size() * 100;
|
||||
}
|
||||
|
||||
public int getCurrentQuestionNumber() {
|
||||
return currentQuestionIndex + 1;
|
||||
}
|
||||
|
||||
public int getTotalQuestions() {
|
||||
return currentQuestions != null ? currentQuestions.size() : 0;
|
||||
}
|
||||
|
||||
public int getUserAnswerForCurrentQuestion() {
|
||||
return userAnswers[currentQuestionIndex];
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,37 @@
|
||||
package model;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
public class Question implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private String question;
|
||||
private String[] options;
|
||||
private int correctAnswer;
|
||||
private String difficulty;
|
||||
|
||||
public Question(String question, String[] options, int correctAnswer, String difficulty) {
|
||||
this.question = question;
|
||||
this.options = options;
|
||||
this.correctAnswer = correctAnswer;
|
||||
this.difficulty = difficulty;
|
||||
}
|
||||
|
||||
// Getters
|
||||
public String getQuestion() { return question; }
|
||||
public String[] getOptions() { return options; }
|
||||
public int getCorrectAnswer() { return correctAnswer; }
|
||||
public String getDifficulty() { return difficulty; }
|
||||
|
||||
public boolean isCorrect(int selectedAnswer) {
|
||||
return selectedAnswer == correctAnswer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Question{" +
|
||||
"question='" + question + '\'' +
|
||||
", difficulty='" + difficulty + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,32 @@
|
||||
package model;
|
||||
|
||||
public class User {
|
||||
private String username; // 新增:用户名
|
||||
private String email;
|
||||
private String password;
|
||||
private String registrationCode;
|
||||
private boolean isRegistered;
|
||||
|
||||
public User(String username, String email, String registrationCode) {
|
||||
this.username = username;
|
||||
this.email = email;
|
||||
this.registrationCode = registrationCode;
|
||||
this.isRegistered = false;
|
||||
}
|
||||
|
||||
// Getters and Setters
|
||||
public String getUsername() { return username; }
|
||||
public void setUsername(String username) { this.username = username; }
|
||||
|
||||
public String getEmail() { return email; }
|
||||
public void setEmail(String email) { this.email = email; }
|
||||
|
||||
public String getPassword() { return password; }
|
||||
public void setPassword(String password) { this.password = password; }
|
||||
|
||||
public String getRegistrationCode() { return registrationCode; }
|
||||
public void setRegistrationCode(String registrationCode) { this.registrationCode = registrationCode; }
|
||||
|
||||
public boolean isRegistered() { return isRegistered; }
|
||||
public void setRegistered(boolean registered) { isRegistered = registered; }
|
||||
}
|
||||
@ -0,0 +1,169 @@
|
||||
package view;
|
||||
|
||||
import controller.NavigationController;
|
||||
import controller.QuestionController;
|
||||
import model.Question;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
|
||||
public class ExamView extends JFrame {
|
||||
private QuestionController questionController;
|
||||
private JLabel questionLabel;
|
||||
private JLabel progressLabel;
|
||||
private ButtonGroup optionGroup;
|
||||
private JRadioButton[] optionButtons;
|
||||
private JButton prevButton;
|
||||
private JButton nextButton;
|
||||
private JButton submitButton;
|
||||
|
||||
public ExamView() {
|
||||
questionController = new QuestionController();
|
||||
initializeUI();
|
||||
}
|
||||
|
||||
private void initializeUI() {
|
||||
setTitle("数学学习软件 - 答题界面");
|
||||
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
setSize(600, 400);
|
||||
setLocationRelativeTo(null);
|
||||
setResizable(false);
|
||||
|
||||
JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
|
||||
mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
|
||||
|
||||
// Progress label
|
||||
progressLabel = new JLabel("", JLabel.CENTER);
|
||||
progressLabel.setFont(new Font("微软雅黑", Font.BOLD, 16));
|
||||
mainPanel.add(progressLabel, BorderLayout.NORTH);
|
||||
|
||||
// Question panel
|
||||
JPanel questionPanel = new JPanel(new BorderLayout(10, 10));
|
||||
questionLabel = new JLabel("", JLabel.CENTER);
|
||||
questionLabel.setFont(new Font("微软雅黑", Font.PLAIN, 18));
|
||||
questionPanel.add(questionLabel, BorderLayout.NORTH);
|
||||
|
||||
// Options panel
|
||||
JPanel optionsPanel = new JPanel(new GridLayout(4, 1, 10, 10));
|
||||
optionGroup = new ButtonGroup();
|
||||
optionButtons = new JRadioButton[4];
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
optionButtons[i] = new JRadioButton();
|
||||
optionButtons[i].setFont(new Font("微软雅黑", Font.PLAIN, 14));
|
||||
optionGroup.add(optionButtons[i]);
|
||||
optionsPanel.add(optionButtons[i]);
|
||||
}
|
||||
|
||||
questionPanel.add(optionsPanel, BorderLayout.CENTER);
|
||||
mainPanel.add(questionPanel, BorderLayout.CENTER);
|
||||
|
||||
// Button panel
|
||||
JPanel buttonPanel = new JPanel(new FlowLayout());
|
||||
prevButton = new JButton("上一题");
|
||||
nextButton = new JButton("下一题");
|
||||
submitButton = new JButton("提交试卷");
|
||||
|
||||
prevButton.setFont(new Font("微软雅黑", Font.PLAIN, 14));
|
||||
nextButton.setFont(new Font("微软雅黑", Font.PLAIN, 14));
|
||||
submitButton.setFont(new Font("微软雅黑", Font.PLAIN, 14));
|
||||
|
||||
buttonPanel.add(prevButton);
|
||||
buttonPanel.add(nextButton);
|
||||
buttonPanel.add(submitButton);
|
||||
|
||||
mainPanel.add(buttonPanel, BorderLayout.SOUTH);
|
||||
|
||||
// Add action listeners
|
||||
prevButton.addActionListener(new PrevButtonAction());
|
||||
nextButton.addActionListener(new NextButtonAction());
|
||||
submitButton.addActionListener(new SubmitButtonAction());
|
||||
|
||||
add(mainPanel);
|
||||
}
|
||||
|
||||
public void startNewExam(String difficulty, int questionCount) {
|
||||
questionController.startNewExam(difficulty, questionCount);
|
||||
displayCurrentQuestion();
|
||||
updateNavigationButtons();
|
||||
}
|
||||
|
||||
private void displayCurrentQuestion() {
|
||||
Question question = questionController.getCurrentQuestion();
|
||||
if (question == null) return;
|
||||
|
||||
progressLabel.setText(String.format("第 %d 题 / 共 %d 题",
|
||||
questionController.getCurrentQuestionNumber(),
|
||||
questionController.getTotalQuestions()));
|
||||
|
||||
questionLabel.setText(question.getQuestion());
|
||||
|
||||
String[] options = question.getOptions();
|
||||
for (int i = 0; i < 4; i++) {
|
||||
optionButtons[i].setText((char)('A' + i) + ". " + options[i]);
|
||||
}
|
||||
|
||||
// Restore user's previous selection
|
||||
int userAnswer = questionController.getUserAnswerForCurrentQuestion();
|
||||
optionGroup.clearSelection();
|
||||
if (userAnswer != -1) {
|
||||
optionButtons[userAnswer].setSelected(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateNavigationButtons() {
|
||||
int current = questionController.getCurrentQuestionNumber();
|
||||
int total = questionController.getTotalQuestions();
|
||||
|
||||
prevButton.setEnabled(current > 1);
|
||||
nextButton.setEnabled(current < total);
|
||||
submitButton.setEnabled(current == total);
|
||||
}
|
||||
|
||||
private void saveCurrentAnswer() {
|
||||
for (int i = 0; i < 4; i++) {
|
||||
if (optionButtons[i].isSelected()) {
|
||||
questionController.submitAnswer(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class PrevButtonAction implements ActionListener {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
saveCurrentAnswer();
|
||||
if (questionController.previousQuestion()) {
|
||||
displayCurrentQuestion();
|
||||
updateNavigationButtons();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class NextButtonAction implements ActionListener {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
saveCurrentAnswer();
|
||||
if (questionController.nextQuestion()) {
|
||||
displayCurrentQuestion();
|
||||
updateNavigationButtons();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class SubmitButtonAction implements ActionListener {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
saveCurrentAnswer();
|
||||
|
||||
int score = questionController.calculateScore();
|
||||
int total = questionController.getTotalQuestions();
|
||||
double percentage = questionController.getPercentage();
|
||||
|
||||
NavigationController.showResultView(score, total, percentage);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,106 @@
|
||||
package view;
|
||||
|
||||
import controller.NavigationController;
|
||||
import controller.UserController;
|
||||
import model.User;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
|
||||
public class LoginView extends JFrame {
|
||||
private JTextField usernameField; // 新增:用户名字段
|
||||
private JPasswordField passwordField;
|
||||
private UserController userController;
|
||||
|
||||
public LoginView() {
|
||||
userController = new UserController();
|
||||
initializeUI();
|
||||
}
|
||||
|
||||
private void initializeUI() {
|
||||
setTitle("数学学习软件 - 登录");
|
||||
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
setSize(400, 300);
|
||||
setLocationRelativeTo(null);
|
||||
setResizable(false);
|
||||
|
||||
JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
|
||||
mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
|
||||
|
||||
// Title
|
||||
JLabel titleLabel = new JLabel("用户登录", JLabel.CENTER);
|
||||
titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 24));
|
||||
mainPanel.add(titleLabel, BorderLayout.NORTH);
|
||||
|
||||
// Form panel - 修改为用户名和密码
|
||||
JPanel formPanel = new JPanel(new GridLayout(3, 2, 10, 10));
|
||||
|
||||
JLabel usernameLabel = new JLabel("用户名:"); // 修改:改为用户名
|
||||
usernameLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14));
|
||||
usernameField = new JTextField(); // 初始化用户名字段
|
||||
|
||||
JLabel passwordLabel = new JLabel("密码:");
|
||||
passwordLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14));
|
||||
passwordField = new JPasswordField();
|
||||
|
||||
formPanel.add(usernameLabel);
|
||||
formPanel.add(usernameField);
|
||||
formPanel.add(passwordLabel);
|
||||
formPanel.add(passwordField);
|
||||
|
||||
// Buttons
|
||||
JPanel buttonPanel = new JPanel(new FlowLayout());
|
||||
JButton loginButton = new JButton("登录");
|
||||
JButton registerButton = new JButton("注册");
|
||||
|
||||
loginButton.setFont(new Font("微软雅黑", Font.PLAIN, 14));
|
||||
registerButton.setFont(new Font("微软雅黑", Font.PLAIN, 14));
|
||||
|
||||
buttonPanel.add(loginButton);
|
||||
buttonPanel.add(registerButton);
|
||||
|
||||
formPanel.add(new JLabel()); // Empty cell
|
||||
formPanel.add(buttonPanel);
|
||||
|
||||
mainPanel.add(formPanel, BorderLayout.CENTER);
|
||||
|
||||
// Add action listeners
|
||||
loginButton.addActionListener(new LoginAction());
|
||||
registerButton.addActionListener(e -> {
|
||||
NavigationController.showRegisterView();
|
||||
});
|
||||
|
||||
// Enter key support
|
||||
usernameField.addActionListener(new LoginAction());
|
||||
passwordField.addActionListener(new LoginAction());
|
||||
|
||||
add(mainPanel);
|
||||
}
|
||||
|
||||
private class LoginAction implements ActionListener {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
String username = usernameField.getText().trim();
|
||||
String password = new String(passwordField.getPassword());
|
||||
|
||||
if (username.isEmpty() || password.isEmpty()) {
|
||||
JOptionPane.showMessageDialog(LoginView.this,
|
||||
"请输入用户名和密码", "错误", JOptionPane.ERROR_MESSAGE);
|
||||
return;
|
||||
}
|
||||
|
||||
User user = userController.login(username, password);
|
||||
if (user != null) {
|
||||
JOptionPane.showMessageDialog(LoginView.this,
|
||||
"登录成功!", "成功", JOptionPane.INFORMATION_MESSAGE);
|
||||
// 修改:传递用户信息到主界面
|
||||
NavigationController.showMainView(user);
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(LoginView.this,
|
||||
"用户名或密码错误", "错误", JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,151 @@
|
||||
package view;
|
||||
|
||||
import controller.NavigationController;
|
||||
import controller.UserController;
|
||||
import model.User;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
|
||||
public class RegisterView extends JFrame {
|
||||
private JTextField usernameField; // 新增:用户名输入框
|
||||
private JTextField emailField;
|
||||
private JTextField codeField;
|
||||
private JPasswordField passwordField;
|
||||
private JPasswordField confirmPasswordField;
|
||||
private UserController userController;
|
||||
private String currentUsername; // 保存当前注册的用户名
|
||||
|
||||
public RegisterView() {
|
||||
userController = new UserController();
|
||||
initializeUI();
|
||||
}
|
||||
|
||||
private void initializeUI() {
|
||||
setTitle("数学学习软件 - 注册");
|
||||
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
setSize(500, 450); // 增加高度以容纳用户名字段
|
||||
setLocationRelativeTo(null);
|
||||
setResizable(false);
|
||||
|
||||
JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
|
||||
mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
|
||||
|
||||
// Title
|
||||
JLabel titleLabel = new JLabel("用户注册", JLabel.CENTER);
|
||||
titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 24));
|
||||
mainPanel.add(titleLabel, BorderLayout.NORTH);
|
||||
|
||||
// Form panel - 增加用户名字段
|
||||
JPanel formPanel = new JPanel(new GridLayout(6, 2, 10, 10));
|
||||
|
||||
JLabel usernameLabel = new JLabel("用户名:");
|
||||
usernameLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14));
|
||||
usernameField = new JTextField();
|
||||
|
||||
JLabel emailLabel = new JLabel("邮箱:");
|
||||
emailLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14));
|
||||
emailField = new JTextField();
|
||||
|
||||
JLabel codeLabel = new JLabel("注册码:");
|
||||
codeLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14));
|
||||
codeField = new JTextField();
|
||||
|
||||
JLabel passwordLabel = new JLabel("密码:");
|
||||
passwordLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14));
|
||||
passwordField = new JPasswordField();
|
||||
|
||||
JLabel confirmPasswordLabel = new JLabel("确认密码:");
|
||||
confirmPasswordLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14));
|
||||
confirmPasswordField = new JPasswordField();
|
||||
|
||||
JButton sendCodeButton = new JButton("发送注册码");
|
||||
sendCodeButton.setFont(new Font("微软雅黑", Font.PLAIN, 12));
|
||||
|
||||
JButton registerButton = new JButton("完成注册");
|
||||
registerButton.setFont(new Font("微软雅黑", Font.PLAIN, 14));
|
||||
|
||||
// 布局表单
|
||||
formPanel.add(usernameLabel);
|
||||
formPanel.add(usernameField);
|
||||
formPanel.add(emailLabel);
|
||||
formPanel.add(emailField);
|
||||
formPanel.add(new JLabel()); // Empty cell
|
||||
formPanel.add(sendCodeButton);
|
||||
formPanel.add(codeLabel);
|
||||
formPanel.add(codeField);
|
||||
formPanel.add(passwordLabel);
|
||||
formPanel.add(passwordField);
|
||||
formPanel.add(confirmPasswordLabel);
|
||||
formPanel.add(confirmPasswordField);
|
||||
formPanel.add(new JLabel()); // Empty cell
|
||||
formPanel.add(registerButton);
|
||||
|
||||
mainPanel.add(formPanel, BorderLayout.CENTER);
|
||||
|
||||
// Back button
|
||||
JButton backButton = new JButton("返回登录");
|
||||
backButton.setFont(new Font("微软雅黑", Font.PLAIN, 14));
|
||||
backButton.addActionListener(e -> NavigationController.showLoginView());
|
||||
|
||||
JPanel bottomPanel = new JPanel(new FlowLayout());
|
||||
bottomPanel.add(backButton);
|
||||
mainPanel.add(bottomPanel, BorderLayout.SOUTH);
|
||||
|
||||
// Add action listeners
|
||||
sendCodeButton.addActionListener(new SendCodeAction());
|
||||
registerButton.addActionListener(new RegisterAction());
|
||||
|
||||
add(mainPanel);
|
||||
}
|
||||
|
||||
private class SendCodeAction implements ActionListener {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
String username = usernameField.getText().trim();
|
||||
String email = emailField.getText().trim();
|
||||
|
||||
if (username.isEmpty() || email.isEmpty()) {
|
||||
JOptionPane.showMessageDialog(RegisterView.this,
|
||||
"请输入用户名和邮箱", "错误", JOptionPane.ERROR_MESSAGE);
|
||||
return;
|
||||
}
|
||||
|
||||
String result = userController.registerUser(username, email);
|
||||
JOptionPane.showMessageDialog(RegisterView.this, result);
|
||||
|
||||
if (result.contains("发送")) {
|
||||
currentUsername = username;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class RegisterAction implements ActionListener {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
String username = usernameField.getText().trim();
|
||||
String code = codeField.getText().trim();
|
||||
String password = new String(passwordField.getPassword());
|
||||
String confirmPassword = new String(confirmPasswordField.getPassword());
|
||||
|
||||
if (username.isEmpty() || code.isEmpty() || password.isEmpty() || confirmPassword.isEmpty()) {
|
||||
JOptionPane.showMessageDialog(RegisterView.this,
|
||||
"请填写所有字段", "错误", JOptionPane.ERROR_MESSAGE);
|
||||
return;
|
||||
}
|
||||
|
||||
String result = userController.completeRegistration(username, code, password, confirmPassword);
|
||||
|
||||
if (result.equals("注册成功!")) {
|
||||
JOptionPane.showMessageDialog(RegisterView.this,
|
||||
result, "成功", JOptionPane.INFORMATION_MESSAGE);
|
||||
NavigationController.showLoginView();
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(RegisterView.this,
|
||||
result, "错误", JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,69 @@
|
||||
package view;
|
||||
|
||||
import controller.NavigationController;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
|
||||
public class ResultView extends JFrame {
|
||||
private JLabel scoreLabel;
|
||||
private JLabel percentageLabel;
|
||||
|
||||
public ResultView() {
|
||||
initializeUI();
|
||||
}
|
||||
|
||||
private void initializeUI() {
|
||||
setTitle("数学学习软件 - 成绩界面");
|
||||
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
setSize(400, 300);
|
||||
setLocationRelativeTo(null);
|
||||
setResizable(false);
|
||||
|
||||
JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
|
||||
mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
|
||||
|
||||
// Title
|
||||
JLabel titleLabel = new JLabel("考试结果", JLabel.CENTER);
|
||||
titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 24));
|
||||
mainPanel.add(titleLabel, BorderLayout.NORTH);
|
||||
|
||||
// Result panel
|
||||
JPanel resultPanel = new JPanel(new GridLayout(2, 1, 10, 10));
|
||||
|
||||
scoreLabel = new JLabel("", JLabel.CENTER);
|
||||
scoreLabel.setFont(new Font("微软雅黑", Font.PLAIN, 18));
|
||||
|
||||
percentageLabel = new JLabel("", JLabel.CENTER);
|
||||
percentageLabel.setFont(new Font("微软雅黑", Font.PLAIN, 18));
|
||||
|
||||
resultPanel.add(scoreLabel);
|
||||
resultPanel.add(percentageLabel);
|
||||
mainPanel.add(resultPanel, BorderLayout.CENTER);
|
||||
|
||||
// Button panel
|
||||
JPanel buttonPanel = new JPanel(new FlowLayout());
|
||||
JButton continueButton = new JButton("继续做题");
|
||||
JButton exitButton = new JButton("退出系统");
|
||||
|
||||
continueButton.setFont(new Font("微软雅黑", Font.PLAIN, 14));
|
||||
exitButton.setFont(new Font("微软雅黑", Font.PLAIN, 14));
|
||||
|
||||
buttonPanel.add(continueButton);
|
||||
buttonPanel.add(exitButton);
|
||||
mainPanel.add(buttonPanel, BorderLayout.SOUTH);
|
||||
|
||||
// Add action listeners
|
||||
continueButton.addActionListener(e -> NavigationController.showMainView());
|
||||
exitButton.addActionListener(e -> System.exit(0));
|
||||
|
||||
add(mainPanel);
|
||||
}
|
||||
|
||||
public void setResults(int score, int total, double percentage) {
|
||||
scoreLabel.setText(String.format("得分: %d / %d", score, total));
|
||||
percentageLabel.setText(String.format("正确率: %.1f%%", percentage));
|
||||
}
|
||||
}
|
||||
Loading…
Reference in new issue