0


Java实训项目一一考试系统(附源码)

**1 **实训基本信息

1.1****实训项目名称

(1)考试系统

**1.2 **实训环境

本次实训内容主要针对专业学生,实训形式以实战讲解为主导。实训课程由实训老师主讲,实训老师教学严谨又平易近人,讲解的内容非常细致和认真,对于重要的知识点内容老师还特意的标注下来,方便同学们回顾学习。

**2 **实训内容简介

**2.1 **考试系统

考试系统是一种可以从题库中随机抽取指定题目数量的系统,主要由Java开发环境JDK、集成开发环境Eclipse、数据库管理系统软件MySQL和数据库图形化管理工具Navicat 相结合而构成。

通过在数据库中创建Test表和Recoed表,建立与数据库的连接,即程序与数据库之间的桥梁,并向数据库发送SQL语句,利用程序把具体的数据库操作发送出去,实现程序对数据库进行增加、删除、更改、查找以及从数据库中随机抽题的操作,最后处理从数据库返回的操作结果。

考试界面由窗体类、菜单和事件代码组成,通过单击开始考试,系统从数据库中随机抽题,并将抽取题目显示在文本区中,用户可以点击下一题继续答题,也可以选择上一题更改之前的选项,最后点击提交完成考试,系统通过游戏记录来记录本次考试,用户可以通过记录查看本次考试。

**3 **项目开发过程

**3.1 **考试系统

数据库管理系统软件MySQL和数据库图形化管理工具Navicat,使用JDBC完成数据库与Java建立连接,向数据库发送SQL语句,处理从数据库返回的操作结果;

3.2 开发步骤

1、数据库的连接和使用:

通过在数据库中创建Test表和Recoed表,使用JDBC完成数据库与Java建立连接建立与数据库的连接,即程序与数据库之间的桥梁,并向数据库发送SQL语句,利用程序把具体的数据库操作发送出去,实现程序对数据库进行增加、删除、更改、查找以及从数据库中随机抽题的操作,最后处理从数据库返回的操作结果。

2、考试界面设计:

考试界面由窗体类、菜单和事件代码组成,通过单击开始考试,系统从数据库中随机抽题,并将抽取题目显示在文本区中,用户可以点击下一题继续答题,也可以选择上一题更改之前的选项,最后点击提交完成考试,系统通过游戏记录来记录本次考试,用户可以通过记录查看本次考试。

3、开始考试功能:

单击开始考试,抽取10道题放到一个集合中,并定义一个集合list存储抽到的题,将用户选择的答案保存在test对象中,增加一个成员变量,保存用户的答案,修改Test类,成员变量userda,写答案到test中,用一个方法实现,把修改后的test替换集合中的相应元素,按钮组的所有选项清空;

4、上一题下一题显示功能:

Index实现加1,显示下一道题,上一题按钮可用,下一题按钮在index=9按钮不可用,单击上一题按钮,将当前选项答案存入集合,显示下一道题,index=0按钮不可用,当用户回看做过的题时,保留之前的选择,代码写在printjm中。

5、提交并记录成绩功能:

点击提交按钮,比对用户答案和正确答案之间是否相等,给出成绩,并将用户名称和成绩存入record表。

6、查看成绩记录功能:

查询record表中的所有记录,显示在jta的文本区中,结果存在一个集合里,集合中的每一个元素就是一条记录,用Record类的对象表示,RecordDao类中的方法public static ArrayList<Record> findAll(){…},调用方法findAll获取集合数据,遍历集合获取每一个元素的值,将元素值显示在文本区中。

4 系统截图

** 5 程序源代码**

登录界面部分(用户名:root 密码:123)

import javax.swing.*;
import javax.swing.plaf.FontUIResource;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Enumeration;

