JavaSwing实现完整心理测试考试系统,管理员端与学生端

一、项目介绍

本项目主要使用Java语言,利用JavaSwing实现可视化界面心理测试考试系统,包含完整的逻辑代码,数据文件,图片等等。本系统支持管理员与学生两个权限登录,没有账号的用户可以进行注册。
用户端会从题库中随机抽取20道题目进行测试,考试过程会记录时间,时间结束会强制交卷,用户阅读题目后可以在下方选项进行选择,提交试卷时如果没有选择,会被记为0分。用户可以点击上一页下一页切换题目,系统会记录你的答题状态,已经回答过的问题选项会被记录,并且可以修改。系统还会记录你已答数量,未答数量等。提交试卷后,会根据用户的选择进行打分,并显示出相应的评价,用户可以看到自己历史测试成绩。
管理员端可以管理题库中的试题,进行增加删除等,还可以管理系统中用户信息,授予考试权限。用户的所有测试结果都会显示在管理员端以查看用户的测试结果等,管理员不可以注册,登陆的账号密码已被固定。

二、效果预览

1.登录页面

在这里插入图片描述

2.考试页面

在这里插入图片描述

3.考试结果页面

在这里插入图片描述

4.试卷管理页面

在这里插入图片描述

5.学生管理页面

在这里插入图片描述

6.测评结果管理

在这里插入图片描述

三、主要代码演示

1.管理员页面

public class AdminFrame extends JFrame {

    private static AdminFrame adminFrame;
    private QuestionService service = MySpring.getBean("service.QuestionService");
    private HashSet<Question> list;

    //分割线
    private ArrayList<JLabel> arr = new ArrayList<>();

