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();
}
}

Logo

本社区面向用户介绍CSDN开发云部门内部产品使用和产品迭代功能,产品功能迭代和产品建议更透明和便捷

更多推荐