项目现已发布到 Gitee 平台,可以直接获取源代码,欢迎 Star 收藏!
项目地址:https://gitee.com/realBeBetter/exam-system

阅前注意

系统中所有密码均已默认设置为123456

开发时使用的Java版本为JDK 14.0.1
使用的开发工具为 IntelliJ IDEA Community 2019.2
数据库为MySQL 8.0.22.0
已在Windows10下通过测试

一、数据库设计

  • 数据库

    • 考试系统 ExamSystem
  • 数据表

    • 学生表 STUDENT

      • create table student
        (sname varchar(10) not null,                 -- 姓名sno varchar(20) primary key not null,      -- 学号password varchar(20) not null,             -- 密码ssex varchar(4) not null,              -- 性别sage varchar(4) not null,              -- 年龄major varchar(10) not null,                -- 专业department varchar(10) not null            -- 系别
        );
        
    • 教师表 TEACHER

      • create table teacher
        (tno varchar(20) not null primary key,      -- 教师工号password varchar(20) not null,               -- 教师密码tname varchar(10) not null,                  -- 教师姓名tsex varchar(4) not null                 -- 教师性别
        );
        
    • 学生课程表 SC

      • create table sc
        (sno varchar(20) not null primary key,      -- 学生学号score int not null,                          -- 课程得分foreign key(sno) references student(sno)
        );
        
    • 题目答案表 TEST

      • create table test
        (num int primary key,                     -- 题目号码question varchar(500) not null,              -- 题目文本answer varchar(10) not null                  -- 标准答案
        );
        
    • 管理员表 ADMINISTRATOR

      • create table administrator
        (password varchar(20) not null            -- 管理员密码
        )comment = '后期使用JDBC时候,不允许添加';
        

创建数据库代码:

create database examsystem;
use examsystem;create table student
(sname varchar(10) not null,                sno varchar(20) primary key not null,  password varchar(20) not null,            ssex varchar(4) not null,              sage varchar(4) not null,               major varchar(10) not null,              department varchar(10) not null
);create table teacher
(tno varchar(20) not null primary key,      password varchar(20) not null,              tname varchar(10) not null,                 tsex varchar(4) not null
);create table sc
(sno varchar(20) not null primary key,      score int not null,                         foreign key(sno) references student(sno)
);create table test
(num int primary key,           question varchar(500) not null,         answer varchar(10) not null
);create table administrator
(password varchar(20) not null
);

二、逻辑设计

整个考试系统应该结合实际情况来,先让考生登录自己的账号。

之后进入考试系统,答题,系统判断答题情况,打分。

记录学生分数,提供查询通道。

实现功能顺序 V1.0

  • 学生输入学号密码进行登录
  • 系统按照顺序出题
  • 学生答题同时开始考试倒计时
  • 学生提交答案
  • 系统批改试卷
  • 成绩上传至数据库
  • 学生成绩展示

实现功能顺序 V2.0

  • 用户选择身份 SelectIdentity

    • 用户为学生,选择学生注册/登录 【选做:添加回到上一级菜单】 StudentSelect

      • 学生注册,存储学生信息 StudentRegister
      • 学生登录,登录成功则开始考试答题【选做:可以提供更改密码功能】StudentLogin
        • 学生答题同时开始考试倒计时 MainView Countdown
        • 学生提交答案或者倒计时结束自动提交答案 MainView showScore
        • 答案批改,并将成绩上传数据库,同时予以前台展示 showScore
    • 用户选择为教师,需要输入管理员密码验证身份 CheckIdentity
      • 教师选择注册/登录 TeacherSelect

        • 教师注册,需要输入管理员密码来验证身份【选做:可加入管理员密码修改功能】 TeacherRegister
        • 教师登录,登录之后可选相应的功能【选做:可以提供更改密码功能】TeacherLogin
          • 教师信息展示 TeacherView
          • 教师可以修改学生分数、查询学生分数、添加题目【选做:修改分数需要留下日志】TeacherView

程序运行逻辑顺序

  • 用户选择身份–> 学生/教师

    • 学生选择注册/登录 (同时关闭选择页面)

      • 注册–>输入各项信息,注册成功,进入登录界面(同时关闭注册页面)
      • 登录–> 登录成功,进入考试主页面(同时关闭登录页面)
        • 考生开始答题,结束的时候计算成绩,弹出成绩
    • 教师身份验证–>输入管理员密码(防止学生进入后台进行操作)–>正确即可选择注册/登录
      • 注册–> 输入信息成功注册,进入登录界面
      • 登录–>进入教师主页面,可以选择查询成绩/修改成绩/添加试题操作
        • 查询成绩,查询所有学生的成绩
        • 修改成绩,根据学生的学号对成绩进行修改
        • 添加试题,根据提示添加试题信息进行添加

三、代码实现

JDBC工具类—JDBCUtils

实现JDBC连接数据库的便捷性,做到更方便快捷的使用JDBC来连接MySQL数据库。

这段工具类提供了连接数据库驱动、释放资源等功能,能在使用JDBC连接MySQL时候更快捷高效。

package com.company;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;public class JDBCUtils {// 定义字符串private static String user;private static String password;private static String url;private static String driver;/** 文件的读取,只需要用到一次,所以用到静态代码块* */static {// 读取资源文件,获取值try {// 1. 创建properties集合类Properties properties = new Properties();// 获取src路径下文件的方法-> ClassLoader 类加载器// ClassLoader classLoader = JDBCUtils.class.getClassLoader();// URL res = classLoader.getResource("src\\jdbc.properties");// String path = res.getPath();// System.out.println(path);// 2.加载文件properties.load(new FileReader("src\\jdbc.properties"));// 3.获取数值,赋值url = properties.getProperty("url");user = properties.getProperty("user");password = properties.getProperty("password");driver = properties.getProperty("driver");// 4.注册驱动Class.forName(driver);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}/** 获取连接,连接对象* */static Connection getConnection() throws SQLException {System.out.println("数据库连接中......");return DriverManager.getConnection(url, user, password);}/** 释放资源* */private static void close(PreparedStatement pstmt, Connection conn) {if (pstmt != null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}public static void close (ResultSet rs, PreparedStatement pstmt, Connection conn) {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}close(pstmt, conn);System.out.println("资源释放成功!");}
}

其中,使用这个JDBCUtils的时候,需要用到配置文件,后缀名【.properties

由于我使用的是【mysql-connector-java-8.0.22.jar】版本的驱动,需要添加 ?serverTimezone=UTC,并且更改drivercom.mysql.cj.jdbc.Driver

url=jdbc:mysql://localhost:3306/XS?serverTimezone=UTC
user=root
password=123456
driver=com.mysql.cj.jdbc.Driver

答题主界面——MainView

// 定义主界面
// 定义按钮:提交、上一题、下一题、开始
private JButton start, commit, back, next;
// 设置单选按钮
private JRadioButton aButton, bButton, cButton, dButton;
// 设置按钮组
private ButtonGroup buttonGroup;
// 设置标签
private JLabel label, clock;
// 设置文本区
private JTextArea jTextArea;
// 设置面板
private JPanel panel1, panel2, panel3;

倒计时类——Countdown

// 倒计时
class Countdown extends Thread{// 设置考试倒计时// 剩余时间private JLabel leftTime;// 考试设置时间,总时间private int totalTime;Countdown(JLabel lT, int tT) {this.leftTime = lT;this.totalTime = tT * 60;}@Overridepublic void run() {NumberFormat numberFormat = NumberFormat.getInstance();// 设置数值的整数部分允许的最小位数numberFormat.setMinimumIntegerDigits(2);// 定义时分秒int h, m, s;while (totalTime > 0) {h = totalTime / 3600;m = totalTime % 3600 / 60;s = totalTime % 60;StringBuilder stringBuilder;stringBuilder = new StringBuilder();// 增加到leftTime标签stringBuilder.append("考试剩余时间为:").append(numberFormat.format(h)).append(":").append(numberFormat.format(m)).append(":").append(numberFormat.format(s));leftTime.setText(stringBuilder.toString());System.out.println("lefttime :" + leftTime);try {//延时一秒Thread.sleep(1000);} catch (Exception e) {// ignore error}// 单位是s,延时1s则总时长-1totalTime --;}if (totalTime == 0) {JOptionPane.showMessageDialog(null, "考试结束");// 考试结束的时候自动交卷,触发打分方法MainView.showScore();// 推迟执行,防止过早关闭try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.exit(0);}}
}

学生登录界面——StudentLogin