    protected AdminFrame() {
        //创建试卷管理按钮
        JButton man_qu = new JButton("试卷管理");
        man_qu.setBounds(5, 50, 90, 30);

        //创建学生管理按钮
        JButton man_stu = new JButton("学生管理");
        man_stu.setBounds(5, 150, 90, 30);

        //创建测评结果管理按钮
        JButton res_stu = new JButton("测评结果");
        res_stu.setBounds(5, 250, 90, 30);

        JTextField title = new JTextField("试题列表");
        title.setBounds(330, 15, 135, 35);
        title.setFont(new Font("黑体", Font.BOLD, 30));

        // 创建编号与编号输入框
        JLabel quest = new JLabel("问题:");
        JTextField questionTextField = new JTextField();
        quest.setBounds(100, 430, 50, 25);
        questionTextField.setBounds(160, 430, 200, 25);

        //选项A
        JLabel aLable = new JLabel("选项A:");
        JTextField aTextField = new JTextField();
        aLable.setBounds(100, 460, 50, 25);
        aTextField.setBounds(160, 460, 200, 25);

        //选项B
        JLabel bLable = new JLabel("选项B:");
        JTextField bTextField = new JTextField();
        bLable.setBounds(100, 490, 50, 25);
        bTextField.setBounds(160, 490, 200, 25);

        //选项C
        JLabel cLable = new JLabel("选项C:");
        JTextField cTextField = new JTextField();
        cLable.setBounds(100, 520, 50, 25);
        cTextField.setBounds(160, 520, 200, 25);

        // 删除的问题序号
        JLabel delnum = new JLabel("删除序号:");
        JTextField delnumTextField = new JTextField();
        delnum.setBounds(470, 460, 70, 25);
        delnumTextField.setBounds(550, 460, 100, 25);

        //创建增加按钮
        JButton addQuestion = new JButton("添加试题");
        addQuestion.setBounds(180, 560, 150, 30);

        //创建删除按钮
        JButton delQuestion = new JButton("删除试题");
        delQuestion.setBounds(500, 560, 150, 30);

        // 创建表格
        JTable table = new JTable();
        //设置表格
        table.setModel(new DefaultTableModel(
                new Object[][]{}, new String[]{"序号", "题目", "选项A", "选项B", "选项C"}
        ));
        table.setRowHeight(16);
        table.getColumnModel().getColumn(0).setPreferredWidth(40);
        table.getColumnModel().getColumn(1).setPreferredWidth(360);
        table.getColumnModel().getColumn(2).setPreferredWidth(100);
        table.getColumnModel().getColumn(3).setPreferredWidth(100);
        table.getColumnModel().getColumn(4).setPreferredWidth(100);
        DefaultTableModel model = (DefaultTableModel) table.getModel();
        list = QuestionFileReader.getQuestion();

        //从文件查找数据放入表格中
        if (!list.isEmpty()) {
            int index = 1;
            for (Question question : list) {
                String[] str = question.getTitle().split(" ");
                //去除掉选项前面的ABC以及换行符<br>
                if (str[0].length() >= 4 && str[1].length() >= 4 && str[2].length() >= 4 && str[3].length() >= 2)
                    model.addRow(new Object[]{index++, str[0].substring(0, str[0].length() - 4), str[1].substring(2, str[1].length() - 4), str[2].substring(2, str[2].length() - 4), str[3].substring(2)});
            }
        }

        // 创建table滚动窗体
        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setBounds(50, 60, 700, 350);
        //创建监听器
        addQuestion.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //获取输入的问题和选项
                String question = questionTextField.getText();
                String A = aTextField.getText();
                String B = bTextField.getText();
                String C = cTextField.getText();
                String res = question + "<br> A." + A + "<br> B." + B + "<br> C." + C;
                service.saveQuestion(res);

                JOptionPane.showMessageDialog(AdminFrame.this, "保存成功");
                Object[] data = new Object[]{list.size() + 1, question, A, B, C};
                //将题添加到缓存
                list.add(new Question(res));
                //将新数据显示在表格中
                model.addRow(data);

                //增加后清空数据
                questionTextField.setText("");
                aTextField.setText("");
                bTextField.setText("");
                cTextField.setText("");
            }
        });

        delQuestion.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                int num = Integer.valueOf(delnumTextField.getText());
                //删除序号对应的行的数据
                for (int i = 0; i < model.getRowCount(); i++) {
                    int number = (Integer) model.getValueAt(i, 0);
                    if (num == number) {
                        model.removeRow(i);
                    }
                    if (i == model.getRowCount() - 1) {
                        JOptionPane.showMessageDialog(AdminFrame.this, "该序号不存在");
                    }
                }

                //增加后清空数据
                delnumTextField.setText("");
            }
        });

        JTextField title2 = new JTextField("学生列表");
        title2.setBounds(330, 15, 135, 35);
        title2.setFont(new Font("黑体", Font.BOLD, 30));

        JLabel name = new JLabel("姓名:");
        JTextField nameTextField = new JTextField();
        name.setBounds(100, 430, 50, 25);
        nameTextField.setBounds(160, 430, 200, 25);

        JLabel num = new JLabel("学号:");
        JTextField numTextField = new JTextField();
        num.setBounds(100, 460, 50, 25);
        numTextField.setBounds(160, 460, 200, 25);

        JLabel major = new JLabel("专业:");
        JTextField majorTextField = new JTextField();
        major.setBounds(100, 490, 50, 25);
        majorTextField.setBounds(160, 490, 200, 25);

        JLabel class1 = new JLabel("班级:");
        JTextField class1TextField = new JTextField();
        class1.setBounds(100, 520, 50, 25);
        class1TextField.setBounds(160, 520, 200, 25);

        // 删除的问题序号
        JLabel delnum1 = new JLabel("删除序号:");
        JTextField delnumTextField1 = new JTextField();
        delnum1.setBounds(470, 460, 70, 25);
        delnumTextField1.setBounds(550, 460, 100, 25);

        JTable table2 = new JTable();
        //设置表格
        table2.setModel(new DefaultTableModel(
                new Object[][]{}, new String[]{"序号", "姓名", "学号", "专业", "班级"}
        ));
        table2.setRowHeight(16);
        DefaultTableModel model2 = (DefaultTableModel) table2.getModel();
        ArrayList<String> arr1 = UserFileReader.getStu();

        //从文件查找数据放入表格中
        if (!arr1.isEmpty()) {
            int index = 1;
            for (String strs : arr1) {
                String[] str = strs.split(" ");
                model2.addRow(new Object[]{index++, str[0], str[1], str[2], str[3]});
            }
        }

        // 创建学生table滚动窗体
        JScrollPane scrollPane2 = new JScrollPane(table2);
        scrollPane2.setBounds(50, 60, 700, 350);
        //创建增加按钮
        JButton addStu = new JButton("添加学生信息");
        addStu.setBounds(180, 560, 150, 30);
        //创建删除按钮
        JButton delStu = new JButton("删除学生信息");
        delStu.setBounds(500, 560, 150, 30);

        addStu.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //获取输入的问题和选项
                String name = nameTextField.getText();
                String num = numTextField.getText();
                String major = majorTextField.getText();
                String class1 = class1TextField.getText();
                UserFileReader.saveStu(name, num, major, class1);
                Object[] data = new Object[]{arr1.size() + 1, name, num, major, class1};
                JOptionPane.showMessageDialog(AdminFrame.this, "保存成功");
                //将新数据显示在表格中
                model2.addRow(data);

                //增加后清空数据
                questionTextField.setText("");
                aTextField.setText("");
                bTextField.setText("");
                cTextField.setText("");
            }
        });

        delStu.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                int num = Integer.valueOf(delnumTextField1.getText());
                //删除序号对应的行的数据
                for (int i = 0; i < model2.getRowCount(); i++) {
                    int number = (Integer) model2.getValueAt(i, 0);
                    if (num == number) {
                        model2.removeRow(i);
                        JOptionPane.showMessageDialog(AdminFrame.this, "删除成功");
                        break;
                    }
                    if (i == model2.getRowCount() - 1) {
                        JOptionPane.showMessageDialog(AdminFrame.this, "该序号不存在");
                    }
                }

                //增加后清空数据
                delnumTextField.setText("");
            }
        });

        //心里测试结果
        JTextField title3 = new JTextField("测评结果列表");
        title3.setBounds(300, 15, 200, 35);
        title3.setFont(new Font("黑体", Font.BOLD, 30));

        JTable table3 = new JTable();
        //设置表格
        table3.setModel(new DefaultTableModel(
                new Object[][]{}, new String[]{"序号", "姓名", "评分", "评价"}
        ));
        table3.setRowHeight(16);
        table3.getColumnModel().getColumn(0).setPreferredWidth(40);
        table3.getColumnModel().getColumn(1).setPreferredWidth(70);
        table3.getColumnModel().getColumn(2).setPreferredWidth(70);
        table3.getColumnModel().getColumn(3).setPreferredWidth(520);
        DefaultTableModel model3 = (DefaultTableModel) table3.getModel();
        ArrayList<String> arr2 = QuestionFileReader.readResult();

        //从文件查找数据放入表格中
        if (!arr2.isEmpty()) {
            int index = 1;
            for (String strs : arr2) {
                String[] str = strs.split(":");
                String[] str2=str[2].split("。");
                model3.addRow(new Object[]{index++, str[0], str2[0], str2[1]+str[3]});
            }
        }

        // 创建测评结果table滚动窗体
        JScrollPane scrollPane3 = new JScrollPane(table3);
        scrollPane3.setBounds(50, 60, 700, 350);



        JPanel container = new JPanel();//试卷管理内容页
        JPanel buttons = new JPanel();//按钮页
        JPanel stupanl = new JPanel();//学生内容页
        JPanel resultpanl = new JPanel();//学生内容页
        JPanel mainpanl = new JPanel();//总页面
        buttons.add(man_qu);
        buttons.add(man_stu);
        buttons.add(res_stu);
        stupanl.add(scrollPane2);
        stupanl.add(title2);
        stupanl.add(addStu);
        stupanl.add(delStu);
        stupanl.add(name);
        stupanl.add(nameTextField);
        stupanl.add(num);
        stupanl.add(numTextField);
        stupanl.add(major);
        stupanl.add(majorTextField);
        stupanl.add(class1);
        stupanl.add(class1TextField);
        stupanl.add(delnum1);
        stupanl.add(delnumTextField1);

        container.add(title);
        container.add(scrollPane);
        container.add(quest);
        container.add(questionTextField);
        container.add(aLable);
        container.add(aTextField);
        container.add(bLable);
        container.add(bTextField);
        container.add(addQuestion);
        container.add(cTextField);
        container.add(cLable);
        container.add(delQuestion);
        container.add(delnum);
        container.add(delnumTextField);

        resultpanl.add(scrollPane3);
        resultpanl.add(title3);
        //设置button区域的位置
        buttons.setLayout(null);
        buttons.setBounds(10, 10, 100, 600);
        buttons.setBorder(BorderFactory.createLineBorder(Color.GRAY));
        //内容区域位置
        container.setLayout(null);
        container.setBounds(120, 10, 780, 600);
        container.setBorder(BorderFactory.createLineBorder(Color.GRAY));
        //内容区域位置
        stupanl.setLayout(null);
        stupanl.setBounds(120, 10, 780, 600);
        stupanl.setBorder(BorderFactory.createLineBorder(Color.GRAY));

        //内容区域位置
        resultpanl.setLayout(null);
        resultpanl.setBounds(120, 10, 780, 600);
        resultpanl.setBorder(BorderFactory.createLineBorder(Color.GRAY));

        mainpanl.add(container);
        mainpanl.add(buttons);
        mainpanl.add(stupanl);
        mainpanl.add(resultpanl);
        stupanl.setVisible(false);
        resultpanl.setVisible(false);

        man_qu.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                container.setVisible(true);
                stupanl.setVisible(false);
                resultpanl.setVisible(false);
            }
        });
        man_stu.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                container.setVisible(false);
                stupanl.setVisible(true);
                resultpanl.setVisible(false);
            }
        });
        res_stu.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                container.setVisible(false);
                stupanl.setVisible(false);
                resultpanl.setVisible(true);
            }
        });

        mainpanl.setLayout(null);
        mainpanl.setBackground(Color.LIGHT_GRAY);
        this.add(mainpanl);

        this.setTitle("后台数据管理");
        this.setVisible(true);
        this.setSize(925, 658);
        //this.setResizable(false);//不想让窗体拖拽大小
        this.setLocationRelativeTo(null);// 设置居中显示
        // 设置Jframe窗体关闭时 程序结束
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public synchronized static AdminFrame getAdminFrame() {
        if (adminFrame == null) {
            adminFrame = new AdminFrame();
        }
        return adminFrame;
    }
}

