1 實(shí)訓(xùn)基本信息
1.1 實(shí)訓(xùn)項(xiàng)目名稱
(1)考試系統(tǒng)
1.2 實(shí)訓(xùn)環(huán)境
本次實(shí)訓(xùn)內(nèi)容主要針對專業(yè)學(xué)生,實(shí)訓(xùn)形式以實(shí)戰(zhàn)講解為主導(dǎo)。實(shí)訓(xùn)課程由實(shí)訓(xùn)老師主講,實(shí)訓(xùn)老師教學(xué)嚴(yán)謹(jǐn)又平易近人,講解的內(nèi)容非常細(xì)致和認(rèn)真,對于重要的知識點(diǎn)內(nèi)容老師還特意的標(biāo)注下來,方便同學(xué)們回顧學(xué)習(xí)。
2 實(shí)訓(xùn)內(nèi)容簡介
2.1?考試系統(tǒng)
考試系統(tǒng)是一種可以從題庫中隨機(jī)抽取指定題目數(shù)量的系統(tǒng),主要由Java開發(fā)環(huán)境JDK、集成開發(fā)環(huán)境Eclipse、數(shù)據(jù)庫管理系統(tǒng)軟件MySQL和數(shù)據(jù)庫圖形化管理工具Navicat 相結(jié)合而構(gòu)成。
通過在數(shù)據(jù)庫中創(chuàng)建Test表和Recoed表,建立與數(shù)據(jù)庫的連接,即程序與數(shù)據(jù)庫之間的橋梁,并向數(shù)據(jù)庫發(fā)送SQL語句,利用程序把具體的數(shù)據(jù)庫操作發(fā)送出去,實(shí)現(xiàn)程序?qū)?shù)據(jù)庫進(jìn)行增加、刪除、更改、查找以及從數(shù)據(jù)庫中隨機(jī)抽題的操作,最后處理從數(shù)據(jù)庫返回的操作結(jié)果。
考試界面由窗體類、菜單和事件代碼組成,通過單擊開始考試,系統(tǒng)從數(shù)據(jù)庫中隨機(jī)抽題,并將抽取題目顯示在文本區(qū)中,用戶可以點(diǎn)擊下一題繼續(xù)答題,也可以選擇上一題更改之前的選項(xiàng),最后點(diǎn)擊提交完成考試,系統(tǒng)通過游戲記錄來記錄本次考試,用戶可以通過記錄查看本次考試。
3 項(xiàng)目開發(fā)過程
3.1?考試系統(tǒng)
數(shù)據(jù)庫管理系統(tǒng)軟件MySQL和數(shù)據(jù)庫圖形化管理工具Navicat,使用JDBC完成數(shù)據(jù)庫與Java建立連接,向數(shù)據(jù)庫發(fā)送SQL語句,處理從數(shù)據(jù)庫返回的操作結(jié)果;
3.2 開發(fā)步驟
1、數(shù)據(jù)庫的連接和使用:
通過在數(shù)據(jù)庫中創(chuàng)建Test表和Recoed表,使用JDBC完成數(shù)據(jù)庫與Java建立連接建立與數(shù)據(jù)庫的連接,即程序與數(shù)據(jù)庫之間的橋梁,并向數(shù)據(jù)庫發(fā)送SQL語句,利用程序把具體的數(shù)據(jù)庫操作發(fā)送出去,實(shí)現(xiàn)程序?qū)?shù)據(jù)庫進(jìn)行增加、刪除、更改、查找以及從數(shù)據(jù)庫中隨機(jī)抽題的操作,最后處理從數(shù)據(jù)庫返回的操作結(jié)果。
2、考試界面設(shè)計(jì):
考試界面由窗體類、菜單和事件代碼組成,通過單擊開始考試,系統(tǒng)從數(shù)據(jù)庫中隨機(jī)抽題,并將抽取題目顯示在文本區(qū)中,用戶可以點(diǎn)擊下一題繼續(xù)答題,也可以選擇上一題更改之前的選項(xiàng),最后點(diǎn)擊提交完成考試,系統(tǒng)通過游戲記錄來記錄本次考試,用戶可以通過記錄查看本次考試。
3、開始考試功能:
單擊開始考試,抽取10道題放到一個(gè)集合中,并定義一個(gè)集合list存儲抽到的題,將用戶選擇的答案保存在test對象中,增加一個(gè)成員變量,保存用戶的答案,修改Test類,成員變量userda,寫答案到test中,用一個(gè)方法實(shí)現(xiàn),把修改后的test替換集合中的相應(yīng)元素,按鈕組的所有選項(xiàng)清空;
4、上一題下一題顯示功能:
Index實(shí)現(xiàn)加1,顯示下一道題,上一題按鈕可用,下一題按鈕在index=9按鈕不可用,單擊上一題按鈕,將當(dāng)前選項(xiàng)答案存入集合,顯示下一道題,index=0按鈕不可用,當(dāng)用戶回看做過的題時(shí),保留之前的選擇,代碼寫在printjm中。
5、提交并記錄成績功能:
點(diǎn)擊提交按鈕,比對用戶答案和正確答案之間是否相等,給出成績,并將用戶名稱和成績存入record表。
6、查看成績記錄功能:
查詢r(jià)ecord表中的所有記錄,顯示在jta的文本區(qū)中,結(jié)果存在一個(gè)集合里,集合中的每一個(gè)元素就是一條記錄,用Record類的對象表示,RecordDao類中的方法public static ArrayList<Record> findAll(){…},調(diào)用方法findAll獲取集合數(shù)據(jù),遍歷集合獲取每一個(gè)元素的值,將元素值顯示在文本區(qū)中。
4 系統(tǒng)截圖
?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;
// 定義輸入用戶名和密碼的標(biāo)簽提示
private JLabel InputUserName;
private JLabel InputPassWord;
// 定義輸入用戶名文本框
private JTextField UserName;
// 定義輸入密碼框
private JPasswordField PassWord;
// 定義登錄和取消按鈕
private JButton Login;
private JButton Cancel;
JRadioButton stu,tea;
Login() {
// 各組件實(shí)例化過程
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("取消");
// 設(shè)置主窗口大小、位置和布局
setSize(500, 200);
setLocation(600, 400);
// 設(shè)置窗口流式布局
setLayout(new FlowLayout());
// 設(shè)置用戶名和密碼框大小
UserName.setPreferredSize(new Dimension(300, 30));
PassWord.setPreferredSize(new Dimension(300, 30));
// 依次向主窗口添加各組件
add(InputUserName);
add(UserName);
add(InputPassWord);
add(PassWord);
add(Login);
add(Cancel);
// 設(shè)置主窗口不可調(diào)節(jié)大小
setResizable(false);
// 設(shè)置主窗口默認(rèn)關(guān)閉操作
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 給登錄和取消按鈕添加 Action 監(jiān)聽器
Login.addActionListener(this);
Cancel.addActionListener(this);
// 設(shè)置主窗口可見
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);
}
}
}
/**
* 統(tǒng)一設(shè)置字體,父界面設(shè)置之后,所有由父界面進(jìn)入的子界面都不需要再次設(shè)置字體
*/
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();
}
}
數(shù)據(jù)庫連接與記錄
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;
/*
* 用戶記錄表的數(shù)據(jù)庫訪問
*/
public class RecordDao {
public static Connection conn = null;
//獲取訪問mytest的連接對象
public static Connection getConnection(){
// 1、加載驅(qū)動
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 2、通過驅(qū)動管理器調(diào)用方法創(chuàng)建連接對象
String url = "jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf8";
String user = "root";// MySQL中默認(rèn)訪問的用戶名
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 參數(shù)
public static int addrecord(管理系統(tǒng)02.Record re){
int flag=0;
String sql="insert into record (name,score) values('"+re.getName()
+"',"+re.getScore()+")";
System.out.println(sql);
//創(chuàng)建連接對象
conn=getConnection();
//創(chuàng)建命令對象
Statement stmt=null;
try{
stmt=conn.createStatement();
//執(zhí)行添加記錄操作
flag=stmt.executeUpdate(sql);
}catch(SQLException e){
e.printStackTrace();
}
return flag;
}
//查詢用戶分?jǐn)?shù)表中所有記錄
public static ArrayList<Record> findAll(){
conn=getConnection();
Statement stmt=null;
//創(chuàng)建一個(gè)集合對象
ArrayList<Record> list=new ArrayList<Record>();
//創(chuàng)建集合中的元素
Record re;
//創(chuàng)建命令對象
try {
stmt=conn.createStatement();
String sql="select * from record ";
ResultSet rs = stmt.executeQuery(sql);
// while(rs.next()){
// //對元素對象初始化
// re=new Record();
// //對元素的成員進(jìn)行賦值
// 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) {
}
}
存儲隨機(jī)抽取的題目
//試題類,存儲每一道題的類
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 自動生成的構(gòu)造函數(shù)存根
}
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;
}
}
隨機(jī)抽取10道題并核對答案文章來源:http://www.zghlxwxcb.cn/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("驅(qū)動加載成功");
}catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("驅(qū)動加載失敗");
}
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;
//創(chuàng)建一個(gè)集合對象
ArrayList<Test> list = new ArrayList<Test>();
//創(chuàng)建集合中的元素
Test test;
//創(chuàng)建命令對象
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();
//進(jìn)行賦值
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) {
}
}
系統(tǒng)主界面部分文章來源地址http://www.zghlxwxcb.cn/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 管理系統(tǒng)02.Record;
/*
* 主窗體
*/
public class ExamJFrame extends JFrame{
JMenuBar jmb;
JMenu jm,jm2;
JMenuItem jmi1,jmi2;
JPanel jp1;
JLabel jlb;//題目
JRadioButton jr1,jr2,jr3,jr4;//四個(gè)選項(xiàng)的單選按鈕
JButton jb1,jb2,jb3;//三個(gè)按鈕,上一題、下一題、提交
JPanel jp2;//用來放三個(gè)按鈕
ButtonGroup bg;//按鈕組,實(shí)現(xiàn)單選按鈕的排斥
JTextArea jta;
Test test;
ArrayList<Test> list;
int index;
ExamJFrame(){
setTitle("考試系統(tǒng)");
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);
//調(diào)用方法findAll獲取集合數(shù)據(jù)
ArrayList<Record> relist=Record.findAll();
//遍歷集合獲取每一個(gè)元素的值
for(int i=0;i<relist.size();i++) {
//獲取每一個(gè)元素
Record re=relist.get(i);
//元素表示每個(gè)用戶的分?jǐn)?shù)放在字符串中
String str="序號:"+re.getId()+" \t姓名:"+re.getName()+"\t成績:"+re.getScore()+"\r\n";
//將元素值顯示在文本區(qū)中,不能用setTest方法
jta.append(str);
}
this.validate();
}
//設(shè)置初始界面
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);
}
//考試時(shí)候的組件布局
public void init2(){
jp1.removeAll();
//設(shè)置面板的布局為網(wǎng)格布局,只有一列
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");
//單選按鈕要實(shí)現(xiàn)互相排斥,多選一,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) {
//保存當(dāng)前選項(xiàng)
save(index);
//比對用戶答案和正確答案是否相同
int sum = 0;
//遍歷集合的所有元素,取出兩個(gè)成績,比對
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, "同學(xué),你的成績是"+sum+"分");
//將用戶名和成績存入record表
//將用戶名和成績存入一個(gè)record對象中
Record re = new Record();
re.setName(name);
re.setScore(sum);
//調(diào)用方法addrecord寫數(shù)據(jù)
RecordDao.addrecord(re);
}
});
}
/**
* 統(tǒng)一設(shè)置字體,父界面設(shè)置之后,所有由父界面進(jìn)入的子界面都不需要再次設(shè)置字體
*/
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下標(biāo)的元素
test=list.get(index);
//將題目信息放到標(biāo)簽中,題號1-10
jlb.setText(index + 1 +"." + test.getContent());
//將當(dāng)前題的選項(xiàng)放到單選按鈕中
jr1.setText(test.getSa());
jr2.setText(test.getSb());
jr3.setText(test.getSc());
jr4.setText(test.getSd());
//獲取用戶選擇的答案內(nèi)容
String userda=test.getUserda();
if(userda!=null) {
//根據(jù)用戶輸入的答案,設(shè)置相應(yīng)的單選按鈕為選中狀態(tài)
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";
//判斷用戶選的是哪一項(xiàng)
if(jr1.isSelected()) userda="A";
if(jr2.isSelected()) userda="B";
if(jr3.isSelected()) userda="C";
if(jr4.isSelected()) userda="D";
//用戶答案寫入
test.setUserda(userda);
//更新集合中對應(yīng)的元素
list.set(index,test);
//按鈕組所有選項(xiàng)清空
bg.clearSelection();
}
public static void main(String[] args) {
new ExamJFrame();
}
}
到了這里,關(guān)于Java實(shí)訓(xùn)項(xiàng)目一一考試系統(tǒng)(附源碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!