java在线考试管理系统整理


1.登录界面RegFrame.java

实现:1.界面窗体实现
登录界面
2.登录时首先判断三个登录条件有没有选择,必须全部都选择了才能登录

//获取需要登录的用户名和密码

        String isAdmain = (String)comboBox.getSelectedItem();//获取是不是管理员
        String username = this.textField_4.getText();//获取用户文本框的内容
        String password = String.valueOf(this.passwordField.getPassword());//获取密码框输入的内容

判断1各文本框有没有选择

if(isAdmain.equals("")) {
            //System.out.println("abc");
            JOptionPane.showMessageDialog(this, "用户类型不能为空!");
            comboBox.requestFocus();//请求聚焦
            return;
        }

        if(username.equals("")) {
            JOptionPane.showMessageDialog(this, "用户名不能为空!");
            textField_4.requestFocus();//请求聚焦
            return;
        }

        if(password.equals("")) {
            JOptionPane.showMessageDialog(this, "密码不能为空!");
            passwordField.requestFocus();//请求聚焦
            return;
        }

获取Dao方法来连接数据库,进行第二次判断2
先判断有没有此用户名,对了再判断其密码

//访问数据库,根据用户名查找用户对象
        User u = userDao.querUserByName(username);
        //如果查找的用户为空,登录名不存在
        if(u==null) {
            JOptionPane.showMessageDialog(this, "用户名不存在!");
            textField_4.requestFocus();//请求聚焦
        }else if(!u.getPassword().equals(password)) {//否则,用户名存在,则验证密码是否正确
            JOptionPane.showMessageDialog(this, "密码错误!");
            passwordField.requestFocus();//请求聚焦
        }else{//密码正确,登录成功
            if(u.getIsAdmain()==1) {
                JOptionPane.showMessageDialog(this, "欢迎你!管理员");
                new AdminFrame().setVisible(true);
                setVisible(false);//隐藏窗体
            }
            else if(u.getIsAdmain()==0){
                JOptionPane.showMessageDialog(this, "欢迎你!小学生");
                new ExamFrame().setVisible(true);
                setVisible(false);//隐藏窗体
            }
            else {
                JOptionPane.showMessageDialog(this, "用户类型不能为空!");
            }
        }

密码也正确,进入对应界面

1.管理员
2.学生

否则进行注册


2.管理员界面AdminFrame.java

试题管理界面
1.进入后,会默认显示的内容,因为题目文本框的内容会根据试卷分类下拉框的内容不同而不同,
而试卷分类下拉框默认选择的是“–选择题目类型–”文本,所以题库也会默认显示对应内容。

//首先创建文本框所依附的JPane界面,这样才能在下拉框之前NEW JTable(),java是按顺序执行的,因为没用到多线程
        JPanel panel_1 = new JPanel();
        panel_1.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "\u9898\u5E93", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(51, 153, 255)));
        panel_1.setBounds(199, 10, 498, 369);
        contentPane.add(panel_1);
        panel_1.setLayout(null);

        scrollPane = new JScrollPane();
        scrollPane.setBounds(10, 23, 478, 336);
        panel_1.add(scrollPane);
        //文本框事件
        table = new JTable();
        //JTextXianshi();
        table.setRowHeight(30);
        scrollPane.setViewportView(table);
        //下拉框   
        comboBoxgg = new JComboBox<String>();
        //这是在下拉框中选择不同项时会触发事件
        comboBoxgg.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                int i = comboBoxgg.getSelectedIndex();
                switch(i) {
                case 0:JTextXianshi();break;
                case 1:JTextXianshi1(i);break;
                case 2:JTextXianshi1(i);break;
                case 3:JTextXianshi1(i);break;
                case 4:JTextXianshi1(i);break;
                }
            }
        });

这里有个小细节:因为下拉文本框的事件中写的是题库文本框显示的内容所以要把题库文本框先创造出来,之后case:里面的函数才能用new JPanel的对象生成对应代码,否则会报空指针错误(因为你的对象没有建立出来,你就去调用,当然会出错!)
由于文本框用的是JTable,所以写显示文本函数时用了构建模型的方法,如下:

String[] title = {"题目"};
            String[][] stuArray = new String[6][title.length];

                stuArray[0][0] = " 目前题库中总共有"+counta+"题目,";
                stuArray[1][0] = " 软件基础的题目有"+countb+"道。";
                stuArray[2][0] = " java编程的题目有"+countc+"道。";
                stuArray[3][0] = " Sql Server的题目有"+countd+"道。";
                stuArray[4][0] = " C#的题目有"+counte+"道。";
                stuArray[5][0] = " 你可以对题目进行增添、修改、删除操作。";


            DefaultTableModel tableModel=new DefaultTableModel(stuArray,title);
            table.setModel(tableModel);
//创造连接数据库的方法
        ExamDao exaDao = new ExamDao();
        //根据条件查询题目列表
        List<Exam> exaList = exaDao.queryruanjian(i);
        //把4个题目也存在数组中,根据传进来I值来确定数组中哪个标题
        String[] title = {"软件基础类题目","java编程类题目","Sql Sever类题目","C#类题目"};
        String[] title1 = new String[1];
        title1[0] = title[i-1];

        String[][] stuArray = new String[exaList.size()][1];
        //初始化二维数组
        for(int a=0; a<exaList.size(); a++) {
            Exam e = exaList.get(a);//取出当前集合记录
            stuArray[a][0] = e.getSub();
        }

        //创建模型对象
        DefaultTableModel tableModel=new DefaultTableModel(stuArray,title1);
        //将模型对象设置JTable组件中
        table.setModel(tableModel);

因为要显示的内容都在一个地方,所以只用了一个文本模型,然后根据选择的不同构建不同的模型,但最后都调用的是这一个模型。化繁为简的方法。

2.添加按钮
3.修改按钮
4.删除按钮,没有界面,点了就直接执行:
不过它最开始也要先判断1有没有选择类型
Dao方法根据的题目内容来删除

//点击删除按钮的事件
    private void deleteTimu() {
        int col = table.getSelectedColumn();//获取选中的列号
        int row = table.getSelectedRow();//获取选中的行号
        if(row < 0) {
            JOptionPane.showMessageDialog(this, "请选择要删除的题目!");   
            return;
        }
        else {
        DefaultTableModel model = (DefaultTableModel) table.getModel();//获取defaulttablemodel
        Object val = model.getValueAt(row, col);//根据行号和列号,获取某个单元格的值

        ExamDao exaDao = new ExamDao();
        if(exaDao.delete((String) val)){
            JOptionPane.showMessageDialog(this, "删除成功");     
            return;
        }
        else{
            JOptionPane.showMessageDialog(this, "删除失败,题目选择错误!");
            return ;
        }
        }
    }

3.添加界面AddTestFrame.java

首先会判断你的题目类型有没有选,因为这也是题目信息之一
各个内容的获取,包括难度系数,和正确答案的按钮

Exam exam = new Exam();
        String kid = (String)AdminFrame.comboBoxgg.getSelectedItem();
        String sub = this.textTimu.getText();
        String a = this.textAans.getText();
        String b = this.textBans.getText();
        String c = this.textCans.getText();
        String d = this.textDans.getText();

        //首先判断上个界面中选中的试题类型是什么,根据所选内容返回对应其在数据库中的数值
        if(kid == "软件基础") exam.setKid(1);
        if(kid == "java编程") exam.setKid(2);
        if(kid == "Sql Sever") exam.setKid(3);
        if(kid == "C#") exam.setKid(4);

        //这是判断按钮部分是否被选择被选中,如果被选中就直接返回true
        boolean rate1 = this.rdbtnNewRadioButton.isSelected();
        exam.setRate(rate1 ? "1" : exam.getRate());//判断是否返回的true,如果是true就返回对应数据库中的等级数,如果不是就返回getRate(),还是其他的被选中的正确的值
        boolean rate2 = this.radioButton.isSelected();
        exam.setRate(rate2 ? "2" : exam.getRate());
        boolean rate3 = this.radioButton_1.isSelected();
        exam.setRate(rate3 ? "3" : exam.getRate());
        boolean ansA = this.rdbtnNewRadioButton_1.isSelected();
        exam.setAns(ansA ? "A" : exam.getAns());
        boolean ansB = this.rdbtnB.isSelected();
        exam.setAns(ansB ? "B" : exam.getAns());
        boolean ansC = this.rdbtnC.isSelected();
        exam.setAns(ansC ? "C" : exam.getAns());
        boolean ansD = this.rdbtnD.isSelected();
        exam.setAns(ansD ? "D" : exam.getAns());