public class Login extends JFrame implements ActionListener {
    // 定义主窗口
    private  JFrame jf;
    // 定义输入用户名和密码的标签提示
    private  JLabel InputUserName;
    private  JLabel InputPassWord;
    // 定义输入用户名文本框
    private  JTextField UserName;
    // 定义输入密码框
    private  JPasswordField PassWord;
    // 定义登录和取消按钮
    private  JButton Login;
    private  JButton Cancel;
    JRadioButton stu,tea;
    Login() {
        // 各组件实例化过程
        setTitle("登录");
        InitGlobalFont(new Font("黑体", Font.PLAIN, 20));
        InputUserName = new JLabel("  用户名:    ");
        InputPassWord = new JLabel("  密  码:    ");
        UserName = new JTextField();
        PassWord = new JPasswordField();
        ButtonGroup bg=new ButtonGroup();
        bg.add(stu);
        bg.add(tea);
        Login = new JButton("登录");
        Cancel = new JButton("取消");
        // 设置主窗口大小、位置和布局
        setSize(500, 200);
        setLocation(600, 400);
        // 设置窗口流式布局
        setLayout(new FlowLayout());
        // 设置用户名和密码框大小
        UserName.setPreferredSize(new Dimension(300, 30));
        PassWord.setPreferredSize(new Dimension(300, 30));

        // 依次向主窗口添加各组件
       add(InputUserName);
        add(UserName);
        add(InputPassWord);
        add(PassWord);
        add(Login);
        add(Cancel);
        // 设置主窗口不可调节大小
        setResizable(false);
        // 设置主窗口默认关闭操作
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 给登录和取消按钮添加 Action 监听器
        Login.addActionListener(this);
        Cancel.addActionListener(this);
        // 设置主窗口可见
       setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // 如果单击【退出】按钮则程序退出
        if (e.getSource().equals(Cancel)) {
            System.exit(0);
        }
        // 如果单击【登录】按钮则检查用户名和密码是否匹配
        else if (e.getSource().equals(Login)) {
            // 如果用户名和密码匹配,则打开具体操作面板
            if (UserName.getText().equals("root") && String.valueOf(PassWord.getPassword()).equals("123")) {

                new ExamJFrame();
                setVisible(false);
                dispose();

            }
            // 如果用户名和密码不匹配,则给出提示对话框
            else {
                JOptionPane.showOptionDialog(jf, "输入有误", "登陆失败",
                        JOptionPane.CLOSED_OPTION,
                        JOptionPane.ERROR_MESSAGE, null, null, null);
            }

        }
    }

    /**
     * 统一设置字体,父界面设置之后,所有由父界面进入的子界面都不需要再次设置字体
     */
    private static void InitGlobalFont(Font font) {
        FontUIResource fontRes = new FontUIResource(font);
        for (Enumeration<Object> keys = UIManager.getDefaults().keys(); keys.hasMoreElements();) {
            Object key = keys.nextElement();
            Object value = UIManager.get(key);
            if (value instanceof FontUIResource) {
                UIManager.put(key, fontRes);
            }
        }
    }
    public static void main(String[] args) {
        new Login();
    }
}

数据库连接与记录

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import com.sun.prism.impl.Disposer.Record;

/*
 * 用户记录表的数据库访问
 */