2.考试页面

public class ExamFrame extends BaseFrame {

    private static ExamFrame examFrame;
    //当前登录的用户
    private static String account;
    private QuestionService service = MySpring.getBean("service.QuestionService");
    //试卷
    private ArrayList<Question> paper = service.getPaper(20);
    //答题卡
    private String[] answers = new String[paper.size() + 1];
    private int totalCount = paper.size();//题目总数
    private int unanswerCount = totalCount;//未答

    //控制窗体右侧的数值显示
    private int nowNumber = 0;//当前题号
    private int answerCount = 0;//已答

    //记录倒计时事件, 分钟为单位
    private int time = 20;

    //内部类 - 线程对象, 处理事件倒计时
    private TimeControlThread timeControlThread = new TimeControlThread();

    //添加三个panel 区域的分割
    private JPanel mainPanel = new JPanel();//负责答题主页面展示
    private JPanel messagePanel = new JPanel();//负责右侧信息展示
    private JPanel buttonPanel = new JPanel();//负责下方按钮的展示

    //添加主要答题的组件
    private JTextArea examArea = new JTextArea();//考试文本域 展示题目
    private JScrollPane scrollPane = new JScrollPane(examArea);//滚动条

    //添加右侧信息的组件
    private JLabel pictureLabel = new JLabel();//展示图片信息
    private JLabel nowNumLabel = new JLabel("当前题号:");//提示当前的题号
    private JLabel totalCountLabel = new JLabel("题目总数:");//提示题目的总数
    private JLabel answerCountLabel = new JLabel("已答题数:");//提示已经答过的题目数量
    private JLabel unanswerCountLabel = new JLabel("未答题数:");//提示未答题数量
    private JTextField nowNumField = new JTextField();//展示题号
    private JTextField totalCountField = new JTextField();//展示总数
    private JTextField answerCountField = new JTextField();//展示已答数
    private JTextField unanswerCountField = new JTextField();//展示未答数
    private JLabel timeLabel = new JLabel("剩余答题时间");//提示剩余时间
    private JLabel realTimeLabel = new JLabel();//倒计时真实时间
    //添加下方按钮的组件
    private JButton aButton = new JButton("A");//a按钮
    private JButton bButton = new JButton("B");//b按钮
    private JButton cButton = new JButton("C");//c按钮
    private JButton prevButton = new JButton("上一题");//previous题
    private JButton nextButton = new JButton("下一题");//next题
    private JButton submitButton = new JButton("提交试卷");//提交按钮