然后点击确定按钮后会先对你输入的题目信息先做一次判断1:

// 首先判断文本框里面的内容是否为空
        if (sub.equals("")) {
            JOptionPane.showMessageDialog(this, "题目不能为空!");
            textTimu.requestFocus();// 请求聚焦
            return;
        }
        exam.setSub(sub);//不为空的话直接把数据存储到exam实体中,下面都是这样
        if (a.equals("")) {
            JOptionPane.showMessageDialog(this, "A答案不能为空!");
            textAans.requestFocus();// 请求聚焦
            return;
        }
        exam.setA(a);
        if (b.equals("")) {
            JOptionPane.showMessageDialog(this, "B答案不能为空!");
            textBans.requestFocus();// 请求聚焦
            return;
        }
        exam.setB(b);
        if (c.equals("")) {
            JOptionPane.showMessageDialog(this, "C答案不能为空!");
            textCans.requestFocus();// 请求聚焦
            return;
        }
        exam.setC(c);
        if (d.equals("")) {
            JOptionPane.showMessageDialog(this, "D答案不能为空!");
            textDans.requestFocus();// 请求聚焦
            return;
        }
        exam.setD(d);
        if (rate1 == false && rate2 == false && rate3 == false) {
            JOptionPane.showMessageDialog(this, "难度选项不能为空!");
            // 懒得用聚焦直接自己鼠标点中就行了,意思是只有点中这个框子范围内才有用
            return;
        }

        if (ansA == false && ansB == false && ansC == false && ansD == false) {
            JOptionPane.showMessageDialog(this, "正确答案选项不能为空!");
            return;
        }

最后把获得的信息存入到数据库:

//然后调用ExamDao方法,与数据库连接,把数据添加进去
        ExamDao exmDao = new ExamDao();
        if(exmDao.add(exam)){
            JOptionPane.showMessageDialog(this, "添加成功");

            return;
        }
        else{
            JOptionPane.showMessageDialog(this, "添加失败");
            return ;
        }

4.修改界面ModifyFrame.java

首先会判断1你的题目类型有没有选,因为这也是题目信息之一,但是题目类型修改不了
点击修改按钮时会先判断2你有没有选择要修改的题目

    //点击修改按钮
    private void ZjFF() {
        int x = 0;
        int col = table.getSelectedColumn();//获取选中的列号
        int row = table.getSelectedRow();//获取选中的行号
        if(row < 0) {
            JOptionPane.showMessageDialog(this, "请选择要修改的题目!");   
            return;
        }
        else {
        DefaultTableModel model = (DefaultTableModel) table.getModel();//获取defaulttablemodel
        Object val = model.getValueAt(row, col);//根据行号和列号,获取某个单元格的值
            //创建Dao方法来获取所选题目对应的id
            ExamDao exaDao = new ExamDao();
            x = exaDao.zhff((String) val);
            //创建删除窗口对象
            ModifyFrame fream = new ModifyFrame();
            fream.Huoqu(x);//先把id值传过去
            fream.setVisible(true);//再打开窗口
        }

    }

根据你点击文本框题目然后获得其对应id号,因为要根据其id来确定要修改的是哪道题目,id在数据库是这个表的主键!
这里有个小细节,我写了一个Huoqu的小方法专门用来获取id值,再在ModifyFrame()中传给其修改方法,因为这里不能直接传给他,因为现在还不能调用这个方法,这个方法是要在点确定键时启用。
然后修改界面:
这里写图片描述