public class RecordDao {
     public static  Connection conn = null;
        //获取访问mytest的连接对象
       public static Connection getConnection(){
            // 1、加载驱动
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            // 2、通过驱动管理器调用方法创建连接对象
            String url = "jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf8";
            String user = "root";// MySQL中默认访问的用户名
            String password = "123";

            try {
                conn = DriverManager.getConnection(url, user, password);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return conn;
       }
//record表添加记录
       //Record re 参数
       public static int addrecord(管理系统02.Record re){
           int flag=0;
           String sql="insert into record (name,score) values('"+re.getName()
           +"',"+re.getScore()+")";
           System.out.println(sql);
           //创建连接对象
           conn=getConnection();
           //创建命令对象
           Statement stmt=null;
           try{
               stmt=conn.createStatement();
               //执行添加记录操作
               flag=stmt.executeUpdate(sql);
           }catch(SQLException e){
               e.printStackTrace();
           }
           return flag;
       }
     //查询用户分数表中所有记录
       public static ArrayList<Record> findAll(){
           conn=getConnection();
           Statement stmt=null;
           //创建一个集合对象
           ArrayList<Record> list=new ArrayList<Record>();
           //创建集合中的元素
           Record re;
           //创建命令对象
           try {
            stmt=conn.createStatement();
            String sql="select * from record ";
            ResultSet rs = stmt.executeQuery(sql);
//            while(rs.next()){
//                //对元素对象初始化
//                re=new Record();
//                //对元素的成员进行赋值
//                re.setId(rs.getInt(1));
//                re.setName(rs.getString(2));
//                re.setScore(rs.getInt(3));
//            //    System.out.println(re);
//                //添加元素到集合
//                list.add(re);
//            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
           try {
            stmt.close();
             conn.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

           return list;
       }
public static void main(String[] args) {
}
}

存储随机抽取的题目

//试题类,存储每一道题的类
public class Test {
   private int id;
   private String content;
   private String sa;
   private String sb;
   private String sc;
   private String sd;
   private String answer;
   private String userda="E";
   
public Test() {
    super();
    // TODO 自动生成的构造函数存根
}
public String getUserda() {
    return userda;
}
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public String getContent() {
    return content;
}
public void setContent(String content) {
    this.content = content;
}
public String getSa() {
    return sa;
}
public void setSa(String sa) {
    this.sa = sa;
}
public String getSb() {
    return sb;
}
public void setSb(String sb) {
    this.sb = sb;
}
public String getSc() {
    return sc;
}
public void setSc(String sc) {
    this.sc = sc;
}
public String getSd() {
    return sd;
}
public void setSd(String sd) {
    this.sd = sd;
}
public String getAnswer() {
    return answer;
}
public void setAnswer(String answer) {
    this.answer = answer;
}
public void setUserda(String userda) {
    this.userda = userda;
}
}

随机抽取10道题并核对答案

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.mysql.jdbc.Statement;

public class TestD {
    public static Connection conn = null;
    //获取访问mytest的连接对象
    public static Connection getConnection() {
        try {
        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("驱动加载成功");
    }catch (ClassNotFoundException e) {
        e.printStackTrace();
        System.out.println("驱动加载失败");
    }
    String url="jdbc:mysql://localhost:3306/test01";
    String user="root";
    String password="123";
    try {
        conn = DriverManager.getConnection(url,user,password);
    }catch (SQLException e) {
        e.printStackTrace();
    }
    return conn;
}
    public static ArrayList<Test> find10(){
        conn=getConnection();
        Statement stmt=null;
        //创建一个集合对象
        ArrayList<Test> list = new ArrayList<Test>();
        //创建集合中的元素
        Test test;
        //创建命令对象
        try {
            stmt=(Statement) conn.createStatement();
            String sql = "select * from test order by rand() limit 10";
            ResultSet rs = stmt.executeQuery(sql);
            while(rs.next()) {
                //元素对象初始化
                test=new Test();
                //进行赋值
                test.setId(rs.getInt(1));
                test.setContent(rs.getString(2));
                test.setSa(rs.getString(3));
                test.setSb(rs.getString(4));
                test.setSc(rs.getString(5));
                test.setSd(rs.getString(6));
                test.setAnswer(rs.getString(7));
                //添加元素到集合
                list.add(test);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
           try {
            stmt.close();
             conn.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

           return list;
       }
       public static void main(String[] args) {
    }
}

系统主界面部分

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;

import 管理系统02.Record;

/*
 * 主窗体
 */
public class ExamJFrame extends JFrame{
    JMenuBar jmb;
    JMenu jm,jm2;
    JMenuItem jmi1,jmi2;
    JPanel jp1;
    JLabel jlb;//题目
    JRadioButton jr1,jr2,jr3,jr4;//四个选项的单选按钮
    JButton jb1,jb2,jb3;//三个按钮,上一题、下一题、提交
    JPanel jp2;//用来放三个按钮
    ButtonGroup bg;//按钮组,实现单选按钮的排斥
    JTextArea jta;
    Test test;
    ArrayList<Test> list;
    int index;

    ExamJFrame(){
        setTitle("考试系统");
        setSize(700, 500);
        setLocationRelativeTo(null);
        InitGlobalFont(new Font("黑体", Font.PLAIN, 20));
        init();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        jmi1.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                init2();
                //抽取10道题到集合
                list=TestD.find10();
                //显示第一题到页面中
                index=0;
                //把index索引的值显示在界面中
                printjm(index);
                //上一题按钮不可用
                jb1.setEnabled(false);
            }
        });
        jmi2.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                init3();
            }
        });
    }
    //定义查询记录的界面
    public void init3() {
        jp1.removeAll();
        jp1.setLayout(new BorderLayout());
        jta=new JTextArea();

        JScrollPane jsp=new JScrollPane(jta);
        jp1.add(jta);
        //调用方法findAll获取集合数据
        ArrayList<Record> relist=Record.findAll();
        //遍历集合获取每一个元素的值
        for(int i=0;i<relist.size();i++) {
            //获取每一个元素
            Record re=relist.get(i);
            //元素表示每个用户的分数放在字符串中
            String str="序号:"+re.getId()+" \t姓名:"+re.getName()+"\t成绩:"+re.getScore()+"\r\n";
            //将元素值显示在文本区中,不能用setTest方法
            jta.append(str);
        }

        this.validate();
    }
    //设置初始界面
    public void init() {
        jmb=new JMenuBar();
        jm=new JMenu("考试");
        jm2=new JMenu("考试记录");
        jmi1=new JMenuItem("开始考试");
        jmi2=new JMenuItem("查询所有考试记录");
        jm.add(jmi1);
        jm2.add(jmi2);
        jmb.add(jm);
        jmb.add(jm2);
        setJMenuBar(jmb);
        jp1=new JPanel();

        add(jp1);
    }