/*
* 登录功能逻辑:
*  1. 先获取到学号
*  2. 利用学号检索数据库,看是否查询得到对应的密码
*    - 有查询结果,则代表学号正确
*    - 无查询结果,则代表学号错误/没添加
*  3. 有对应的密码之后,判断数据库的密码和用户输入的密码是否匹配
*    - 若匹配,则密码正确
*    - 若不匹配,则密码错误
* */
if (actionEvent.getSource() == btnOk) {if ("".equals(jtfId.getText())) {// System.out.println("请输入学号!");JOptionPane.showMessageDialog(null, "请输入学号!");} else if ("".equals(new String(jpfPassword.getPassword()))) {// System.out.println("请输入密码!");JOptionPane.showMessageDialog(null, "请输入密码!");} else {temp = 1;tempId = jtfId.getText();tempPassword = new String(jpfPassword.getPassword());}if (temp == 1) {// 执行JDBC查询到学生的ID和密码Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {conn = JDBCUtils.getConnection();// JOptionPane.showMessageDialog(null, "数据库连接成功!");System.out.println("登录:数据库连接成功!");String sql = "select password from student where sno = ?";pstmt = conn.prepareStatement(sql);pstmt.setString(1, tempId);rs = pstmt.executeQuery();while (rs.next()) {stuPassword = rs.getString(1);}// 如果学号输入错误/找不到对应的学号,则返回的rs为null,getString也为nullif (tempPassword.equals(stuPassword)) {JOptionPane.showMessageDialog(null, "登录成功!");// 学号正确,填入学号,后期更新成绩需要用到/*setStuId(tempId);*/stuId = tempId;// 执行页面跳转this.dispose(); // 关闭登录界面new MainView(); // 弹出主页面} else {JOptionPane.showMessageDialog(null, "学号或密码错误!");jtfId.setText("");jpfPassword.setText("");}} catch (SQLException e) {e.printStackTrace();} finally {// 释放资源JDBCUtils.close(rs, pstmt, conn);}}
}

四、问题汇总

1. 使用类结构数组的时候发生空指针异常

/*
* 出现空指针异常
* Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
* 出现异常的原因是因为自定义的类数组,需要对每个类进行实例化
* Test[] tests = new Test[num] 是没有地方可以存数据的
* 只有每个成员进行声明后才会给这个成员分配内存
* tests[0] = new Test();
* */

2.表格多次点击查询,数据重复添加

表格多次点击查询,数据重复添加。之前设置的思路是在当前界面直接显示成绩表格,但是出现了这个问题。

之后每次点击添加的时候设置jTablerowCount = 0,每次点击就开始查询,查询一次就开始添加数据,最后显示正常。

public void actionPerformed(ActionEvent actionEvent) {if (actionEvent.getSource() == back) {this.dispose();new StudentSelect();} else if (actionEvent.getSource() == btnOk) {String tempName = jtfName.getText();// 无输入的时候为""System.out.println(tempName);String tempId = jtfId.getText();String tempPassword = new String(jpfPassword.getPassword());String tempAge = "";String tempSex = "";String tempMajor = "";String tempDepartment = "";int isEmpty = 0;int isLegal = 0;int isSelect = 0;if ("".equals(tempName)) {JOptionPane.showMessageDialog(null, "请输入姓名!");} else if ("".equals(tempId)) {JOptionPane.showMessageDialog(null, "请输入学号!");} else if ("".equals(tempPassword)) {JOptionPane.showMessageDialog(null, "请输入密码!");} else {// 表示要填写的元素全部都有填写isEmpty = 1;}if (isEmpty == 1) {if (isAllNumber(tempId)){char[] strId = tempId.toCharArray();if (strId.length == 11) {char[] strPassword = tempPassword.toCharArray();if (strPassword.length >= 6) {isLegal = 1;} else {JOptionPane.showMessageDialog(null, "密码不满足条件!");}} else {JOptionPane.showMessageDialog(null, "学号不是11位!");jtfId.setText("");}} else {JOptionPane.showMessageDialog(null, "学号不是数字!");jtfId.setText("");}}if (isEmpty == 1 && isLegal == 1) {if (jcbSex.getSelectedIndex() != 0) {tempSex = stringSex[jcbSex.getSelectedIndex()];if (jcbAge.getSelectedIndex() != 0) {tempAge = stringAge[jcbAge.getSelectedIndex()];if (jcbDepartment.getSelectedIndex() != 0) {tempDepartment = stringDepartment[jcbDepartment.getSelectedIndex()];if (jcbMajor.getSelectedIndex() != 0) {tempMajor = stringMajor[jcbMajor.getSelectedIndex()];isSelect = 1; // 表示列表项全都做出了选择} else {JOptionPane.showMessageDialog(null, "请选择专业!");}} else {JOptionPane.showMessageDialog(null, "请选择学院!");}} else {JOptionPane.showMessageDialog(null, "请选择年龄!");}} else {JOptionPane.showMessageDialog(null, "请选择性别!");}}// 非空才开始传入数据if (isEmpty == 1  && isLegal == 1 && isSelect == 1) {// 确认注册,需要传入数据Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;// JDBC数据操作try {conn = JDBCUtils.getConnection();System.out.println("学生注册:数据库连接成功!");// 先根据传入的数据是否存在,判断条件:主键IdString selectId = "select sno from student where sno = ?";pstmt = conn.prepareStatement(selectId);pstmt.setString(1, tempId);rs = pstmt.executeQuery();int tempJudge = 0;while (rs.next()) {tempJudge ++;}if (tempJudge == 1) {JOptionPane.showMessageDialog(null, "用户已存在!");} else {pstmt = null;rs = null;String sql = "insert into student(sname, sno, password, ssex," +"sage, major, department) values(?, ?, ?, ?, ?, ?, ?)";/*String sql2 = "insert into sc(sno) values(?)";*/pstmt = conn.prepareStatement(sql);pstmt.setString(1, tempName);pstmt.setString(2, tempId);pstmt.setString(3, tempPassword);pstmt.setString(4, tempSex);pstmt.setString(5, tempAge);pstmt.setString(6, tempMajor);pstmt.setString(7, tempDepartment);// 返回影响的行数int flag = pstmt.executeUpdate();if (flag == 1) {System.out.println("注册成功");rs = null;pstmt = null;String sqlInert = "insert into sc(sno, score) values(?, ?) ";pstmt = conn.prepareStatement(sqlInert);pstmt.setString(1, tempId);pstmt.setInt(2, 0);int count = pstmt.executeUpdate();if (count == 1) {System.out.println("SC表格数据创建成功!");JOptionPane.showMessageDialog(null, "注册成功!");}this.dispose();new StudentLogin();} else {System.out.println("注册失败");JOptionPane.showMessageDialog(null, "注册失败!");}}} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.close(rs, pstmt, conn);}}} else if (actionEvent.getSource() == btnCancel) {// 取消注册,返回上一级this.dispose();new StudentSelect();}}

五、源代码

项目结构

jdbc.properties

url=jdbc:mysql://localhost:3306/ExamSystem?serverTimezone=UTC
user=root
password=123456
driver=com.mysql.cj.jdbc.Driver
# 高版本的jdbc需要修改 driver=com.mysql.cj.jdbc.Driver
# 使用高版本jdbc时候,需要在数据库url之后加上?serverTimezone=UTC
# // 1.导入驱动jar包 ,已完成
# // 2.注册驱动
# // 高版本的jdbc需要修改 driverClass=com.mysql.cj.jdbc.Driver
# // Class.forName("com.mysql.cj.jdbc.Driver");
# // 3.获取数据库连接对象
# // 使用高版本的jdbc时候,需要在数据库之后加上?serverTimezone=UTC
# // conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/XS?serverTimezone=UTC","root","123456");
# conn = JDBCUtils.getConnection();
# System.out.println("数据库连接成功!");
# // 4.定义数据库执行语言
# String sql = "update XSCJ set SCORE = ? where id = ?";
# // 5.获取执行sql语句的对象
# pstmt = conn.prepareStatement(sql);
# // 设置预编译sql语句的值
# pstmt.setInt(1,85);
# pstmt.setInt(2,1);
# // 6.执行sql语句
# int count = pstmt.executeUpdate();
# // 7.处理结果
# System.out.println(count);
# System.out.println("执行成功!");
# // 8.释放资源
# // conn.close();
# // pstmt.close();

JDBCUtils

package com.company;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;public class JDBCUtils {// 定义字符串private static String user;private static String password;private static String url;private static String driver;/** 文件的读取,只需要用到一次,所以用到静态代码块* */static {// 读取资源文件,获取值try {// 1. 创建properties集合类Properties properties = new Properties();// 获取src路径下文件的方法-> ClassLoader 类加载器// ClassLoader classLoader = JDBCUtils.class.getClassLoader();// URL res = classLoader.getResource("src\\jdbc.properties");// String path = res.getPath();// System.out.println(path);// 2.加载文件properties.load(new FileReader("src\\jdbc.properties"));// 3.获取数值,赋值url = properties.getProperty("url");user = properties.getProperty("user");password = properties.getProperty("password");driver = properties.getProperty("driver");// 4.注册驱动Class.forName(driver);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}/** 获取连接,连接对象* */static Connection getConnection() throws SQLException {System.out.println("数据库连接中......");return DriverManager.getConnection(url, user, password);}@Overridepublic int hashCode() {return super.hashCode();}/** 释放资源* */private static void close(PreparedStatement pstmt, Connection conn) {if (pstmt != null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}public static void close (ResultSet rs, PreparedStatement pstmt, Connection conn) {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}close(pstmt, conn);System.out.println("资源释放成功!");}
}

Student

package com.company;class Student {String studentName;String studentId;// public String studentPassword;String studentSex;String studentAge;int studentScore;String studentDepartment;String studentMajor;
}

Test

package com.company;// 试题集
public class Test {// 提供试题类,包括题目的题号、文本、答案public int questionNum;        // 题目题号public String questionText;    // 试题内容public String standardAnswer;  // 标准答案// 学生答案和题号public String stuAnswer;// 检查答案是否正确public boolean checkAnswer() {if (this.stuAnswer == null) {return false;} else {return this.stuAnswer.equals(this.standardAnswer);}}
}

SelectIdentity

package com.company;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class SelectIdentity extends JFrame implements ActionListener {// 提供用户身份选择/** 按照用户分类,分为教师和学生* 教师能够添加试题,查询、修改学生成绩* 学生能够新建自己的个人信息,设置密码以及修改密码,查询成绩* 实现逻辑:* 一级界面提供身份选择,二级界面选择登录还是注册,之后根据权限判断,判断身份* 1. 如果是教师注册,需要输入管理员密码*   - 如果密码不对,不给予注册教师身份*   - 如果身份正确,给与注册进入下一步* 2. 如果是学生注册,不需要进行判断* */private JButton jIdentityTeacher;            // 身份选择,教师private JButton jIdentityStudent;            // 身份选择,学生JFrame jFrame = new JFrame();SelectIdentity () {super("学生在线考试系统_确认您的身份");JPanel jPanel1 = new JPanel();JLabel jNotification = new JLabel("请选择您的身份:");jNotification.setBounds(430, 240, 200, 25);add(jNotification);JPanel jPanel2 = new JPanel();jIdentityTeacher = new JButton("教师");jIdentityStudent = new JButton("学生");jIdentityTeacher.setBounds(430, 270, 60, 30);jIdentityStudent.setBounds(500, 270, 60, 30);add(jIdentityTeacher);add(jIdentityStudent);jIdentityTeacher.addActionListener(this);jIdentityStudent.addActionListener(this);Container con = this.getContentPane();con.add(jPanel1, BorderLayout.NORTH);con.add(jPanel2, BorderLayout.CENTER);con.setLocation(400, 200);this.setVisible(true);this.setSize(1000, 600);this.setResizable(false);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void main(String[] args) {new SelectIdentity();}@Overridepublic void actionPerformed(ActionEvent actionEvent) {if (actionEvent.getSource() == jIdentityTeacher) {/** 假设是教师,需要输入管理员密码确认* 密码输入错误跳回选择界面* */this.dispose();new CheckIdentity();} else if (actionEvent.getSource() == jIdentityStudent) {// 跳转学生界面this.dispose();new StudentSelect();}}
}

StudentSelect

package com.company;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class StudentSelect extends JFrame implements ActionListener {/** 提供学生入口选择,注册还是登录* 根据相应的选择,跳转不同的界面* */private JButton jRegister;            // 身份选择,教师private JButton jLogin;            // 身份选择,学生private JLabel welcome;private JButton back;StudentSelect() {super("学生在线考试系统_学生注册/登录");welcome = new JLabel("请选择您的操作");back = new JButton("返回");back.addActionListener(this);JPanel jPanel = new JPanel();jPanel.add(welcome);jPanel.add(back);this.add(jPanel, BorderLayout.NORTH);JPanel jPanel1 = new JPanel();JLabel jNotification = new JLabel("请选择:");jNotification.setBounds(430, 230, 200, 25);add(jNotification);jRegister = new JButton("注册");jLogin = new JButton("登录");jRegister.setBounds(430, 260, 60, 30);jLogin.setBounds(500, 260, 60, 30);add(jRegister);add(jLogin);jRegister.addActionListener(this);jLogin.addActionListener(this);Container con = this.getContentPane();con.add(jPanel1, BorderLayout.CENTER);con.setLocation(400, 200);this.setVisible(true);this.setSize(1000, 600);this.setResizable(false);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void main(String[] args) {new StudentSelect();}@Overridepublic void actionPerformed(ActionEvent actionEvent) {if (actionEvent.getSource() == jRegister) {// 选择注册之后this.dispose();new StudentRegister();} else if (actionEvent.getSource() == jLogin) {// 选择登录之后进入登录界面this.dispose();new StudentLogin();} else if (actionEvent.getSource() == back) {this.dispose();new SelectIdentity();}}
}

StudentRegister

package com.company;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class StudentRegister extends JFrame implements ActionListener {// 提供用户注册界面private JLabel stuName;private JLabel stuId;private JLabel stuPassword;private JLabel stuSex;private JLabel stuAge;private JLabel stuDepartment;   // 学院private JLabel stuMajor;        // 专业private JLabel idTip;private JLabel passwordTip;private JLabel ageTip;private JTextField jtfName;private JTextField jtfId;private JPasswordField jpfPassword;private JComboBox jcbSex;private JComboBox jcbDepartment;private JComboBox jcbAge;private JComboBox jcbMajor;private JButton btnOk;private JButton btnCancel;private JLabel welcome;private JButton back;// 范围选择String[] stringAge = new String[] {"-请选择-", "10", "11", "12", "13", "14", "15", "16","17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27","28", "29", "30", "31", "32", "33", "34", "35"};String[] stringMajor = new String[] {"-请选择-", "计算机科学与技术", "软件工程", "物联网", "网络工程"};String[] stringDepartment = new String[] {"-请选择-", "计算机学院"};String[] stringSex = new String[] {"-请选择-", "男", "女"};public StudentRegister () {super("学生在线考试系统_学生注册");welcome = new JLabel("学生注册界面");back = new JButton("返回");back.addActionListener(this);stuName = new JLabel("姓名:");jtfName = new JTextField(20);stuId = new JLabel("学号:");jtfId = new JTextField(20);stuPassword = new JLabel("密码:");jpfPassword = new JPasswordField(20);stuSex = new JLabel("性别:");stuAge = new JLabel("年龄:");stuDepartment = new JLabel("学院:");stuMajor = new JLabel("专业:");idTip = new JLabel("(学号为11位的整数)");passwordTip = new JLabel("(密码不得少于6位)");ageTip = new JLabel("(年龄范围:10-35)");btnOk = new JButton("确认");btnCancel = new JButton("取消");btnOk.addActionListener(this);btnCancel.addActionListener(this);JPanel jPanel = new JPanel();/*welcome.setBounds(430, 20, 200, 30);welcome.setFont(new Font("黑体", Font.PLAIN, 16));back.setBounds(440, 50, 80, 25);*/jPanel.add(welcome);jPanel.add(back);jcbSex = new JComboBox(stringSex);jcbDepartment = new JComboBox(stringDepartment);jcbAge = new JComboBox(stringAge);jcbMajor = new JComboBox(stringMajor);JPanel jPanel1 = new JPanel();stuName.setBounds(350, 100, 50, 30);jtfName.setBounds(400, 105, 200, 25);stuId.setBounds(350, 140, 50, 30);jtfId.setBounds(400, 145, 200, 25);idTip.setBounds(620, 140, 200, 30);stuPassword.setBounds(350, 180, 50, 30);jpfPassword.setBounds(400, 185, 200, 25);passwordTip.setBounds(620, 180, 200, 30);stuSex.setBounds(350, 220, 50, 30);jcbSex.setBounds(400, 225, 200, 25);stuAge.setBounds(350, 260, 50, 30);jcbAge.setBounds(400, 265, 200, 25);ageTip.setBounds(620, 260, 200, 30);stuDepartment.setBounds(350, 300, 50, 30);jcbDepartment.setBounds(400, 305, 200, 25);stuMajor.setBounds(350, 340, 50, 30);jcbMajor.setBounds(400, 345, 200, 25);add(stuName);add(jtfName);add(stuId);add(jtfId);add(idTip);add(stuPassword);add(jpfPassword);add(passwordTip);add(stuSex);add(jcbSex);add(stuAge);add(jcbAge);add(ageTip);add(stuDepartment);add(jcbDepartment);add(stuMajor);add(jcbMajor);JPanel jPanel2 = new JPanel();btnOk.setBounds(430, 470, 60, 30);btnCancel.setBounds(500, 470, 60, 30);add(btnOk);add(btnCancel);this.add(jPanel, BorderLayout.NORTH);this.add(jPanel1, BorderLayout.CENTER);this.add(jPanel2, BorderLayout.SOUTH);this.setVisible(true);this.setSize(1000, 600);this.setResizable(false);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public boolean isAllNumber (String s) {char[] str = s.toCharArray();for (char c : str) {if (c < '0' || c > '9') {return false;}}return true;}@Overridepublic void actionPerformed(ActionEvent actionEvent) {if (actionEvent.getSource() == back) {this.dispose();new StudentSelect();} else if (actionEvent.getSource() == btnOk) {String tempName = jtfName.getText();// 无输入的时候为""System.out.println(tempName);String tempId = jtfId.getText();String tempPassword = new String(jpfPassword.getPassword());String tempAge = "";String tempSex = "";String tempMajor = "";String tempDepartment = "";int isEmpty = 0;int isLegal = 0;int isSelect = 0;if ("".equals(tempName)) {JOptionPane.showMessageDialog(null, "请输入姓名!");} else if ("".equals(tempId)) {JOptionPane.showMessageDialog(null, "请输入学号!");} else if ("".equals(tempPassword)) {JOptionPane.showMessageDialog(null, "请输入密码!");} else {// 表示要填写的元素全部都有填写isEmpty = 1;}if (isEmpty == 1) {if (isAllNumber(tempId)){char[] strId = tempId.toCharArray();if (strId.length == 11) {char[] strPassword = tempPassword.toCharArray();if (strPassword.length >= 6) {isLegal = 1;} else {JOptionPane.showMessageDialog(null, "密码不满足条件!");}} else {JOptionPane.showMessageDialog(null, "学号不是11位!");jtfId.setText("");}} else {JOptionPane.showMessageDialog(null, "学号不是数字!");jtfId.setText("");}}if (isEmpty == 1 && isLegal == 1) {if (jcbSex.getSelectedIndex() != 0) {tempSex = stringSex[jcbSex.getSelectedIndex()];if (jcbAge.getSelectedIndex() != 0) {tempAge = stringAge[jcbAge.getSelectedIndex()];if (jcbDepartment.getSelectedIndex() != 0) {tempDepartment = stringDepartment[jcbDepartment.getSelectedIndex()];if (jcbMajor.getSelectedIndex() != 0) {tempMajor = stringMajor[jcbMajor.getSelectedIndex()];isSelect = 1; // 表示列表项全都做出了选择} else {JOptionPane.showMessageDialog(null, "请选择专业!");}} else {JOptionPane.showMessageDialog(null, "请选择学院!");}} else {JOptionPane.showMessageDialog(null, "请选择年龄!");}} else {JOptionPane.showMessageDialog(null, "请选择性别!");}}// 非空才开始传入数据if (isEmpty == 1  && isLegal == 1 && isSelect == 1) {// 确认注册,需要传入数据Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;// JDBC数据操作try {conn = JDBCUtils.getConnection();System.out.println("学生注册:数据库连接成功!");// 先根据传入的数据是否存在,判断条件:主键IdString selectId = "select sno from student where sno = ?";pstmt = conn.prepareStatement(selectId);pstmt.setString(1, tempId);rs = pstmt.executeQuery();int tempJudge = 0;while (rs.next()) {tempJudge ++;}if (tempJudge == 1) {JOptionPane.showMessageDialog(null, "用户已存在!");} else {pstmt = null;rs = null;String sql = "insert into student(sname, sno, password, ssex," +"sage, major, department) values(?, ?, ?, ?, ?, ?, ?)";/*String sql2 = "insert into sc(sno) values(?)";*/pstmt = conn.prepareStatement(sql);pstmt.setString(1, tempName);pstmt.setString(2, tempId);pstmt.setString(3, tempPassword);pstmt.setString(4, tempSex);pstmt.setString(5, tempAge);pstmt.setString(6, tempMajor);pstmt.setString(7, tempDepartment);// 返回影响的行数int flag = pstmt.executeUpdate();if (flag == 1) {System.out.println("注册成功");rs = null;pstmt = null;String sqlInert = "insert into sc(sno, score) values(?, ?) ";pstmt = conn.prepareStatement(sqlInert);pstmt.setString(1, tempId);pstmt.setInt(2, 0);int count = pstmt.executeUpdate();if (count == 1) {System.out.println("SC表格数据创建成功!");JOptionPane.showMessageDialog(null, "注册成功!");}this.dispose();new StudentLogin();} else {System.out.println("注册失败");JOptionPane.showMessageDialog(null, "注册失败!");}}} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.close(rs, pstmt, conn);}}} else if (actionEvent.getSource() == btnCancel) {// 取消注册,返回上一级this.dispose();new StudentSelect();}}public static void main(String[] args) {new StudentRegister();}}

StudentLogin

package com.company;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class StudentLogin extends JFrame implements ActionListener {// 定义文本域接收用户名private JTextField jtfId;// 定义密码域接收密码private JPasswordField jpfPassword;// 定义按钮,确认、取消private JButton btnOk;private JButton btnCancel;private static String stuId = "";              // 学号public static String getStuId() {return stuId;}public void setStuId(String stuId) {this.stuId = stuId;}private String stuPassword = "";        // 密码private JLabel welcome;private JButton back;public StudentLogin() {super("学生在线考试系统_登录");welcome = new JLabel("学生登录界面");back = new JButton("返回");back.addActionListener(this);JPanel jPanel = new JPanel();jPanel.add(welcome);jPanel.add(back);this.add(jPanel, BorderLayout.NORTH);// 学号密码输入部分// 定义界面JPanel jpMain = new JPanel();// 定义标签JLabel lblId = new JLabel("学号:");JLabel lblPassword = new JLabel("密码:");jtfId = new JTextField(20);jpfPassword = new JPasswordField(20);lblId.setBounds(350, 200, 50, 30);jtfId.setBounds(400, 205, 200, 25);lblPassword.setBounds(350, 240, 50, 30);jpfPassword.setBounds(400, 245, 200, 25);add(lblId);add(jtfId);add(lblPassword);add(jpfPassword);// 登录确认取消部分JPanel jpBtn = new JPanel();btnOk = new JButton("确认");btnCancel = new JButton("取消");btnOk.setBounds(430, 290, 60, 30);add(btnOk);btnCancel.setBounds(500, 290, 60, 30);add(btnCancel);// 添加事件监听btnOk.addActionListener(this);btnCancel.addActionListener(this);// 添加容器Container con = this.getContentPane();con.add(jpMain, BorderLayout.CENTER);con.add(jpBtn, BorderLayout.CENTER);// 设置属性值this.setSize(1000, 600);// 设置用户不可调节窗口大小this.setResizable(false);this.setLocationRelativeTo(null);this.setVisible(true);this.setTitle("学生在线考试系统_登录");this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}@Overridepublic void actionPerformed(ActionEvent actionEvent) {/** 登录功能逻辑:*  1. 先获取到学号*  2. 利用学号检索数据库,看是否查询得到对应的密码*    - 有查询结果,则代表学号正确*    - 无查询结果,则代表学号错误/没添加*  3. 有对应的密码之后,判断数据库的密码和用户输入的密码是否匹配*    - 若匹配,则密码正确*    - 若不匹配,则密码错误* */// 设置用户输入临时储存// 设置正确学号密码的匹配值String stuPassword = "";// 设置用户输入的存储值String tempId = "";String tempPassword = "";int temp = 0;if (actionEvent.getSource() == btnOk) {if ("".equals(jtfId.getText())) {// System.out.println("请输入学号!");JOptionPane.showMessageDialog(null, "请输入学号!");} else if ("".equals(new String(jpfPassword.getPassword()))) {// System.out.println("请输入密码!");JOptionPane.showMessageDialog(null, "请输入密码!");} else {temp = 1;tempId = jtfId.getText();tempPassword = new String(jpfPassword.getPassword());}if (temp == 1) {// 执行JDBC查询到学生的ID和密码Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {conn = JDBCUtils.getConnection();// JOptionPane.showMessageDialog(null, "数据库连接成功!");System.out.println("登录:数据库连接成功!");String sql = "select password from student where sno = ?";pstmt = conn.prepareStatement(sql);pstmt.setString(1, tempId);rs = pstmt.executeQuery();while (rs.next()) {stuPassword = rs.getString(1);}// 如果学号输入错误/找不到对应的学号,则返回的rs为null,getString也为nullif (tempPassword.equals(stuPassword)) {JOptionPane.showMessageDialog(null, "登录成功!");// 学号正确,填入学号,后期更新成绩需要用到/*setStuId(tempId);*/stuId = tempId;// 执行页面跳转this.dispose(); // 关闭登录界面new MainView(); // 弹出主页面} else {JOptionPane.showMessageDialog(null, "学号或密码错误!");jtfId.setText("");jpfPassword.setText("");}} catch (SQLException e) {e.printStackTrace();} finally {// 释放资源JDBCUtils.close(rs, pstmt, conn);}}}// 取消登录操作if (actionEvent.getSource() == btnCancel) {/*JOptionPane.showMessageDialog(null, "您已退出!");*/this.dispose();new StudentSelect();} else if (actionEvent.getSource() == back) {this.dispose();new StudentSelect();}}public static void main(String[] args) {new StudentLogin();}}

MainView

package com.company;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.NumberFormat;
import java.util.Objects;public class MainView extends JFrame implements ActionListener {// 定义主界面// 定义按钮:提交、上一题、下一题、开始private JButton start, commit, back, next;// 设置单选按钮private JRadioButton aButton, bButton, cButton, dButton;// 设置按钮组private ButtonGroup buttonGroup;// 设置文本区private static JTextArea jTextArea;// 定义所需要的变量值private static Test[] tests;              // 设置试题private static int questionNum = 0;       // 设置题目数量private static int questionPointer = 0;   // 设置题号指针private static int yes = 0;private static int no = 0;               // 设置对错数量private Countdown cd;              // 倒计时MainView() {super("学生在线考试系统_答题");// 设置面板JPanel panel1 = new JPanel();JPanel panel2 = new JPanel();JPanel panel3 = new JPanel();// 设定考试时间final int EXAM_TIME = 1;// 设置标签JLabel label = new JLabel("总考试时间:" + 1 + "分钟");JLabel clock = new JLabel();cd = new Countdown(clock, EXAM_TIME);jTextArea = new JTextArea(20, 40);// 设置试题区不能编辑(不能修改试题内容)jTextArea.setEditable(false);aButton = new JRadioButton("A");bButton = new JRadioButton("B");cButton = new JRadioButton("C");dButton = new JRadioButton("D");buttonGroup = new ButtonGroup();start = new JButton("开始考试");back = new JButton("上一题");next = new JButton("下一题");commit = new JButton("交卷");// 添加事件监听aButton.addActionListener(this);bButton.addActionListener(this);cButton.addActionListener(this);dButton.addActionListener(this);start.addActionListener(this);back.addActionListener(this);next.addActionListener(this);commit.addActionListener(this);// 布局设置buttonGroup.add(aButton);buttonGroup.add(bButton);buttonGroup.add(cButton);buttonGroup.add(dButton);panel1.add(label);panel1.add(start);panel1.add(clock);panel2.add(jTextArea);panel3.add(aButton);panel3.add(bButton);panel3.add(cButton);panel3.add(dButton);panel3.add(back);panel3.add(next);panel3.add(commit);this.add(panel1, BorderLayout.NORTH);this.add(panel2, BorderLayout.CENTER);this.add(panel3, BorderLayout.SOUTH);// 登录之后界面才可见this.setVisible(true);this.setTitle("学生在线考试系统");// 设置全屏显示/** 后来发现全屏显示需要调整UI,舍弃使用* *//*Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setSize((int) screenSize.getWidth(), (int) screenSize.getHeight());*/// 设置尺寸this.setSize(1000, 600);this.setResizable(false);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}private void createExam() {Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {// 题目数量int num = 0;conn = JDBCUtils.getConnection();System.out.println("获取题库:数据库连接成功!");String sql = "select * from TEST";pstmt = conn.prepareStatement(sql);rs = pstmt.executeQuery();while (rs.next()) {num ++;}/** 考虑到教师未添加题目的情况*  num == 0* */if (num == 0) {JOptionPane.showMessageDialog(null, "题库为空,请联系教师解决!");this.dispose();new StudentLogin();}tests = new Test[num];// 题目数量赋值questionNum = num;/** 出现空指针异常* Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException* 出现异常的原因是因为自定义的类数组,需要对每个类进行实例化* Test[] tests = new Test[num] 是没有地方可以存数据的* 只有每个成员进行声明后才会给这个成员分配内存* tests[0] = new Test();* */// 获取题量的大小之后,需要对rs重新赋值rs = null;rs = pstmt.executeQuery();int i = 0;while (rs.next()) {tests[i] = new Test();tests[i].questionNum = rs.getInt("NUM");tests[i].questionText = rs.getString("QUESTION");tests[i].standardAnswer = rs.getString("ANSWER");i ++;}} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.close(rs, pstmt, conn);}}// 设置单选不重复模块private void setSelected(String s) {if ("A".equals(s)) {buttonGroup.setSelected(aButton.getModel(), true);}if ("B".equals(s)) {buttonGroup.setSelected(bButton.getModel(), true);}if ("C".equals(s)) {buttonGroup.setSelected(cButton.getModel(), true);}if ("D".equals(s)) {buttonGroup.setSelected(dButton.getModel(), true);}if ("".equals(s)) {buttonGroup.clearSelection();}}// 设置试题展示模块public static void showQuestion() {jTextArea.setText("");jTextArea.append(tests[questionPointer].questionText);}// 设置打分模块static void showScore() {for (int i = 0; i < questionNum; i++) {if (tests[i].checkAnswer()) {yes++;} else {no++;}}int score  = (int) (yes * 100 / questionNum);// 把学生成绩传回数据库// 用到之前登录时候定义的 stuId// 答题则表示登录成功,输入Id正确Connection conn = null;PreparedStatement pstmt = null;try {conn = JDBCUtils.getConnection();System.out.println("传入成绩:数据库连接成功!");String sql = "update sc set score = ? where sno = ?";pstmt = conn.prepareStatement(sql);// 设置占位符值pstmt.setInt(1, score);pstmt.setString(2, StudentLogin.getStuId());System.out.println("登录的学号是" + StudentLogin.getStuId());int count  = pstmt.executeUpdate();System.out.println("改变了" + count + "次成绩");} catch (SQLException e) {e.printStackTrace();} /*finally {JDBCUtils.close(null, pstmt, conn);}*/JOptionPane.showMessageDialog(null,"答对" + yes + "题,答错"+ no +"题,分数为" + score);// 展示学生信息,打分conn = null;pstmt = null;ResultSet rs = null;String sname = "";String sid = "";int sscore = 0;try {conn = JDBCUtils.getConnection();System.out.println("分数查询:数据库连接成功!");String sql = "select student.sno, student.sname, sc.score " +"from sc, student where sc.sno = student.sno and sc.sno = ?";pstmt = conn.prepareStatement(sql);pstmt.setString(1, StudentLogin.getStuId());rs = pstmt.executeQuery();while (rs.next()) {System.out.println("展示成绩");sname = rs.getString("sname");sid = rs.getString("sno");sscore = rs.getInt("score");}JOptionPane.showMessageDialog(null,"姓名:" + sname + '\n' + "学号:" + sid + '\n' + "分数:" + sscore);} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.close(rs, pstmt, conn);}}@Overridepublic void actionPerformed(ActionEvent actionEvent) {// 按键点击if (actionEvent.getSource() == start) {createExam();         // 创建考试questionPointer = 0;  // 题目序号showQuestion();       // 展示试题start.setEnabled(false);  // 设置按键不可点击cd.start();           // 开始计时} else if (actionEvent.getSource() == back) {questionPointer --;if (questionPointer == -1) {JOptionPane.showMessageDialog(null, "已经是第一题了!");questionPointer ++;} else {// 当前题目未完成,需要清空选项值setSelected(Objects.requireNonNullElse(tests[questionPointer].stuAnswer, ""));}showQuestion();} else if (actionEvent.getSource() == next) {questionPointer ++;if (questionPointer == questionNum) {JOptionPane.showMessageDialog(null, "已经是最后一题了!");questionPointer --;} else {// 当前题目未完成,需要清空选项值setSelected(Objects.requireNonNullElse(tests[questionPointer].stuAnswer, ""));}showQuestion();} else if (actionEvent.getSource() == commit) {showScore();commit.setEnabled(false);System.exit(0);}// 设置答案选项if (actionEvent.getSource() == aButton) {tests[questionPointer].stuAnswer = "A";}if (actionEvent.getSource() == bButton) {tests[questionPointer].stuAnswer = "B";}if (actionEvent.getSource() == cButton) {tests[questionPointer].stuAnswer = "C";}if (actionEvent.getSource() == dButton) {tests[questionPointer].stuAnswer = "D";}}public static void main(String[] args) {new MainView();}}// 倒计时
class Countdown extends Thread{// 设置考试倒计时// 剩余时间private JLabel leftTime;// 考试设置时间,总时间private int totalTime;Countdown(JLabel lT, int tT) {this.leftTime = lT;this.totalTime = tT * 60;}@Overridepublic void run() {NumberFormat numberFormat = NumberFormat.getInstance();// 设置数值的整数部分允许的最小位数numberFormat.setMinimumIntegerDigits(2);// 定义时分秒int h, m, s;while (totalTime > 0) {h = totalTime / 3600;m = totalTime % 3600 / 60;s = totalTime % 60;StringBuilder stringBuilder;stringBuilder = new StringBuilder();// 增加到leftTime标签stringBuilder.append("考试剩余时间为:").append(numberFormat.format(h)).append(":").append(numberFormat.format(m)).append(":").append(numberFormat.format(s));leftTime.setText(stringBuilder.toString());System.out.println("lefttime :" + leftTime);try {//延时一秒Thread.sleep(1000);} catch (Exception e) {// ignore error}// 单位是s,延时1s则总时长-1totalTime --;}if (totalTime == 0) {JOptionPane.showMessageDialog(null, "考试结束");// 考试结束的时候自动交卷,触发打分方法MainView.showScore();// 推迟执行,防止过早关闭try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.exit(0);}}
}

CheckIdentity

package com.company;import com.mysql.cj.exceptions.ConnectionIsClosedException;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class CheckIdentity extends JFrame implements ActionListener {/**  输入管理员密码之后,才能够创建教师账号/登录教师账号* */private JButton btnOk;private JButton btnCancel;private JPasswordField jpfAdmin;private JLabel welcome;private JButton back;public CheckIdentity() {super("学生在线考试系统_验证您的身份");welcome = new JLabel("确认您的身份");back = new JButton("返回");back.addActionListener(this);JPanel jPanel = new JPanel();jPanel.add(welcome);jPanel.add(back);this.add(jPanel, BorderLayout.NORTH);JPanel jPanel1 = new JPanel();JLabel jNotification = new JLabel("请输入您的身份验证密码:");jNotification.setBounds(400, 200, 230, 25);jpfAdmin = new JPasswordField();jpfAdmin.setBounds(400, 230, 200, 25);add(jNotification);add(jpfAdmin);JPanel jPanel2 = new JPanel();btnOk = new JButton("确认");btnCancel = new JButton("取消");btnOk.setBounds(430, 290, 60, 30);btnCancel.setBounds(500, 290, 60, 30);add(btnOk);add(btnCancel);btnOk.addActionListener(this);btnCancel.addActionListener(this);Container con = this.getContentPane();con.add(jPanel1, BorderLayout.CENTER);con.add(jPanel2, BorderLayout.CENTER);// 设置属性值this.setSize(1000, 600);// 设置用户不可调节窗口大小this.setResizable(false);this.setLocationRelativeTo(null);this.setVisible(true);this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);}public static void main(String[] args) {new CheckIdentity();}@Overridepublic void actionPerformed(ActionEvent actionEvent) {if (actionEvent.getSource() == btnOk) {// 确认验证String password = "";Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {conn = JDBCUtils.getConnection();System.out.println("验证教师:数据库连接成功!");String sql = "select * from administrator";pstmt = conn.prepareStatement(sql);rs = pstmt.executeQuery();while (rs.next()) {password = rs.getString(1);}} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.close(rs, pstmt, conn);}if (password.equals(new String(jpfAdmin.getPassword()))) {// 密码正确JOptionPane.showMessageDialog(null, "密码正确!");this.dispose();new TeacherSelect();}} else if (actionEvent.getSource() == btnCancel) {// 取消、返回则跳转回上一级页面new SelectIdentity();this.dispose();} else if (actionEvent.getSource() == back) {new SelectIdentity();this.dispose();}}
}

TeacherSelect

package com.company;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class TeacherSelect extends JFrame implements ActionListener {/** 用户验证身份为教师之后,需要选择登录/注册* 根据教师的选择进行跳转相应的界面* */private JButton jRegister;private JButton jLogin;private JLabel welcome;private JButton back;TeacherSelect() {super("学生在线考试系统_教师注册/登录");welcome = new JLabel("教师操作选择");back = new JButton("返回");back.addActionListener(this);JPanel jPanel = new JPanel();jPanel.add(welcome);jPanel.add(back);JPanel jPanel1 = new JPanel();JLabel jNotification = new JLabel("请选择:");jNotification.setBounds(430, 230, 200, 25);add(jNotification);JPanel jPanel2 = new JPanel();jRegister = new JButton("注册");jLogin = new JButton("登录");jRegister.setBounds(430, 260, 60, 30);jLogin.setBounds(500, 260, 60, 30);add(jRegister);add(jLogin);jRegister.addActionListener(this);jLogin.addActionListener(this);Container con = this.getContentPane();con.add(jPanel1, BorderLayout.NORTH);con.add(jPanel2, BorderLayout.CENTER);con.add(jPanel, BorderLayout.NORTH);con.setLocation(400, 200);this.setVisible(true);this.setSize(1000, 600);this.setResizable(false);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void main(String[] args) {new TeacherSelect();}@Overridepublic void actionPerformed(ActionEvent actionEvent) {if (actionEvent.getSource() == back) {this.dispose();new SelectIdentity();} else if (actionEvent.getSource() == jRegister) {// 选择注册之后this.dispose();new TeacherRegister();} else if (actionEvent.getSource() == jLogin) {// 选择登录之后进入登录界面this.dispose();new TeacherLogin();}}
}

TeacherRegister

package com.company;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class TeacherRegister extends JFrame implements ActionListener {// 提供用户注册界面private JLabel tName;private JLabel tId;private JLabel tPassword;private JLabel tSex;private JLabel idTip;private JLabel passwordTip;private JTextField jtfName;private JTextField jtfId;private JPasswordField jpfPassword;private JComboBox jcbSex;private JButton btnOk;private JButton btnCancel;private JLabel welcome;private JButton back;// 范围选择String[] stringSex = new String[] {"-请选择-", "男", "女"};public TeacherRegister () {super("学生在线考试系统_教师注册");welcome = new JLabel("教师注册界面");back = new JButton("返回");back.addActionListener(this);tName = new JLabel("姓名:");jtfName = new JTextField(20);tId = new JLabel("工号:");jtfId = new JTextField(20);tPassword = new JLabel("密码:");jpfPassword = new JPasswordField(20);tSex = new JLabel("性别:");jcbSex = new JComboBox(stringSex);idTip = new JLabel("(工号为11位的整数)");passwordTip = new JLabel("(密码不得少于6位)");btnOk = new JButton("确认");btnCancel = new JButton("取消");btnOk.addActionListener(this);btnCancel.addActionListener(this);JPanel jPanel = new JPanel();jPanel.add(welcome);jPanel.add(back);JPanel jPanel1 = new JPanel();tName.setBounds(350, 150, 50, 30);jtfName.setBounds(400, 155, 200, 25);tId.setBounds(350, 190, 50, 30);jtfId.setBounds(400, 195, 200, 25);idTip.setBounds(620, 190, 200, 30);tPassword.setBounds(350, 230, 50, 30);jpfPassword.setBounds(400, 235, 200, 25);passwordTip.setBounds(620, 230, 200, 30);tSex.setBounds(350, 270, 50, 30);jcbSex.setBounds(400, 275, 200, 25);add(tName);add(jtfName);add(tId);add(jtfId);add(idTip);add(tPassword);add(jpfPassword);add(passwordTip);add(tSex);add(jcbSex);JPanel jPanel2 = new JPanel();btnOk.setBounds(430, 330, 60, 30);btnCancel.setBounds(500, 330, 60, 30);add(btnOk);add(btnCancel);this.add(jPanel, BorderLayout.NORTH);this.add(jPanel1, BorderLayout.CENTER);this.add(jPanel2, BorderLayout.SOUTH);this.setVisible(true);this.setSize(1000, 600);this.setResizable(false);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public boolean isAllNumber (String s) {char[] str = s.toCharArray();for (char c : str) {if (c < '0' || c > '9') {return false;}}return true;}public static void main(String[] args) {new TeacherRegister();}@Overridepublic void actionPerformed(ActionEvent actionEvent) {if (actionEvent.getSource() == back) {this.dispose();new TeacherSelect();} else if (actionEvent.getSource() == btnOk) {// 设置临时变量存储输入值,判断String tempName = jtfName.getText();// 无输入的时候为""System.out.println(tempName);String tempId = jtfId.getText();String tempPassword = new String(jpfPassword.getPassword());String tempSex = "";int isEmpty = 0;int isLegal = 0;int isSelect = 0;if ("".equals(tempName)) {JOptionPane.showMessageDialog(null, "请输入姓名!");} else if ("".equals(tempId)) {JOptionPane.showMessageDialog(null, "请输入学号!");} else if ("".equals(tempPassword)) {JOptionPane.showMessageDialog(null, "请输入密码!");} else {// 表示要填写的元素全部都有填写isEmpty = 1;}if (isEmpty == 1) {if (isAllNumber(tempId)){char[] strId = tempId.toCharArray();if (strId.length == 11) {char[] strPassword = tempPassword.toCharArray();if (strPassword.length >= 6) {isLegal = 1;} else {JOptionPane.showMessageDialog(null, "密码不满足条件!");}} else {JOptionPane.showMessageDialog(null, "工号不是11位!");jtfId.setText("");}} else {JOptionPane.showMessageDialog(null, "工号不是数字!");jtfId.setText("");}}if (isEmpty == 1 && isLegal == 1) {if (jcbSex.getSelectedIndex() != 0) {tempSex = stringSex[jcbSex.getSelectedIndex()];isSelect = 1;} else {JOptionPane.showMessageDialog(null, "请选择性别!");}}if (isEmpty == 1 && isLegal == 1 && isSelect == 1) {Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {conn = JDBCUtils.getConnection();System.out.println("教师注册:数据库连接成功!");// 先根据传入的数据是否存在,判断条件:主键IdString selectId = "select tno from teacher where tno = ?";pstmt = conn.prepareStatement(selectId);pstmt.setString(1, tempId);rs = pstmt.executeQuery();String tempJudge = "";while (rs.next()) {tempJudge = rs.getString(1);}if (tempJudge.equals(tempId)) {JOptionPane.showMessageDialog(null, "用户已存在!");} else {pstmt = null;rs = null;String sql = "insert into teacher(tno, password, tname, tsex) " +"values(?, ?, ?, ?)";pstmt = conn.prepareStatement(sql);pstmt.setString(1, tempId);pstmt.setString(2, tempPassword);pstmt.setString(3, tempName);pstmt.setString(4, tempSex);// 返回影响的行数int flag = pstmt.executeUpdate();if (flag == 1) {System.out.println("注册成功");JOptionPane.showMessageDialog(null, "注册成功!");this.dispose();new TeacherLogin();} else {System.out.println("注册失败");JOptionPane.showMessageDialog(null, "注册失败!");}}} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.close(rs, pstmt, conn);}}} else if (actionEvent.getSource() == btnCancel) {this.dispose();new SelectIdentity();}}
}

TeacherLogin

package com.company;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class TeacherLogin extends JFrame implements ActionListener {// 定义文本域接收用户名private JTextField jtfId;// 定义密码域接收密码private JPasswordField jpfPassword;// 定义按钮,确认、取消private JButton btnOk;private JButton btnCancel;static String teacherId = "";   // 传值给TeacherView使用private static String tId = "";              // 工号private String tPassword = "";        // 密码private JLabel welcome;private JButton back;public TeacherLogin() {super("学生在线考试系统_教师登录");welcome = new JLabel("教师注册界面");back = new JButton("返回");back.addActionListener(this);JPanel jPanel = new JPanel();jPanel.add(welcome);jPanel.add(back);this.add(jPanel, BorderLayout.NORTH);// 工号密码输入部分// 定义界面JPanel jpMain = new JPanel();// 定义标签JLabel lblId = new JLabel("工号:");JLabel lblPassword = new JLabel("密码:");jtfId = new JTextField(20);jpfPassword = new JPasswordField(20);lblId.setBounds(350, 200, 50, 30);jtfId.setBounds(400, 205, 200, 25);lblPassword.setBounds(350, 240, 50, 30);jpfPassword.setBounds(400, 245, 200, 25);add(lblId);add(jtfId);add(lblPassword);add(jpfPassword);// 登录确认取消部分JPanel jpBtn = new JPanel();btnOk = new JButton("确认");btnCancel = new JButton("取消");btnOk.setBounds(430, 290, 60, 30);add(btnOk);btnCancel.setBounds(500, 290, 60, 30);add(btnCancel);// 添加事件监听btnOk.addActionListener(this);btnCancel.addActionListener(this);// 添加容器Container con = this.getContentPane();con.add(jpMain, BorderLayout.CENTER);con.add(jpBtn, BorderLayout.CENTER);// 设置属性值this.setSize(1000, 600);// 设置用户不可调节窗口大小this.setResizable(false);this.setLocationRelativeTo(null);this.setVisible(true);this.setTitle("学生在线考试系统_教师登录");this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}@Overridepublic void actionPerformed(ActionEvent actionEvent) {/** 登录功能逻辑:*  1. 先获取到工号*  2. 利用工号检索数据库,看是否查询得到对应的密码*    - 有查询结果,则代表工号正确*    - 无查询结果,则代表工号错误/没添加*  3. 有对应的密码之后,判断数据库的密码和用户输入的密码是否匹配*    - 若匹配,则密码正确*    - 若不匹配,则密码错误* */// 设置用户输入临时储存// 设置正确工号密码的匹配值// 设置用户输入的存储值String tempId = "";String tempPassword = "";int temp = 0;if (actionEvent.getSource() == btnOk) {if ("".equals(jtfId.getText())) {// System.out.println("请输入工号!");JOptionPane.showMessageDialog(null, "请输入工号!");} else if ("".equals(new String(jpfPassword.getPassword()))) {// System.out.println("请输入密码!");JOptionPane.showMessageDialog(null, "请输入密码!");} else {temp = 1;tempId = jtfId.getText();tempPassword = new String(jpfPassword.getPassword());}if (temp == 1) {// 执行JDBC查询到教师的ID和密码Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {conn = JDBCUtils.getConnection();// JOptionPane.showMessageDialog(null, "数据库连接成功!");System.out.println("教师登录:数据库连接成功!");String sql = "select password from teacher where tno = ?";pstmt = conn.prepareStatement(sql);pstmt.setString(1, tempId);rs = pstmt.executeQuery();while (rs.next()) {tPassword = rs.getString(1);}// 如果工号输入错误/找不到对应的工号,则返回的rs为null,getString也为nullif (tempPassword.equals(tPassword)) {teacherId = tempId;JOptionPane.showMessageDialog(null, "登录成功!");// 执行页面跳转this.dispose(); // 关闭登录界面new TeacherView(); // 弹出主页面} else {JOptionPane.showMessageDialog(null, "工号或密码错误!");jtfId.setText("");jpfPassword.setText("");}} catch (SQLException e) {e.printStackTrace();} finally {// 释放资源JDBCUtils.close(rs, pstmt, conn);}}}// 取消登录操作if (actionEvent.getSource() == btnCancel) {JOptionPane.showMessageDialog(null, "您已退出!");new TeacherSelect();this.dispose();} else if (actionEvent.getSource() == back) {new TeacherSelect();this.dispose();}}public static void main(String[] args) {new TeacherLogin();}}

TeacherView

package com.company;import javax.swing.*;
import javax.swing.event.TableColumnModelListener;
import javax.swing.plaf.basic.BasicArrowButton;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Enumeration;public class TeacherView extends JFrame implements ActionListener {private JLabel welcome;private JLabel name;private JLabel id;private JLabel sex;private JLabel tName;private JLabel tId;private JLabel tSex;private JButton back;String teacherName = "";String teacherId = "";String teacherSex = "";private JLabel functionTip;private JButton btnAddQuestion;private JButton btnQueryScore;private JButton btnUpdateScore;// 学生信息表格查询private DefaultTableModel model;private JScrollPane jScrollPane;private JPanel jPanel3;private JTable jTable;Student[] students;public TeacherView () {Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {conn = JDBCUtils.getConnection();System.out.println("教师界面:数据库连接成功");String sql = "select tname,tsex from teacher where tno = ?";pstmt = conn.prepareStatement(sql);pstmt.setString(1, TeacherLogin.teacherId);rs = pstmt.executeQuery();teacherId = TeacherLogin.teacherId;while (rs.next()) {teacherName = rs.getString("tname");teacherSex = rs.getString("tsex");}} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.close(rs, pstmt, conn);}welcome = new JLabel("教师主页面");back = new JButton("返回");back.addActionListener(this);JPanel jPanel1 = new JPanel();jPanel1.add(welcome);jPanel1.add(back);name = new JLabel("姓名:");id = new JLabel("工号:");sex = new JLabel("性别:");tName = new JLabel(teacherName);tId = new JLabel(teacherId);tSex = new JLabel(teacherSex);JPanel jPanel2 = new JPanel();name.setBounds(350, 70, 50, 30);tName.setBounds(400, 70, 200, 30);id.setBounds(350, 110, 50, 30);tId.setBounds(400, 110, 200, 30);sex.setBounds(350, 150, 50, 30);tSex.setBounds(400, 150, 200, 30);add(name);add(tName);add(id);add(tId);add(sex);add(tSex);functionTip = new JLabel("请选择您的操作:");btnQueryScore = new JButton("查询成绩");btnUpdateScore = new JButton("修改成绩");btnAddQuestion = new JButton("添加试题");functionTip.setBounds(350, 200, 200, 30);btnQueryScore.setBounds(350, 240, 100, 30);btnUpdateScore.setBounds(480, 240, 100, 30);btnAddQuestion.setBounds(610, 240, 100, 30);add(functionTip);add(btnQueryScore);add(btnUpdateScore);add(btnAddQuestion);btnQueryScore.addActionListener(this);btnUpdateScore.addActionListener(this);btnAddQuestion.addActionListener(this);jPanel3 = new JPanel();String[] columnName = {"姓名", "学号", "性别", "年龄", "成绩", "学院", "专业"};String[] columnWidth = {"80", "120", "40", "40", "40", "90", "90"};model = new DefaultTableModel();model.setColumnIdentifiers(columnName);jTable = new JTable(model);jTable.setBounds(280, 300, 500, 300);TableColumnModel tableColumnModel = jTable.getColumnModel();for (int i = 0; i < 7; i++) {TableColumn tableColumn = tableColumnModel.getColumn(i);tableColumn.setPreferredWidth(Integer.parseInt(columnWidth[i]));}DefaultTableCellRenderer cr = new DefaultTableCellRenderer();cr.setHorizontalAlignment(JLabel.CENTER);jTable.setDefaultRenderer(Object.class, cr);jScrollPane = new JScrollPane(jTable);add(jTable);jTable.setVisible(false);this.add(jPanel3, BorderLayout.SOUTH);this.add(jPanel1, BorderLayout.NORTH);this.add(jPanel2, BorderLayout.CENTER);this.setVisible(true);this.setTitle("学生在线考试系统_教师界面");this.setSize(1000, 700);this.setResizable(false);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void main(String[] args) {new TeacherView();}@Overridepublic void actionPerformed(ActionEvent actionEvent) {if (actionEvent.getSource() == back) {this.dispose();new TeacherLogin();} else if (actionEvent.getSource() == btnQueryScore) {// btnQueryScore.setEnabled(false);/*Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setSize((int) screenSize.getWidth(), (int) screenSize.getHeight());*/Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {int row = 0;conn = JDBCUtils.getConnection();String sqlQuery = "select sname, student.sno, ssex, sage, department, major, sc.score " +"from student, sc " +"where student.sno=sc.sno";String sqlRow = "select count(*) from student";pstmt = conn.prepareStatement(sqlRow);rs = pstmt.executeQuery();while (rs.next()) {row = rs.getInt(1);}if (row == 0) {JOptionPane.showMessageDialog(null, "没有学生记录!");} else {model.setRowCount(0);int countRow = 0;String[] columnName = {"姓名", "学号", "性别", "年龄", "成绩", "学院", "专业"};model.addRow(columnName);jTable.setVisible(true);pstmt = null;rs = null;students = new Student[row];pstmt = conn.prepareStatement(sqlQuery);rs = pstmt.executeQuery();int i = 0;while (rs.next()) {students[i] = new Student();students[i].studentName = rs.getString("sname");students[i].studentId = rs.getString("sno");students[i].studentSex = rs.getString("ssex");students[i].studentAge = rs.getString("sage");students[i].studentScore = rs.getInt("score");students[i].studentDepartment = rs.getString("department");students[i].studentMajor = rs.getString("major");i ++;}for (int j = 0; j < i; j ++) {model.addRow(new Object[]{students[j].studentName, students[j].studentId,students[j].studentSex, students[j].studentAge, students[j].studentScore,students[j].studentDepartment, students[j].studentMajor});}countRow = jTable.getRowCount();jTable.setEnabled(false);System.out.println(countRow);}} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.close(rs, pstmt, conn);}} else if (actionEvent.getSource() == btnUpdateScore) {new UpdateScore();} else if (actionEvent.getSource() == btnAddQuestion) {// 添加试题new AddQuestion();}}
}class UpdateScore extends JFrame  implements  ActionListener{JLabel updateId = new JLabel("请输入要修改的学生学号:");JLabel updateScore = new JLabel("请输入要修改的成绩:");JTextField jtfId = new JTextField(20);JTextField jtfScore = new JTextField(20);JButton btnOk = new JButton("确认");JButton btnCancel = new JButton("取消");public UpdateScore () {JPanel jPanel = new JPanel();updateId.setBounds(350, 50, 200, 30);jtfId.setBounds(350, 80, 300, 25);updateScore.setBounds(350, 120, 200, 30);jtfScore.setBounds(350, 150, 300, 25);btnOk.setBounds(400, 400, 75, 30);btnCancel.setBounds(500, 400, 75, 30);add(updateId);add(jtfId);add(updateScore);add(jtfScore);add(btnOk);add(btnCancel);btnOk.addActionListener(this);btnCancel.addActionListener(this);this.add(jPanel, BorderLayout.CENTER);this.setVisible(true);this.setSize(1000, 600);this.setResizable(false);this.setLocationRelativeTo(null);/*this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);*/}public boolean isAllNumber (String s) {char[] str = s.toCharArray();for (char c : str) {if (c < '0' || c > '9') {return false;}}return true;}@Overridepublic void actionPerformed(ActionEvent actionEvent) {if (actionEvent.getSource() == btnOk) {// 判断ID以及分数是否合理int isEmpty = 0;int isLegal = 0;String temp = "";String tempId = "";int tempScore = 0;temp = jtfScore.getText();tempId = jtfId.getText();if ("".equals(tempId)) {JOptionPane.showMessageDialog(null, "请输入学号!");} else if ("".equals(temp)) {JOptionPane.showMessageDialog(null, "请输入分数!");} else {isEmpty = 1;}if (isEmpty == 1) {if (isAllNumber(tempId)) {char[] id = tempId.toCharArray();if (id.length == 11) {if (isAllNumber(temp)) {tempScore = Integer.parseInt(jtfScore.getText());if (0 <= tempScore && tempScore <= 100) {isLegal = 1;} else {JOptionPane.showMessageDialog(null, "分数在0-100!");}} else {JOptionPane.showMessageDialog(null, "分数应为数字!");}} else {JOptionPane.showMessageDialog(null, "学号为11位!");}} else {JOptionPane.showMessageDialog(null, "学号应为数字!");}}if (isEmpty == 1 && isLegal == 1) {Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {conn = JDBCUtils.getConnection();System.out.println("修改分数:数据库连接成功!");String sql = "update sc set score = ? where sc.sno = ?";String sqlQuery = "select sno from sc where sc.sno = ?";pstmt = conn.prepareStatement(sqlQuery);int isExist = 0;pstmt.setString(1, tempId);rs = pstmt.executeQuery();while (rs.next()) {isExist ++;}if (isExist == 1) {pstmt = null;pstmt = conn.prepareStatement(sql);pstmt.setInt(1, tempScore);pstmt.setString(2, tempId);int count = pstmt.executeUpdate();if (count == 1) {System.out.println("修改成功!");JOptionPane.showMessageDialog(null, "修改成功!");this.dispose();} else {System.out.println("修改失败!");JOptionPane.showMessageDialog(null, "修改失败!");this.dispose();}} else {JOptionPane.showMessageDialog(null, "您输入的学号不存在!");}} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.close(rs, pstmt, conn);}}} else if (actionEvent.getSource() == btnCancel) {this.dispose();}}
}class AddQuestion extends JFrame implements ActionListener {String[] stringAnswer = {"-请选择-", "A", "B", "C", "D"};JLabel questionNum = new JLabel("请输入题号(不能重复):");JLabel questionText = new JLabel("请输入题目内容:");JLabel questionAnswer = new JLabel("请选择题目答案:");JTextField jtfNum = new JTextField();JTextArea jtfText = new JTextArea(20, 40);JComboBox jcbAnswer = new JComboBox(stringAnswer);JButton btnOk = new JButton("确认");JButton btnCancel = new JButton("取消");public AddQuestion() {JPanel jPanel1 = new JPanel();questionNum.setBounds(350, 50, 200, 30);jtfNum.setBounds(350, 80, 300, 25);add(questionNum);add(jtfNum);JPanel jPanel2 = new JPanel();questionText.setBounds(350, 120, 200, 30);jtfText.setBounds(350, 150, 300, 200);add(questionText);add(jtfText);JPanel jPanel3 = new JPanel();questionAnswer.setBounds(350, 370, 200, 30);jcbAnswer.setBounds(350, 400, 300, 25);add(questionAnswer);add(jcbAnswer);btnOk.setBounds(400, 450, 75, 30);btnCancel.setBounds(500, 450, 75, 30);add(btnOk);add(btnCancel);btnOk.addActionListener(this);btnCancel.addActionListener(this);this.add(jPanel1, BorderLayout.NORTH);this.add(jPanel2, BorderLayout.CENTER);this.add(jPanel3, BorderLayout.SOUTH);this.setVisible(true);this.setSize(1000, 600);this.setResizable(false);this.setLocationRelativeTo(null);/*this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);*/}public boolean isAllNumber (String s) {char[] str = s.toCharArray();for (char c : str) {if (c < '0' || c > '9') {return false;}}return true;}@Overridepublic void actionPerformed(ActionEvent actionEvent) {// 添加试题if (actionEvent.getSource() == btnOk) {/*Test[] addTests = new Test[1];*/String num = jtfNum.getText();String text = jtfText.getText();String answer = stringAnswer[jcbAnswer.getSelectedIndex()];int isEmpty = 0;int isSelect = 0;int isLegal = 0;if ("".equals(num)) {JOptionPane.showMessageDialog(null, "请输入题号!");} else if ("".equals(text)) {JOptionPane.showMessageDialog(null, "请输入题目!");} else if (jcbAnswer.getSelectedIndex() == 0) {JOptionPane.showMessageDialog(null, "请选择答案!");} else {isEmpty = 1;isSelect = 1;}if (isAllNumber(num)) {isLegal = 1;} else {JOptionPane.showMessageDialog(null, "您输入的题号不规范!");}if (isEmpty == 1 && isLegal == 1 && isSelect == 1) {// 开始连接数据库传入参数Connection conn = null;PreparedStatement preparedStatement = null;ResultSet rsQuery = null;PreparedStatement pstmt = null;ResultSet rs = null;int isExist = 0;try {conn = JDBCUtils.getConnection();String sqlQuery = "select * from test where num = ?";System.out.println("查询题号存在:数据库连接成功!");preparedStatement = conn.prepareStatement(sqlQuery);preparedStatement.setInt(1, Integer.parseInt(num));rsQuery = preparedStatement.executeQuery();while (rsQuery.next()) {isExist ++;}} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.close(rsQuery, preparedStatement, conn);}if (isExist == 0) {try {conn = JDBCUtils.getConnection();String sql = "insert into test(num, question, answer) " +"values(?, ?, ?) ";System.out.println("添加题目:数据库连接成功!");pstmt = conn.prepareStatement(sql);pstmt.setInt(1, Integer.parseInt(num));pstmt.setString(2, text);pstmt.setString(3, answer);int count = 0;count = pstmt.executeUpdate();if (count == 1) {System.out.println("题目添加成功!");JOptionPane.showMessageDialog(null, "题目添加成功!");this.dispose();} else {JOptionPane.showMessageDialog(null, "题目添加失败!");}} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.close(rs, pstmt, conn);}} else {JOptionPane.showMessageDialog(null, "题号已经存在!");}}} else if (actionEvent.getSource() == btnCancel) {this.dispose();}}
}

记载于2020.12.29
Java课程设计报告
Author:雨下一整晚real

【Java】课程设计—学生在线考试系统相关推荐

  1. 山东大学软件学院高级语言课程设计JAVA课程设计-学生在线考试系统平台

    说明:blog 不全面而且也不是上交实验报告的最终版本(是自己实验过程中简单记录的笔记),完整内容(含代码+实验报告)可以通过(山东大学软件学院高级语言课程设计JAVA课程设计-学生在线考试系统平台) ...

  2. java毕业生设计学生在线评教系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计学生在线评教系统计算机源码+系统+mysql+调试部署+lw java毕业生设计学生在线评教系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B/S架构 开 ...

  3. 【27】基于java的学生在线考试系统

    一.项目简介 随着互联网迅速发展,人们的生活已经越来越离不开互联网,人们足不出户就可以工作.学习等.对于在校学生,通过网络教育不仅可以随时进行网络学习,也可以根据学习的情况自我检测,有利于学生高效.快 ...

  4. java计算机毕业设计web在线考试系统MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计web在线考试系统MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计web在线考试系统MyBatis+系统+LW文档+源码+调试部署 本源码技术栈: 项目架构 ...

  5. java毕业生设计学生用品采购系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计学生用品采购系统计算机源码+系统+mysql+调试部署+lw java毕业生设计学生用品采购系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B/S架构 开 ...

  6. java毕业生设计星光在线光影系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计星光在线光影系统计算机源码+系统+mysql+调试部署+lw java毕业生设计星光在线光影系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B/S架构 开 ...

  7. java计算机毕业设计web在线考试系统源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计web在线考试系统源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计web在线考试系统源码+mysql数据库+系统+lw文档+部署 本源码技术栈: 项目架构:B ...

  8. java学籍管理系统 课程设计,Java课程设计---学生学籍管理系统

    Java课程设计---学生学籍管理系统 设计报告设计报告 课题名称学生学籍管理系统 学院 专业班级计算机应用技术 091 学号 学生 指导教师 2011 年 7 月 7 日 1 学生 指导教师 课题名 ...

  9. 计算机类学生考试系统,学生在线考试系统.doc

    PAGE II 编号 毕业设计论文 题目: 学生姓名 学 号 系 部 专 业 班 级 指导教师 评阅教师 2012 年 5 月 学生在线考试系统 Student Online Examination ...

  10. mysql创建学生答题系统_jsp+ssm+mysql实现的学生在线考试系统

    jsp+mysql+ssm框架实现的学生在线考试系统 https://www.yuanlrc.com/product/details.html?pid=169&fuid=6666 系统功能比较 ...

最新文章

  1. 发现了阿里云 APP 的一个小 BUG
  2. 织梦的网站地图怎么做html,如何优化织梦dedecms默认网站地图sitemap.html??
  3. [黑马程序员二]:C#面向对象基础
  4. vue路由详解版一目了然
  5. 东北天到ecef的变换_GNSS学习笔记-坐标转换
  6. Python笔记-centos7使用adb连接真实手机及初始化uiautomatro2项目
  7. java常用类需要记吗_java 常用类
  8. Nginx使用Expires增加浏览器缓存加速
  9. 从程序员到CTO,他只做了三件事!!!
  10. 数学建模之常见的优化模型
  11. windows系统ftp服务器,Windows下使用的FTP服务器软件
  12. Python项目分析:预测双色球福利彩票中奖号码(随便玩玩,不要当真)
  13. 淘宝API-item_search - 按关键字搜索淘宝商品
  14. (实战)决策树例子+画图
  15. SGU 244. Height, Bisector and Median
  16. JAVA线上故障排查招式
  17. 2021年中国旅游人次、箱包销售收入及利润总额分析[图]
  18. ​​​​​​​墨画子卿第三章:初心第2节:回家
  19. m基于matlab的超宽带MIMO雷达对目标的检测仿真,考虑时间反转
  20. SqlHelper的使用

热门文章

  1. python黑帽子学习
  2. 威纶通触摸屏如何打开并升级EB8000旧版本项目并更换触摸屏型号?
  3. 软件无法安装时怎么办
  4. mysql建用户注册登录表_登录注册数据库建立
  5. php 漏洞扫描 rsas,绿盟--漏洞扫描系统NSFOCUS-RSAS-S-v5.0
  6. 【九天教您南方cass 9.1】 13 等高线法计算土方量
  7. 完美卸载SQL Server 2008的方案
  8. win10固态硬盘分区 整数_固态硬盘怎么重装win10系统?Win10固态硬盘重装系统教程...
  9. matlab绘图举例,MATLAB绘图教程详解
  10. inter Fortran安装匹配VS2012