Exam exam = new Exam();//先new一个exam实体对象
        String kid = (String)AdminFrame.comboBoxgg.getSelectedItem();//获取下拉框的内容
        String sub = this.textTimu.getText();//获取题目框的文本内容
        String a = this.textAans.getText();//获取答案A框的文本内容
        String b = this.textBans.getText();//获取答案B框的文本内容
        String c = this.textCans.getText();//获取答案C框的文本内容
        String d = this.textDans.getText();//获取答案D框的文本内容

        //首先判断上个界面中选中的试题类型是什么,根据所选内容返回对应其在数据库中的数值
        if(kid == "软件基础") exam.setKid(1);
        if(kid == "java编程") exam.setKid(2);
        if(kid == "Sql Sever") exam.setKid(3);
        if(kid == "C#") exam.setKid(4);

        //这是判断按钮部分是否被选择被选中,如果被选中就直接返回true
        boolean rate1 = this.rdbtnNewRadioButton.isSelected();
        exam.setRate(rate1 ? "1" : exam.getRate());//判断是否返回的true,如果是true就返回对应数据库中等级数,如果不是就返回getRate(),还是其他的被选中的正确的值
        boolean rate2 = this.radioButton.isSelected();
        exam.setRate(rate2 ? "2" : exam.getRate());
        boolean rate3 = this.radioButton_1.isSelected();
        exam.setRate(rate3 ? "3" : exam.getRate());
        boolean ansA = this.rdbtnNewRadioButton_1.isSelected();
        exam.setAns(ansA ? "A" : exam.getAns());
        boolean ansB = this.rdbtnB.isSelected();
        exam.setAns(ansB ? "B" : exam.getAns());
        boolean ansC = this.rdbtnC.isSelected();
        exam.setAns(ansC ? "C" : exam.getAns());
        boolean ansD = this.rdbtnD.isSelected();
        exam.setAns(ansD ? "D" : exam.getAns());

再判断3:文本款内容得写满

// 首先判断文本框里面的内容是否为空
        if (sub.equals("")) {
            JOptionPane.showMessageDialog(this, "题目不能为空!");
            textTimu.requestFocus();// 请求聚焦
            return;
        }
        exam.setSub(sub);//不为空的话直接把数据存储到exam实体中,下面都是这样
        if (a.equals("")) {
            JOptionPane.showMessageDialog(this, "A答案不能为空!");
            textAans.requestFocus();// 请求聚焦
            return;
        }
        exam.setA(a);
        if (b.equals("")) {
            JOptionPane.showMessageDialog(this, "B答案不能为空!");
            textBans.requestFocus();// 请求聚焦
            return;
        }
        exam.setB(b);
        if (c.equals("")) {
            JOptionPane.showMessageDialog(this, "C答案不能为空!");
            textCans.requestFocus();// 请求聚焦
            return;
        }
        exam.setC(c);
        if (d.equals("")) {
            JOptionPane.showMessageDialog(this, "D答案不能为空!");
            textDans.requestFocus();// 请求聚焦
            return;
        }
        exam.setD(d);
        if (rate1 == false && rate2 == false && rate3 == false) {
            JOptionPane.showMessageDialog(this, "难度选项不能为空!");
            // 懒得用聚焦直接自己鼠标点中就行了,意思是只有点中这个框子范围内才有用
            return;
        }

        if (ansA == false && ansB == false && ansC == false && ansD == false) {
            JOptionPane.showMessageDialog(this, "正确答案选项不能为空!");
            return;
        }
//然后调用ExamDao方法,与数据库连接,把数据添加进去
        ExamDao exaDao = new ExamDao();
        if(exaDao.modify(exam, id)) {
            JOptionPane.showMessageDialog(this, "修改成功");
            return;
        }
        else{
            JOptionPane.showMessageDialog(this, "修改失败");
            return ;
        }

5.考试界面ExamFrame.java