    private ExamFrame() {
        super("考试窗口");
        this.init();
    }

    public synchronized static ExamFrame getExamFrame(String user) {
        if (examFrame == null) {
            examFrame = new ExamFrame();
        }
        account = user;
        return examFrame;
    }

    @Override
    protected void setFontAndSoOn() {
        //设置panel布局管理---->自定义
        mainPanel.setLayout(null);
        mainPanel.setBackground(Color.LIGHT_GRAY);

        //设置message区域的位置
        messagePanel.setLayout(null);
        messagePanel.setBounds(680, 10, 300, 550);
        messagePanel.setBorder(BorderFactory.createLineBorder(Color.GRAY));

        //设置button区域的位置
        buttonPanel.setLayout(null);
        buttonPanel.setBounds(16, 470, 650, 90);
        buttonPanel.setBorder(BorderFactory.createLineBorder(Color.GRAY));

        //手动设置每一个组件的位置 字体 背景
        scrollPane.setBounds(16, 10, 650, 450);

        examArea.setFont(new Font("黑体", Font.BOLD, 20));
        examArea.setEnabled(false);//文本域中的文字不能编辑
        this.showQuestion();//展示第一道题

        pictureLabel.setBounds(10, 10, 280, 230);
        pictureLabel.setBorder(BorderFactory.createLineBorder(Color.GRAY));
        //pictureLabel.setIcon(null);//展示图片信息

        nowNumLabel.setBounds(40, 270, 100, 30);
        nowNumLabel.setFont(new Font("黑体", Font.PLAIN, 20));
        nowNumField.setBounds(150, 270, 100, 30);
        nowNumField.setFont(new Font("黑体", Font.BOLD, 20));
        nowNumField.setBorder(BorderFactory.createLineBorder(Color.GRAY));
        nowNumField.setEnabled(false);
        nowNumField.setHorizontalAlignment(JTextField.CENTER);

        totalCountLabel.setBounds(40, 310, 100, 30);
        totalCountLabel.setFont(new Font("黑体", Font.PLAIN, 20));
        totalCountField.setBounds(150, 310, 100, 30);
        totalCountField.setFont(new Font("黑体", Font.BOLD, 20));
        totalCountField.setBorder(BorderFactory.createLineBorder(Color.GRAY));
        totalCountField.setEnabled(false);
        totalCountField.setHorizontalAlignment(JTextField.CENTER);

        answerCountLabel.setBounds(40, 350, 100, 30);
        answerCountLabel.setFont(new Font("黑体", Font.PLAIN, 20));
        answerCountField.setBounds(150, 350, 100, 30);
        answerCountField.setFont(new Font("黑体", Font.BOLD, 20));
        answerCountField.setBorder(BorderFactory.createLineBorder(Color.GRAY));
        answerCountField.setEnabled(false);
        answerCountField.setHorizontalAlignment(JTextField.CENTER);

        unanswerCountLabel.setBounds(40, 390, 100, 30);
        unanswerCountLabel.setFont(new Font("黑体", Font.PLAIN, 20));
        unanswerCountField.setBounds(150, 390, 100, 30);
        unanswerCountField.setFont(new Font("黑体", Font.BOLD, 20));
        unanswerCountField.setBorder(BorderFactory.createLineBorder(Color.GRAY));
        unanswerCountField.setEnabled(false);
        unanswerCountField.setHorizontalAlignment(JTextField.CENTER);

        timeLabel.setBounds(90, 460, 150, 30);
        timeLabel.setFont(new Font("黑体", Font.PLAIN, 20));
        timeLabel.setForeground(Color.BLUE);
        realTimeLabel.setBounds(108, 490, 150, 30);
        realTimeLabel.setFont(new Font("黑体", Font.BOLD, 20));
        realTimeLabel.setForeground(Color.BLUE);

        aButton.setBounds(110, 10, 120, 30);
        aButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        bButton.setBounds(260, 10, 120, 30);
        bButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        cButton.setBounds(410, 10, 120, 30);
        cButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        prevButton.setBounds(60, 50, 100, 30);
        prevButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        nextButton.setBounds(490, 50, 100, 30);
        nextButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        submitButton.setBounds(276, 50, 100, 30);
        submitButton.setForeground(Color.RED);
        submitButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

        //设置控制窗体右侧的数值
        nowNumField.setText(nowNumber + 1 + "");
        totalCountField.setText(totalCount + "");
        answerCountField.setText(answerCount + "");
        unanswerCountField.setText(unanswerCount + "");

    }