    //考试时候的组件布局
    public void init2(){
        jp1.removeAll();
        //设置面板的布局为网格布局,只有一列
        jp1.setLayout(new GridLayout(0,1));
        jlb=new JLabel("题目");
        jr1=new JRadioButton("1");
        jr2=new JRadioButton("2");
        jr3=new JRadioButton("3");
        jr4=new JRadioButton("4");

        //单选按钮要实现互相排斥,多选一,ButtonGroup按钮组
        bg=new ButtonGroup();
        bg.add(jr1);
        bg.add(jr2);
        bg.add(jr3);
        bg.add(jr4);
        jp2=new JPanel();
        jb1=new JButton("上一题");
        jb2=new JButton("下一题");
        jb3=new JButton("提交");
        jp2.add(jb1);
        jp2.add(jb2);
        jp2.add(jb3);
        //中间的大面板jp1添加组件
        //滚动条面板添加jlb
        jp1.add(new JScrollPane(jlb));
        jp1.add(jr1);
        jp1.add(jr2);
        jp1.add(jr3);
        jp1.add(jr4);
        jp1.add(jp2);

        this.validate();
        
//单击上一题
        jb1.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                save(index);
                //索引加一
                index--;
                printjm(index);
                jb2.setEnabled(true);
                if(index<1) {
                    jb1.setEnabled(false);
                }
            }
        });

//单击下一题
    jb2.addActionListener(new ActionListener() {
        
        @Override
        public void actionPerformed(ActionEvent e) {
            save(index);
            //索引加一
            index++;
            printjm(index);
            jb1.setEnabled(true);
            if(index>list.size()-2) {
                jb2.setEnabled(false);
            }
        }
    });
//提交试卷,给出成绩并写入record表
jb3.addActionListener(new ActionListener() {
        
        @Override
        public void actionPerformed(ActionEvent e) {
            //保存当前选项
            save(index);
            //比对用户答案和正确答案是否相同
            int sum = 0;
            //遍历集合的所有元素,取出两个成绩,比对
            for(int i=0;i<list.size();i++) {
//                System.out.println(list.get(i).getUserda());
                if(list.get(i).getUserda().equals(list.get(i).getAnswer())) {
                    sum+=10;
                }
            }
            //给出用户名
            String name=JOptionPane.showInputDialog("请输入你的名字");
            //成绩通过消息框显示
            JOptionPane.showMessageDialog(null, "同学,你的成绩是"+sum+"分");
            //将用户名和成绩存入record表
            //将用户名和成绩存入一个record对象中
            Record re = new Record();
            re.setName(name);
            re.setScore(sum);
            //调用方法addrecord写数据
            RecordDao.addrecord(re);
        }
    });
}

    /**
     * 统一设置字体,父界面设置之后,所有由父界面进入的子界面都不需要再次设置字体
     */
    private static void InitGlobalFont(Font font) {
        FontUIResource fontRes = new FontUIResource(font);
        for (Enumeration<Object> keys = UIManager.getDefaults().keys(); keys.hasMoreElements();) {
            Object key = keys.nextElement();
            Object value = UIManager.get(key);
            if (value instanceof FontUIResource) {
                UIManager.put(key, fontRes);
            }
        }
    }
    //显示索引为index的试题信息到界面中(jp1)
    public void printjm(int index) {
        //获取index下标的元素
        test=list.get(index);
        //将题目信息放到标签中,题号1-10
        jlb.setText(index + 1 +"." + test.getContent());
        //将当前题的选项放到单选按钮中
        jr1.setText(test.getSa());
        jr2.setText(test.getSb());
        jr3.setText(test.getSc());
        jr4.setText(test.getSd());
        //获取用户选择的答案内容
        String userda=test.getUserda();
        if(userda!=null) {
            //根据用户输入的答案,设置相应的单选按钮为选中状态
            switch(userda) {
            case"A":jr1.setSelected(true);break;
            case"B":jr2.setSelected(true);break;
            case"C":jr3.setSelected(true);break;
            case"D":jr4.setSelected(true);break;
            }
        }
        //界面刷新
        validate();
    }
   public void save(int index) {
       //如果用户没有选择
       String userda="E";
       //判断用户选的是哪一项
       if(jr1.isSelected()) userda="A";
       if(jr2.isSelected()) userda="B";
       if(jr3.isSelected()) userda="C";
       if(jr4.isSelected()) userda="D";
       //用户答案写入
       test.setUserda(userda);
       //更新集合中对应的元素
       list.set(index,test);
       //按钮组所有选项清空
       bg.clearSelection();
   }
    
   public static void main(String[] args) {
       new ExamJFrame();
}
}
标签: java 数据库 mysql

本文转载自: https://blog.csdn.net/qq_64314976/article/details/125988036
版权归原作者 Meteor.792 所有, 如有侵权,请联系我们删除。

“Java实训项目一一考试系统(附源码)”的评论:

还没有评论