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道题并核对答案文章来源:https://www.toymoban.com/news/detail-475733.html
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) {
}
}
系统主界面部分文章来源地址https://www.toymoban.com/news/detail-475733.html
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实训项目一一考试系统(附源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!