    @Override
    protected void addElement() {
        messagePanel.add(pictureLabel);
        messagePanel.add(nowNumLabel);
        messagePanel.add(nowNumField);
        messagePanel.add(totalCountLabel);
        messagePanel.add(totalCountField);
        messagePanel.add(answerCountLabel);
        messagePanel.add(answerCountField);
        messagePanel.add(unanswerCountLabel);
        messagePanel.add(unanswerCountField);
        messagePanel.add(timeLabel);
        messagePanel.add(realTimeLabel);
        buttonPanel.add(aButton);
        buttonPanel.add(bButton);
        buttonPanel.add(cButton);
        buttonPanel.add(prevButton);
        buttonPanel.add(nextButton);
        buttonPanel.add(submitButton);
        mainPanel.add(scrollPane);
        mainPanel.add(messagePanel);
        mainPanel.add(buttonPanel);
        this.add(mainPanel);
    }

    @Override
    protected void addListener() {

        //4个选项按钮
        ActionListener option = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //清楚全部选项按钮的颜色
                ExamFrame.this.clearOptionButtonColor();
                //处理点击的按钮
                JButton button = (JButton) e.getSource();
                button.setBackground(Color.GREEN);
                //填写答题卡
                answers[nowNumber] = button.getText();
            }
        };
        aButton.addActionListener(option);
        bButton.addActionListener(option);
        cButton.addActionListener(option);

        //next按钮
        nextButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (nowNumber == 0) {
                    prevButton.setEnabled(true);
                }
                //清楚全部选项按钮的颜色
                ExamFrame.this.clearOptionButtonColor();
                //题号增加
                nowNumber++;
                //主界面与按钮界面变化
                if (nowNumber == totalCount) {//答完
                    examArea.setText("全部题目已经回答完毕\n请点击下方提交按钮");
                    //next按钮失效
                    nextButton.setEnabled(false);
                    //全部选项按钮失效
                    ExamFrame.this.setOptionButtonEnabled(false);
                } else {
                    ExamFrame.this.showQuestion();
                    //修改右侧题号
                    ExamFrame.this.nowNumField.setText(nowNumber + 1 + "");
                }
                //修改已答题 未答题
                ExamFrame.this.answerCountField.setText(++answerCount + "");
                ExamFrame.this.unanswerCountField.setText(--unanswerCount + "");
                //还原之前的选择
                ExamFrame.this.restoreButton();
            }
        });

        //prev按钮
        prevButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (nowNumber == totalCount) {
                    ExamFrame.this.setOptionButtonEnabled(true);
                    nextButton.setEnabled(true);
                }
                //清除全部选项按钮的颜色
                ExamFrame.this.clearOptionButtonColor();
                //题号减少
                nowNumber--;
                //按钮界面变化
                if (nowNumber == 0) {
                    prevButton.setEnabled(false);
                }
                //显示题目
                ExamFrame.this.showQuestion();
                //修改右侧题号 已答题 未答题
                nowNumField.setText(nowNumber + 1 + "");
                answerCountField.setText(--answerCount + "");
                unanswerCountField.setText(++unanswerCount + "");
                //还原之前的选择
                ExamFrame.this.restoreButton();
            }
        });

        //submit按钮
        submitButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //0.显示确认框
                //是0 否1 取消2
                int value = JOptionPane.showConfirmDialog(ExamFrame.this, "确认提交?");
                if (value == 0) {
                    //1.倒计时停止
                    timeControlThread.stopTimeThread();
                    //2.所有按钮失效
                    setOptionButtonEnabled(false);
                    nextButton.setEnabled(false);
                    prevButton.setEnabled(false);
                    //3.选项按钮颜色清楚
                    clearOptionButtonColor();
                    //4.最终成绩的计算,并展示
                    float score = gradePaper();
                    StringBuffer sb1 = new StringBuffer();
                    String result = "";
                    if (score >= 61 && score <= 75) {
                        result = "你本次测试的最终得分是: " + score + "。\n" +
                                "儿童,儿童心理年龄的关键词是:幼稚。" + "\n" +
                                "你的心理年龄只有10岁左右,你对这个世界还充满了好奇心,一切在你看来" + "\n" +
                                "都是新鲜和有趣的。你对外界的反应很直接,对情绪的控制能力很差。如果" + "\n" +
                                "说你的生理年龄超过了心理年龄,那么你会很难适应周围的环境。";
                    } else if (score >= 51 && score <= 60) {
                        result = "你本次测试的最终得分是: " + score + "。\n" +
                                "年轻人,年轻人心理年龄的关键词是:冲突。" + "\n" +
                                "你的心理年龄在20~30岁,你已经有了自己的想法,也能控制一部分情绪和承担一定的" + "\n" +
                                "责任。当你的理想化和现实发生冲突的时候,你会感到很痛苦,正在不断地摸索解决的" + "\n" +
                                "办法。如果说你的生理年龄与你的心理年龄产生超 过10岁以上的差异,那么你的适应" + "\n" +
                                "能力有待调节。";
                    } else if (score >= 36 && score <= 50) {
                        result = "你本次测试的最终得分是: " + score + "。\n" +
                                "中年人,中年人心理年龄的关键词是:成熟。" + "\n" +
                                "你的心理年龄在35~50岁,你完全知道怎么处理各种矛盾,你也知道自己的问题出在哪" + "\n" +
                                "里,你有了丰富的社会经验和与人打交道的能力。对于生活中的大部分问题,你已经" + "\n" +
                                "有了解决的办法。如果说你的生理年龄与你的心理 年龄相差无几,那么你的适应能力" + "\n" +
                                "已经很好。";
                    } else {
                        result = "你本次测试的最终得分是: " + score + "。\n" +
                                "老人,老年人心理年龄的关键词是:固执。" + "\n" +
                                "你的心理年龄在50~70岁,你认为自己已经完全了解整个社会的所有问题,你形" + "\n" +
                                "成了自己的处世风格。遇到问题,你坚信只有你知道唯一的 正确答案。内心深处" + "\n" +
                                "已经逐渐拒绝接受改变。如果说你的生理年龄比你的心理年龄小,那么 你需要的" + "\n" +
                                "是打破固有的约束,跟上社会的步伐继续前进。";
                    }
                    sb1.append(result);
                    sb1.append("\n\n您以前的测试结果为:\n");
                    ArrayList<String> strings = QuestionFileReader.readResult(account);
                    for (String str : strings) {
                        sb1.append(str + "\n");
                    }
                    examArea.setText(sb1.toString());

                    //输出文件时去掉换行
                    String[] strs = result.split("\n");
                    StringBuffer sb = new StringBuffer();
                    for (String str : strs) {
                        sb.append(str);
                    }
                    service.saveResult(account + ":" + sb.toString());
                }
            }
        });
    }

    @Override
    protected void setFrameSelf() {
        this.setBounds(260, 130, 1000, 600);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);//不想让窗体拖拽大小
        this.setVisible(true);//最终展示整个窗体
        timeControlThread.start();//启动线程, 倒计时开始
    }

    //展示一道题目
    private void showQuestion() {
        Question question = paper.get(nowNumber);
        //展示图片
        pictureLabel.setIcon(this.drawPicture("src\\img\\" + "exam.jpg"));
        examArea.setText((nowNumber + 1) + "." + question.getTitle().replace("<br>", "\n   "));
    }

    //画图
    private ImageIcon drawPicture(String path) {
        ImageIcon imageIcon = new ImageIcon(path);
        imageIcon.setImage(imageIcon.getImage().getScaledInstance(280, 230, Image.SCALE_DEFAULT));
        return imageIcon;
    }

    //下一题时清除全部选项按钮的颜色
    private void clearOptionButtonColor() {
        aButton.setBackground(null);
        bButton.setBackground(null);
        cButton.setBackground(null);
    }

    //控制全部选项按钮是否可用
    private void setOptionButtonEnabled(boolean key) {
        aButton.setEnabled(key);
        bButton.setEnabled(key);
        cButton.setEnabled(key);
    }

    //还原上一题的选项
    private void restoreButton() {
        String answer = answers[nowNumber];
        if (answer == null) {
            return;
        }
        switch (answer) {
            case "A":
                aButton.setBackground(Color.GREEN);
                break;
            case "B":
                bButton.setBackground(Color.GREEN);
                break;
            case "C":
                cButton.setBackground(Color.GREEN);
                break;
        }
    }

    //计算最终成绩
    private float gradePaper() {
        float score = 0;
        for (int i = 0; i < paper.size(); i++) {
            if ("A".equals(answers[i])) {
                score += 3;
            } else if ("B".equals(answers[i])) {
                score += 2;
            } else if ("C".equals(answers[i])) {
                score += 1;
            } else {
                score += 0;
            }
        }
        return score;
    }

    //用来处理倒计时问题
    private class TimeControlThread extends Thread {

        private boolean flag = true;//此时正常执行线程处理

        public void stopTimeThread() {
            this.flag = false;
        }

        @Override
        public void run() {
            //time转化为   小时:分钟:秒
            int hour = time / 60;
            int minute = time % 60;
            int second = 0;
            while (flag) {
                //处理时分秒的显示
                StringBuilder builder = new StringBuilder();
                if (hour >= 0 && hour < 10) {
                    builder.append("0");
                }
                builder.append(hour);
                builder.append(":");
                if (minute >= 0 && minute < 10) {
                    builder.append("0");
                }
                builder.append(minute);
                builder.append(":");
                if (second >= 0 && second < 10) {
                    builder.append("0");
                }
                builder.append(second);
                //展示
                realTimeLabel.setText(builder.toString());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //改变时间
                if (second > 0) {
                    second--;
                } else {
                    if (minute > 0) {
                        second = 59;
                        minute--;
                    } else {
                        if (hour > 0) {
                            second = 59;
                            minute = 59;
                            hour--;
                        } else {
                            //考试结束
                            realTimeLabel.setForeground(Color.RED);
                            setOptionButtonEnabled(false);
                            nextButton.setEnabled(false);
                            prevButton.setEnabled(false);
                            JOptionPane.showMessageDialog(ExamFrame.this, "考试结束了");
                            break;
                        }
                    }
                }

            }
        }
    }

}