这里写图片描述
很多东西在管理员界面都实现了,只不过嵌套方式和调用有些不一样,让我一一道来
1.简单的信息展示:考试说明


        JTextArea textArea_4 = new JTextArea();
        textArea_4.setText("\u672C\u6B21\u8003\u8BD5\u8003\u751F\u53EF\u81EA\u884C\u9009\u62E9\u79D1\u76EE\u548C\u96BE\u5EA6\uFF0C\u9009\u62E9\u8FC7\u79D1\u76EE\u548C\u96BE\u5EA6\u4E4B\u540E\u5373\u53EF\u7B54\u9898\uFF0C\u4E00\u5171\u4E94\u4E2A\u9009\u62E9\u9898\uFF0C\u6BCF\u989820\u5206\uFF0C\u5171100\u5206\u3002\r\n\u8003\u8BD5\u65F6\u95F4\u4E3A2\u5206\u949F\uFF1B\u8BF7\u5404\u4F4D\u8003\u751F\u6CE8\u610F\uFF1A\u79D1\u76EE\u548C\u96BE\u5EA6\u4E00\u65E6\u9009\u62E9\u4E4B\u540E\u5C06\u4E0D\u53EF\u66F4\u6539\uFF01\r\n\u4EA4\u5377\u8BF7\u70B9\u51FB\u201C\u63D0\u4EA4\u7B54\u9898\u201D\u6309\u94AE\uFF0C\u5982\u672A\u70B9\u51FB\uFF0C\u65F6\u95F4\u5230\u8FBE\u81EA\u52A8\u63D0\u4EA4\uFF01");
        textArea_4.setBounds(10, 20, 673, 67);
        panel.add(textArea_4);

用的是JTextArea.
2.一开进去是没有显示什么东西的,所有的都要等你点击开始按钮后才开始执行
会判断试卷类型、难度系数、
然后显示题目,点击每道题目后选项文本框才能显示答案
然后剩余时间线程也会开始
这里写图片描述
(注意!)我这里写的答题卡部分是通过点击题目文本框每道题目时来获取题目的答案和题目的对应正确答案。
点击开始按钮时,还会隐藏,然后提交答案按钮显示出来

//开始按钮
        Startbutton = new JButton("\u5F00\u59CB");
        Startbutton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(FirstPanduan ()){
                    showAll();
                    getansreal();
                    Startbutton.setVisible(false);//开始按钮消失
                    thread.start();
                    showButton();//调用提交答案按钮
                }

            }
        });
        Startbutton.setBounds(63, 336, 93, 23);
        panel_4.add(Startbutton);
//创建一个方法,当开始按钮隐藏时,提交答案按钮显示
    public void showButton() {
        panel_4.add(OverButton);
    }

2.然后点击提高按钮会除法相应事件:
其实也就是个计算得分。
3.刚才修改了一下,原来不能交白卷,因为正确答案的获取要靠鼠标点击题目来获取,现在修改为通过点击开始按钮来直接获取!代码省了不少!

//批改试卷,判断其答案正确不?
        public void getans1() { 
            //判断答题卡部分选择的答案  
            Exam T[] = new Exam[5];
            for(int i=0; i<5; i++) {
                T[i] = new Exam();
            }

            String ans[] = {"A","B","C","D"};
            //获取在答题卡选择的选项
            boolean b[] = new boolean[4];
                for(int j=0; j<4; j++) {
                    b[j] = this.rdbtnA[j].isSelected();
                    T[0].setAns(b[j] ? ans[j] : T[0].getAns());
                }   
                for(int n=0; n<4;n++) {
                    b[n] = this.radioButton_1[n].isSelected();
                    T[1].setAns(b[n] ? ans[n] : T[1].getAns());
                }
                for(int k=0; k<4; k++) {
                    b[k] = this.radioButton_5[k].isSelected();
                    T[2].setAns(b[k] ? ans[k] : T[2].getAns());
                }
                for(int l=0; l<4; l++) {
                    b[l] = this.radioButton_9[l].isSelected();
                    T[3].setAns(b[l] ? ans[l] : T[3].getAns());
                }
                for(int m=0; m<4; m++) {
                    b[m] = this.radioButton_13[m].isSelected();
                    T[4].setAns(b[m] ? ans[m] : T[4].getAns());
                }
                //
                int a=0;
                for(int i=0; i<5; i++){
                    if(t[i].equals(T[i].getAns())){
                        a++;
                    }
                }

                switch(a) {
                case 0:JOptionPane.showMessageDialog(this, "你的得分为:0分!");break;
                case 1:JOptionPane.showMessageDialog(this, "你的得分为:20分!");   break;
                case 2:JOptionPane.showMessageDialog(this, "你的得分为:20分!");   break;
                case 3:JOptionPane.showMessageDialog(this, "你的得分为:20分!");   break;
                case 4:JOptionPane.showMessageDialog(this, "你的得分为:20分!");   break;
                case 5:JOptionPane.showMessageDialog(this, "你的得分为:20分!");   break;
                }   
        }

