package ui; import model.Grade; import model.UserManager; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; /** * 年级选择和题目数量输入界面 * 用户可以选择年级、设置题目数量、用户设置或退出登录 */ public class GradeSelectionFrame extends JFrame { private static final long serialVersionUID = 1L; private final String email; private final String username; private Grade currentGrade; private final JLabel gradeLabel; private final JComboBox gradeComboBox; private final JSpinner questionSpinner; private final JButton startButton; private final JButton userSettingsButton; private final JButton logoutButton; /** * 构造年级选择界面(使用邮箱和年级) * * @param email 用户邮箱 * @param initialGrade 初始年级 */ public GradeSelectionFrame(String email, Grade initialGrade) { this(email, initialGrade, email); // 默认显示邮箱作为用户名 } /** * 构造年级选择界面(使用 UserInfo 对象) * * @param userInfo 用户信息对象 */ public GradeSelectionFrame(UserManager.UserInfo userInfo) { this(userInfo.getEmail(), userInfo.getGrade(), userInfo.getUsername()); } /** * 构造年级选择界面(完整构造函数) * * @param email 用户邮箱 * @param initialGrade 初始年级 * @param username 用户名 */ private GradeSelectionFrame(String email, Grade initialGrade, String username) { this.email = email; this.username = username; this.currentGrade = initialGrade; setTitle("数学学习软件 - 选择年级"); setSize(700, 450); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); setResizable(true); JPanel mainPanel = new JPanel(new BorderLayout(10, 10)); mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); // --- Top Panel --- JPanel topPanel = new JPanel(new BorderLayout()); // 欢迎信息(显示用户名) JLabel welcomeLabel = new JLabel("欢迎, " + username, JLabel.LEFT); welcomeLabel.setFont(new Font("微软雅黑", Font.BOLD, 16)); topPanel.add(welcomeLabel, BorderLayout.WEST); // 用户设置按钮(右上角) userSettingsButton = new JButton("用户设置"); JPanel topRightPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0)); topRightPanel.add(userSettingsButton); topPanel.add(topRightPanel, BorderLayout.EAST); // 当前年级显示 gradeLabel = new JLabel("当前年级: " + getGradeName(currentGrade), JLabel.CENTER); gradeLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14)); gradeLabel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); topPanel.add(gradeLabel, BorderLayout.SOUTH); mainPanel.add(topPanel, BorderLayout.NORTH); // --- Center Panel --- JPanel centerPanel = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(10, 5, 10, 5); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridx = 0; gbc.gridy = 0; centerPanel.add(new JLabel("选择年级:"), gbc); String[] grades = {"小学", "初中", "高中"}; gradeComboBox = new JComboBox<>(grades); gradeComboBox.setSelectedItem(getGradeName(currentGrade)); gbc.gridx = 1; gbc.weightx = 1.0; centerPanel.add(gradeComboBox, gbc); gbc.weightx = 0.0; gbc.gridx = 0; gbc.gridy = 1; centerPanel.add(new JLabel("题目数量:"), gbc); SpinnerNumberModel spinnerModel = new SpinnerNumberModel(10, 10, 30, 1); questionSpinner = new JSpinner(spinnerModel); // 禁用 JSpinner 的文本输入功能,只允许通过按钮调节 JSpinner.DefaultEditor editor = (JSpinner.DefaultEditor) questionSpinner.getEditor(); editor.getTextField().setEditable(false); gbc.gridx = 1; gbc.weightx = 1.0; centerPanel.add(questionSpinner, gbc); gbc.weightx = 0.0; startButton = new JButton("开始答题"); startButton.setPreferredSize(new Dimension(200, 40)); startButton.setFont(new Font("微软雅黑", Font.BOLD, 14)); gbc.gridx = 0; gbc.gridy = 2; gbc.gridwidth = 2; gbc.anchor = GridBagConstraints.CENTER; centerPanel.add(startButton, gbc); mainPanel.add(centerPanel, BorderLayout.CENTER); // --- Bottom Panel --- JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 0)); logoutButton = new JButton("退出登录"); bottomPanel.add(logoutButton); mainPanel.add(bottomPanel, BorderLayout.SOUTH); add(mainPanel); // --- Action Listeners --- startButton.addActionListener(e -> startQuiz()); userSettingsButton.addActionListener(e -> openUserSettings()); logoutButton.addActionListener(e -> logout()); gradeComboBox.addActionListener(e -> updateGrade()); } /** * 更新当前年级 */ private void updateGrade() { String selected = (String) gradeComboBox.getSelectedItem(); switch (selected) { case "小学": currentGrade = Grade.primary; break; case "初中": currentGrade = Grade.middle; break; case "高中": currentGrade = Grade.high; break; } gradeLabel.setText("当前年级: " + getGradeName(currentGrade)); } /** * 开始答题 */ private void startQuiz() { int questionCount = (Integer) questionSpinner.getValue(); QuizFrame quizFrame = new QuizFrame(email, currentGrade, questionCount); quizFrame.setVisible(true); this.dispose(); } /** * 打开用户设置对话框 */ private void openUserSettings() { UserSettingsDialog dialog = new UserSettingsDialog(this, email, username); dialog.setVisible(true); } /** * 退出登录 */ private void logout() { int confirm = JOptionPane.showConfirmDialog(this, "确定要退出登录吗?", "确认", JOptionPane.YES_NO_OPTION); if (confirm == JOptionPane.YES_OPTION) { LoginFrame loginFrame = new LoginFrame(); loginFrame.setVisible(true); this.dispose(); } } /** * 获取年级名称 * * @param grade 年级类型 * @return 年级名称 */ private String getGradeName(Grade grade) { switch (grade) { case primary: return "小学"; case middle: return "初中"; case high: return "高中"; default: return "未知"; } } }