3.登录页面

public class LoginFrame extends BaseFrame {

    private LoginFrame(){
        super("登录窗口");
        this.init();
    }
    private static LoginFrame loginFrame;
    public synchronized static LoginFrame getLoginFrame(){
        if (loginFrame == null){
            loginFrame = new LoginFrame();
        }
        return loginFrame;
    }

    private UserService service = MySpring.getBean("service.UserService");

    //创建一个面板
    private JPanel mainPanel = new JPanel();
    //创建title显示标题
    private JLabel titleLabel = new JLabel("心 理 测 试 系 统");
    //创建账号和密码的标题
    private JLabel accountLabel = new JLabel("账 户:");
    private JLabel passwordLabel = new JLabel("密 码:");
    private JLabel labDo = new JLabel("权 限:");
    private String[] labs = {"管理员","用户"};
    private JComboBox labCombo = new JComboBox(labs);
    //创建输入账号和密码的文本框/密码框
    private JTextField accountField = new JTextField();
    private JPasswordField passwordField = new JPasswordField();
    //创建两个按钮
    private JButton loginButton = new JButton("登 录");
    private JButton registerButton = new JButton("注 册");

    //设置每一个组件的位置 大小 字体 布局等等
    protected void setFontAndSoOn(){
        //设置组件的位置----布局管理
        //设置panel的布局管理为自定义方式
        mainPanel.setLayout(null);
        //设置标题组件的位置和字体大小
        titleLabel.setBounds(120,40,340,35);
        titleLabel.setFont(new Font("黑体",Font.BOLD,34));
        //设置用户名label位置和字体大小
        accountLabel.setBounds(94,124,90,30);
        accountLabel.setFont(new Font("黑体",Font.BOLD,24));
        //设置用户名filed位置和字体大小
        accountField.setBounds(204,124,260,30);
        accountField.setFont(new Font("黑体",Font.BOLD,24));
        //设置密码label位置和字体大小
        passwordLabel.setBounds(94,174,90,30);
        passwordLabel.setFont(new Font("黑体",Font.BOLD,24));
        //设置密码field位置和字体大小
        passwordField.setBounds(204,174,260,30);
        passwordField.setFont(new Font("黑体",Font.BOLD,24));

        labDo.setBounds(94,214,90,30);
        labDo.setFont(new Font("黑体",Font.BOLD,24));
        labCombo.setBounds(204,214,120,30);


        //设置登录按钮的位置和文字大小
        loginButton.setBounds(154,292,100,30);
        loginButton.setFont(new Font("黑体",Font.BOLD,22));
        //设置退出按钮的位置和文字大小
        registerButton.setBounds(304,292,100,30);
        registerButton.setFont(new Font("黑体",Font.BOLD,22));
    }