重点:理解了容器储存是树形的

//直接通过开始选择的题目类型和难度系数来获取5道题目的正确答案
        public void getansreal() {
            Exam exam = new Exam();
            ExamDao examDao = new ExamDao();

            //判断难度按钮有没有被选择,然后返回相应等级数
            boolean rate1 = this.Buttoneasy.isSelected();
            exam.setRate(rate1 ? "1" : exam.getRate());//判断是否返回的true,如果是true就返回对应数据库中的等级数,如果不是就返回getRate(),还是其他的被选中的正确的值
            boolean rate2 = this.Buttonnormal.isSelected();
            exam.setRate(rate2 ? "2" : exam.getRate());
            boolean rate3 = this.Buttonhard.isSelected();
            exam.setRate(rate3 ? "3" : exam.getRate());

            List<Exam> examList = examDao.showAll1(x, exam.getRate());
            Exam e[] = new Exam[5];
            for(int i=0; i<5; i++){
                e[i] = examList.get(i);
            }

            for(int j=0; j<5; j++){
                t[j] = e[j].getAns();
            }

        }

最后点击,提交答案按钮后会关闭当前窗口,出现新的考试界面窗口,不过你也可以写一个考试结果的窗口,懒得写了。。。

//提交答案按钮
        OverButton = new JButton("\u63D0\u4EA4\u7B54\u9898");
        OverButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                thread.stop();
                getans1();
                ExamFrame exFrame = new ExamFrame();
                exFrame.setVisible(true);
                setVisible(false);
            }
        });
        OverButton.setBounds(63, 336, 93, 23);
        //panel_4.add(OverButton);

6. 注册界面

这里写图片描述

//设置输入的信息到User实体中
        User user = new User();
        //if(isAdmain == "管理员") user.setIsAdmain(1);
        if(isAdmain == "学生员") user.setIsAdmain(0);
        user.setUsername(username);//得到输入的信息
        user.setPassword(password);

        boolean b = true;
        UserDao userDao = new UserDao();
        List<User> userList = userDao.panduanuser();//返回根据用户名查找的信息
        User[] us = new User[userList.size()];
        //System.out.println(userList.size());
        for(int i=0; i<userList.size(); i++){
            us[i] = userList.get(i);
            if(username.equals(us[i].getUsername())) {
                JOptionPane.showMessageDialog(this, "用户名已存在!");

                b = false;
            }
        }
        if(b == true ){
            userDao.adduser(user);
                    JOptionPane.showMessageDialog(this, "注册成功");    
            return;
        }
        else{
            JOptionPane.showMessageDialog(this, "注册失败,请重新输入!");
            return ;
        }
    }

这个Dao方法很重要

 /*
             * 功能:判断用户名有没有重复
             * 参数:user
             * 返回值:boolean成功true,失败false
             * */  
         public List<User> panduanuser() {
             List<User> userList = new ArrayList<User>();
             conn = DBUtil.getConnection();
             try{
                 stmt = conn.createStatement();  
                 String sql = "SELECT UserName FROM user";
                 rs = stmt.executeQuery(sql);
                 while(rs.next()) {
                     User us = new User();
                     us.setUsername(rs.getString(1));
                     userList.add(us);//这里一条List只存一条信息
                 }

             } catch (SQLException e) {
                 e.printStackTrace();
             }
             return userList;
         }

7. 总结

1.项目开发阶段:能够完成的功能尽量用简单逻辑与优化的算法去实现,界面能保证漂亮的同时还要能显示完整。
2.写完测试阶段:要保证运行基本用户操作时不出现大Bug。
3.优化阶段:把开发阶段没有优化的复杂代码和废话代码优化。
这个项目还是很简单的,没什么复杂的算法,主要是实现按钮的监听事件与各个界面的切换还有实现界面与数据库的交互! 2016/07/29 11:02

源码下载地址:http://download.csdn.net/detail/qq_31783173/9828625

猜你喜欢

转载自blog.csdn.net/qq_31783173/article/details/52074963