    //将所有的组件添加在窗体上
    protected void addElement(){
        //将所有的组件添加至窗体上
        mainPanel.add(titleLabel);
        mainPanel.add(accountLabel);
        mainPanel.add(accountField);
        mainPanel.add(passwordLabel);
        mainPanel.add(passwordField);
        mainPanel.add(loginButton);
        mainPanel.add(registerButton);
        mainPanel.add(labCombo);
        mainPanel.add(labDo);
        this.add(mainPanel);
    }

    //绑定事件监听
    protected void addListener(){

        loginButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //1.获取用户输入的账号和密码
                //  从登录窗口上的组件内获取   文本框  密码框
                String account = accountField.getText();
                String password = new String(passwordField.getPassword());
                String power= (String) labCombo.getSelectedItem();

                if(power.equals("管理员")){
                    if(account.equals("admin")&&password.equals("admin")){
                        LoginFrame.this.setVisible(false);//将登录窗口隐藏
                        AdminFrame.getAdminFrame();
                    }else{
                        //弹出一个警告框 告诉登录失败啦
                        JOptionPane.showMessageDialog(LoginFrame.this,"用户名或密码错误");
                        //设置文本框和密码框的值为空
                        accountField.setText("");
                        passwordField.setText("");
                    }
                }else{
                    String result = service.login(account,password);
                    if (result.equals("登录成功")){//用户登录成功
                        LoginFrame.this.setVisible(false);//将登录窗口隐藏
                        ExamFrame.getExamFrame(account);
                    }else{
                        //弹出一个警告框 告诉登录失败啦
                        JOptionPane.showMessageDialog(LoginFrame.this,result);
                        //设置文本框和密码框的值为空
                        accountField.setText("");
                        passwordField.setText("");
                    }
                }

            }
        });

        registerButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                LoginFrame.this.setVisible(false);//将登录窗口隐藏
                RegisterFrame.getRegisterFrame();
            }
        });

    }

    protected void setFrameSelf(){
        //设置窗体起始位置和大小
        this.setBounds(600,280,560,400);
        //设置点击关闭退出程序
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置窗体大小不可拖拽
        this.setResizable(false);
        //设置窗体显示状态
        this.setVisible(true);
    }

}

以上就是主要部分的内容展示,要获取完整代码,可以去我的git上面直接下载哦!喜欢的话点点赞!感谢您的支持!
->心理测试考试系统完整代码

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值