提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
要求
功能要求:
1.添加学生功能:姓名、学号、性别、出生年月日。(注意:学号自动生成,学号必须唯一)
2.添加学生成绩功能:假设每个人都选修了数学、Java与体育。但输入成绩的时候,一般是给所有学生输入某一门课程的成绩。
3.根据学生学号查找学生成绩,并在界面上显示姓名、学号和成绩,学号不存在的给出提示信息
4. 根据学生姓名(支持模糊匹配)查找学生成绩,并在界面上显示姓名、学号和成绩,如果有多个相同姓名学生存在,一起显示出来,姓名不存在的给出提示信息
5. 生成学生学习情况报表:报表包含学号、姓名、各科目成绩及对应的该科目班级平均值,总成绩以及班级总成绩平均值。最后以总成绩平均值降序在图形界面输出,并可将该排序结果按照输出至"成绩表.txt"文件或者excel文件(输出到Excel文件为特别加分项,可以使用POI技术)。
6. 支持分别对所有学生各科成绩画出柱状分布图(可选)。
7. 支持对学生信息的修改与删除(要在文件或数据库中有所体现),不能修改学号。
8.测试:支持随机生成10万个学生及其姓名、学号、成绩放入文本文件,以进行测试。(学号不能相同,每颗的成绩以80分为中心成正态分本)(重要加分项)
9.支持用户登录、验证操作
界面:GUI
数据存储在数据库或者文件中。
一、程序功能实现
(一)登陆注册功能:
登录注册功能采用的是对文本文件的内容读取与写入,通过监听器来监听用户输入的用户名与密码,通过加密后使用字符流输入到文本文件当中,而登录则是使用字符输出流来进行读取数据并且解密,然后通过与登陆数据.txt文件中的每一行登录数据进行比较,来实现登陆的功能.
由于登录功能只需要对数据进行处理和对比即可,所以我将登录功能的代码逻辑写到了主页面搭建的监听器当中,在AppJFrame类当中
代码演示:
//Register
package java课题设计.功能类;
import java课题设计.工具类.Seek;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.FileOutputStream;
import java.io.IOException;
//该类用于绘制注册事宜以及书写关于注册方面的代码逻辑
public class Register extends JDialog implements DocumentListener, MouseListener {
String word;
String name;
JLabel reghter =new JLabel(new ImageIcon("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\puzzlegame\\登陆界面\\注册按钮.png"));
public Register(JFrame parent){
super(parent, "注册新账号", true); // 设置为模态对话框
extracted();
image();
this.setVisible(true);
}
public void extracted(){
this.setSize(488,430);
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setLayout(null);
//reghter.addMouseListener(this);
}
public void image(){
//添加用户名提示输入框
JLabel usernameText = new JLabel(new ImageIcon("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\puzzlegame\\登陆界面\\用户名.png"));
usernameText.setBounds(116,135,47,17);
this.getContentPane().add(usernameText);
//添加密码输入提示框
JLabel passwordText = new JLabel(new ImageIcon("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\puzzlegame\\登陆界面\\密码.png"));
passwordText.setBounds(130,195,32,16);
this.getContentPane().add(passwordText);
//添加用户名输入框
JTextField username=new JTextField();
username.setBounds(195,134,200,30);
this.getContentPane().add(username);
//获取到用户输入的用户名
username.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
name=username.getText();
}
});
//添加密码输入框
JTextField password=new JTextField();
password.setBounds(195,195,200,30);
this.getContentPane().add(password);
//添加监听器获取用户输入的密码
password.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
word = password.getText();
}
@Override
public void removeUpdate(DocumentEvent e) {
word = password.getText();
}
@Override
public void changedUpdate(DocumentEvent e) {
word = password.getText();
}
});
//添加注册按钮
reghter.setBounds(200,250,128,47);
this.getContentPane().add(reghter);
//为注册按钮添加点击监听器
reghter.addMouseListener(this);
System.out.println("添加监听器成功");
}
//将注册的用户名和账号写入登陆数据的文件中
public void write() throws IOException {
if(this.name==null||this.word==null){
System.out.println("注册失败");
//跳出弹窗提示账号或密码有误
JDialog wrong=new JDialog(this,null,true);
wrong.setBounds(550,300,300,200);
wrong.setTitle("注册失败");
JLabel w=new JLabel("用户名或账号不能为空");
w.setFont(new Font("宋体",Font.BOLD,18));
w.setBounds(100,100,100,100);
wrong.add(w);
wrong.setAlwaysOnTop(true);
wrong.setVisible(true);
}
String str=this.name+"&"+this.word+"\n";
//循环遍历文件判断是否有与注册的用户名相同的用户账号
boolean flag= Seek.seek(str);
if(flag==false){
//添加注册失败弹窗
System.out.println("注册失败");
//跳出弹窗提示账号或密码有误
JDialog wrong=new JDialog(this,null,true);
wrong.setBounds(550,300,300,200);
wrong.setTitle("注册失败");
JLabel w=new JLabel("注册失败,用户名重复");
w.setFont(new Font("宋体",Font.BOLD,25));
w.setBounds(100,100,100,100);
wrong.add(w);
wrong.setAlwaysOnTop(true);
wrong.setVisible(true);
}
else{
FileOutputStream w=new FileOutputStream("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\StudentManagementSystem\\src\\java课题设计\\登陆数据.txt",true);
byte[] byt=str.getBytes();
w.write(byt);
w.close();
//添加注册成功提示窗口
JDialog wrong=new JDialog(this,null,true);
wrong.setBounds(550,300,300,200);
wrong.setTitle("注册成功");
JLabel wa =new JLabel("注册成功");
wa.setFont(new Font("宋体",Font.BOLD,25));
wa.setBounds(100,100,100,100);
wrong.add(wa);
wrong.setAlwaysOnTop(true);
wrong.setVisible(true);
this.setVisible(false);}
}
@Override
public void insertUpdate(DocumentEvent e) {
}
@Override
public void removeUpdate(DocumentEvent e) {
}
@Override
public void changedUpdate(DocumentEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
//点击了注册按钮,调用注册方法
if(e.getSource()==reghter) {
System.out.println("点击了注册按钮");
try {
write();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
else System.out.println("有错误");
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
//AppJFrame
package java课题设计.功能类;
import java课题设计.工具类.Seek;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
//该类用于绘制APP主画面以及用户选择登陆或者注册的代码逻辑
public class AppJFrame extends JFrame implements ActionListener, MouseListener, DocumentListener {
JLabel LoginText=new JLabel(new ImageIcon("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\puzzlegame\\登陆界面\\登录按钮.png"));
JLabel registerText=new JLabel(new ImageIcon("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\puzzlegame\\登陆界面\\注册按钮.png"));
String account,word;
public AppJFrame(){
extracted();
initImage();
this.setVisible(true);
}
private void extracted(){
//设置登录界面的长和宽
this.setSize(800,700);
this.setTitle("齐工大学生管理系统 v1.0");
this.setAlwaysOnTop(true);
this.setDefaultCloseOperation(3);
this.setLayout(null);
this.setLocationRelativeTo(null);
//添加监听事件
LoginText.addMouseListener(this);
registerText.addMouseListener(this);
}
private void initImage(){
//绘制总标题
Font font=new Font("宋体",Font.BOLD,30);
JLabel tetle=new JLabel("齐工大学生管理系统 v1.0");
tetle.setBounds(200,56,400,200);
tetle.setFont(font);
this.getContentPane().add(tetle);
//添加登录按钮
LoginText.setBounds(200,450,128,47);
this.getContentPane().add(LoginText);
//添加注册按钮
registerText.setBounds(450,450,128,47);
this.getContentPane().add(registerText);
//添加用户名输入框
JTextField username=new JTextField();
username.setBounds(300,260,300,45);
this.getContentPane().add(username);
//添加监听器获取输入框中的数据
username.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
account=username.getText();
}
});
//添加密码输入框
JTextField password=new JTextField();
password.setBounds(300,360,300,45);
this.getContentPane().add(password);
//添加监听器获取输入框中的数据
password.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
word = password.getText();
}
@Override
public void removeUpdate(DocumentEvent e) {
word = password.getText();
}
@Override
public void changedUpdate(DocumentEvent e) {
word = password.getText();
}
});
//添加账号输入提示
JLabel Login=new JLabel("账号");
Login.setBounds(215,260,300,45);
Font f=new Font("宋体",Font.BOLD,30);
Login.setFont(f);
this.getContentPane().add(Login);
//添加密码输入提示
JLabel pass=new JLabel("密码");
pass.setBounds(215,360,300,45);
f=new Font("宋体",Font.BOLD,30);
pass.setFont(f);
this.getContentPane().add(pass);
}
//动作监听方法
@Override
public void actionPerformed(ActionEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
Object obj=e.getSource();
if(obj==LoginText) {
//文本库检索登录用户名和密码的正确性
//如果正确,隐藏当前窗口进入下一步窗口
//如果错误,提示密码或用户名输入有误
//System.out.println("点击的是登录按钮");
//System.out.println(account+" "+word);
String str = account + "&" + word;
boolean flag;
try {
flag = Seek.seek(str);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
if (flag == false) {
//唤起登陆后的窗口
System.out.println("登陆成功");
this.setVisible(false);
//关闭当前页面后唤醒登录之后的页面
new OperationPage();
} else {
System.out.println("登陆失败");
//跳出弹窗提示账号或密码有误
JDialog wrong = new JDialog(this, null, true);
wrong.setBounds(550, 300, 300, 200);
wrong.setTitle("登陆失败");
JLabel w = new JLabel("账号或密码输入有误,登陆失败");
w.setFont(new Font("宋体", Font.BOLD, 18));
w.setBounds(100, 100, 100, 100);
wrong.add(w);
wrong.setAlwaysOnTop(true);
wrong.setVisible(true);
}
}
else if(obj==registerText){
//唤起注册程序
System.out.println("点击的是注册按钮");
new Register(AppJFrame.this);
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void insertUpdate(DocumentEvent e) {
}
@Override
public void removeUpdate(DocumentEvent e) {
}
@Override
public void changedUpdate(DocumentEvent e) {
}
}
此部分代码运行展示:
(二)功能主页面的搭建
主页面是通过JavaSwing当中的按钮添加来实现的,由于此次课题设计本身并没有多少时间(作者还需要进行其他科目的复习和考试),所以界面美化并没有花心思去做,就连老师看到之后也觉得这样的界面太过于简陋,没有专业性。
这段程序当中没有什么核心内容,就不做过多赘述
//OperationPage
package java课题设计.功能类;
import java课题设计.功能类.Seek.SeekStudent;
import java课题设计.功能类.修改学生或者删除学生.ReviseStudent;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
//该类用于绘制登录之后对学生数据进行操作的画面以及书写关于选择操作的代码逻辑
public class OperationPage extends JFrame implements MouseListener {
JButton addstudent=new JButton("添加学生成绩");
JButton seekstudent=new JButton("查找学生");
JButton revise =new JButton("修改或删除学生");
JButton stats=new JButton("生成报表");
JButton randomstudent=new JButton("随机学生数据");
Font f=new Font("宋体",Font.BOLD,30);
public OperationPage() {
extracted();
initImage();
this.setVisible(true);
}
private void extracted(){
//设置登录界面的长和宽
this.setSize(800,750);
this.setTitle("操作页面");
this.setAlwaysOnTop(true);
this.setDefaultCloseOperation(3);
this.setLayout(null);
this.setLocationRelativeTo(null);
//添加监听事件
addstudent.addMouseListener(this);
seekstudent.addMouseListener(this);
revise.addMouseListener(this);
stats.addMouseListener(this);
randomstudent.addMouseListener(this);
}
private void initImage(){
//绘制总标题
Font font=new Font("宋体",Font.BOLD,30);
JLabel tetle=new JLabel("请选择你要进行的操作");
tetle.setBounds(250,10,400,150);
tetle.setFont(font);
this.getContentPane().add(tetle);
//添加 添加学生按钮选择
addstudent.setBounds(50,150,307,113);
addstudent.setFont(f);
this.getContentPane().add(addstudent);
//添加查找学生按钮
seekstudent.setBounds(50,310,307,113);
seekstudent.setFont(f);
this.getContentPane().add(seekstudent);
//添加录入学生成绩按钮
revise.setBounds(440,150,307,113);
revise.setFont(f);
this.getContentPane().add(revise);
//添加生成报表按钮
stats.setBounds(440,310,307,113);
stats.setFont(f);
this.getContentPane().add(stats);
//添加随机生成学生数据按钮
randomstudent.setBounds(245,470,322,142);
randomstudent.setFont(f);
this.getContentPane().add(randomstudent);
}
@Override
public void mouseClicked(MouseEvent e) {
Object obj=e.getSource();
if(obj==addstudent){
//添加学生信息
System.out.println("我点击了添加学生信息");
//调用添加学生成绩类,并关闭当前窗口
new AddStudent(this);
this.setVisible(false);
}
else if(obj==seekstudent){
System.out.println("我点击了查找学生信息按钮");
//打开添加学生窗口,关闭当前窗口
new SeekStudent(this);
this.setVisible(false);
}
else if(obj== revise){
System.out.println("我点击了修改或删除学生信息按钮");
new ReviseStudent();
this.setVisible(false);
}
else if(obj==stats){
System.out.println("我点击了生成报表统计按钮");
try {
new GenerateTable(this);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
this.setVisible(false);
}
else if(obj==randomstudent){
System.out.println("我点击了随机学生数据按钮");
//调用生成学生数据类,并写入文件和展示表格
new 学生数据写入文件();
this.setVisible(false);
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
(三) 添加学生信息功能
本功能的实现是使用焦点监听器来获取用户在文本文件当中输入的数据,并且保存到文本文件当中,由于在用户使用过程中,添加完成之后需要返回上一级界面,不然用户还需要重新登陆,就会显得非常繁琐,所以在这个AddStudent类中构造方法当中传入一个父类的JFrame窗口来实现功能完成之后的窗口返回,设立一个Window窗口监听器来监视窗口的关闭状态,当窗口关闭时调用这个重写方法来实现对上一级窗口的重新调用
而随机学号则是使用了工具类RandomID类中的随机学号方法来实现自动生成不重复的随机学号,此类在下面的工具包中会有
package java课题设计.功能类;
import java课题设计.工具类.RandomID;
import javax.print.Doc;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.*;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
//该类用于登陆之选择添加学生到数据库中的操作页面绘制以及代码逻辑
public class AddStudent extends JFrame implements MouseListener, DocumentListener {
private JFrame pre;
JTextField nametext=new JTextField();
JTextField birthname=new JTextField();
JButton boy=new JButton("男");
JButton gril=new JButton("女");
JButton sure = new JButton("确认添加");
String stuname;
String sex;
String birthDate;
String s;
public AddStudent(JFrame pre){
extracted();
iniImage();
this.pre=pre;
this.setVisible(true);
}
public void extracted(){
this.setSize(700,500);//设置窗口大小
this.setTitle("添加学生信息");//设置窗口标题
this.setAlwaysOnTop(true);//设置此窗口总是位于其他窗口之上
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//设置关闭方式,3为关闭当前窗口则结束程序运行
this.setLayout(null);//设置布局模式,null模式表示不受管理器设置管理,所有窗口的显示都由x,y显示
this.setLocationRelativeTo(null);//设置窗口显示在中间位置
//添加监听事件
nametext.addMouseListener(this);
birthname.addMouseListener(this);
sure.addMouseListener(this);
gril.addMouseListener(this);
boy.addMouseListener(this);
}
public void iniImage(){
//添加学号输入提示
JLabel id=new JLabel("学号");
id.setBounds(180,75,300,45);
Font f=new Font("宋体",Font.BOLD,30);
id.setFont(f);
this.getContentPane().add(id);
//添加学号输入框
//JTextField idtext=new JTextField();
//idtext.setBounds(280,80,250,35);
//this.getContentPane().add(idtext);
//随机生成学号并且记录
RandomID randomID=new RandomID();
int sid= randomID.getid();
s=new String(String.valueOf(sid));
JTextField stuid=new JTextField(s);
stuid.setBounds(280,80,250,35);
stuid.setFont(f);
this.getContentPane().add(stuid);
//添加学生姓名输入提示
JLabel name=new JLabel("姓名");
name.setBounds(180,150,300,45);
name.setFont(f);
this.getContentPane().add(name);
//添加姓名输入框
nametext.setBounds(280,155,250,35);
this.getContentPane().add(nametext);
//获取到用户输入的姓名
nametext.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
stuname=nametext.getText();
}
});
//添加性别输入提示
JLabel sex=new JLabel("性别");
sex.setBounds(180,225,300,45);
sex.setFont(f);
this.getContentPane().add(sex);
//添加性别按钮选择
boy.setBounds(280,225,70,45);
boy.setFont(f);
this.getContentPane().add(boy);
gril.setBounds(380,225,70,45);
gril.setFont(f);
this.getContentPane().add(gril);
//添加出生日期输入提示
JLabel birth=new JLabel("出生日期");
birth.setBounds(130,305,300,45);
birth.setFont(f);
this.getContentPane().add(birth);
//添加出生日期输入框
birthname.setBounds(280,310,250,35);
this.getContentPane().add(birthname);
//添加监听器获取用户输入的出生日期
birthname.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
birthDate = birthname.getText();
//System.out.println("输入了出生日期");
}
@Override
public void removeUpdate(DocumentEvent e) {
birthDate = birthname.getText();
//System.out.println("输入了出生日期");
}
@Override
public void changedUpdate(DocumentEvent e) {
birthDate = birthname.getText();
//System.out.println("输入了出生日期");
}
});
//添加确定添加学生按钮
sure.setFont(f);
sure.setBounds(250,370,180,45);
this.getContentPane().add(sure);
}
public void write() throws IOException {
char[] b=birthDate.toCharArray();
char[] c=new char[b.length+3];
for(int i=0,j=0;i<b.length;){
if(j==4||j==7||j==10) {c[j]='-';j++;}
else {c[j]=b[i];j++;i++;}
}
birthDate=new String(c,0,c.length-1);
String str=stuname+"\t"+sex+"\t"+s+"\t"+"0\t"+"0\t"+"0\t"+birthDate+"\n";
FileOutputStream fw=new FileOutputStream("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\StudentManagementSystem\\src\\java课题设计\\学生数据.txt",true);
byte[] byt = str.getBytes();
fw.write(byt);
System.out.println("添加成功");
System.out.println(str);
fw.close();
}
@Override
protected void processWindowEvent(WindowEvent e){
super.processWindowEvent(e);
if(e.getID()==WindowEvent.WINDOW_CLOSED){
this.setVisible(false);//隐藏当前窗口
pre.setVisible(true);//显示上一级窗口
}
}
@Override
public void mouseClicked(MouseEvent e) {
Object obj=e.getSource();
if(obj==sure){
System.out.println("点击了完成按钮");
//调用方法写入数据
try {
write();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
//回到选择操作的窗口
pre.setVisible(true);
//关闭当前窗口
this.setVisible(false);
}
else if(obj==gril){
sex="女";
System.out.println("性别为女");
}
else if(obj==boy){
System.out.println("性别为男");
sex="男";
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void insertUpdate(DocumentEvent e) {
}
@Override
public void removeUpdate(DocumentEvent e) {
}
@Override
public void changedUpdate(DocumentEvent e) {
}
}
(四)修改或者删除程序
该类用于修改或删除学生功能的实现,由于java本身自带的类与方法中没有能直接删除文本文件当中某一行的操作实现(也有可能是我技不如人,不知道有这个方法),所以在修改和删除方法当中我们创立一个临时文件,然后把除了要删除的那一行信息其他的信息都重新写入到临时文件当中去,最后把源文件删除,把临时文件重命名为原来的文件名即可,这个方法在DelStudent类中有所实现
当然如果我使用数据库(例如MySQL数据库)来进行数据的保存,就不需要使用这样繁琐的方法来处理数据,奈何期末复习周,属实没有时间在进行数据库的学习和使用了,如果读者有需要可以私聊我,我后续也会重新发布这个项目的数据库版本供大家参考交流,也欢迎大佬们来指正错误
//DelID
package java课题设计.功能类.修改学生或者删除学生;
import java课题设计.工具类.Seek;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
public class DelID extends JFrame implements MouseListener {
Font f=new Font("宋体",Font.BOLD,25);
String id;
private JFrame pre;
private JTable table;
JButton seek=new JButton("查找");
public DelID() {
extracted();
initImage();
this.setVisible(true);
}
public void initImage(){
//添加输入学号提示框
JLabel ID=new JLabel("请输入你要删除的学号");
ID.setFont(f);
ID.setBounds(75,40,400,100);
this.getContentPane().add(ID);
//输入学号输入文本框
JTextField IDtext=new JTextField();
IDtext.setBounds(75,140,250,50);
this.getContentPane().add(IDtext);
//添加监听器
IDtext.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
id = IDtext.getText();
}
@Override
public void removeUpdate(DocumentEvent e) {
id = IDtext.getText();
}
@Override
public void changedUpdate(DocumentEvent e) {
id = IDtext.getText();
}
});
//添加查找按钮
seek.setFont(f);
seek.setBounds(100,220,140,45);
this.getContentPane().add(seek);
}
public void extracted(){
//设置登录界面的长和宽
this.setSize(500,450);
this.setTitle("请输入你要删除的学生的学号");
this.setAlwaysOnTop(true);
this.setDefaultCloseOperation(3);
this.setLayout(null);
this.setLocationRelativeTo(null);
//绑定监听器
seek.addMouseListener(this);
}
public void chazhao(String id) throws IOException {
boolean flag= Seek.seek3(id);
if(flag==false){
//说明找到了这个学号的学生
//new DelStudent();
//this.setVisible(false);
//调用删除方法直接在文件中对该学号的学生进行删除
DelStudent.removeLine("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\StudentManagementSystem\\src\\java课题设计\\学生数据.txt",id);
}
else {
//跳出弹窗查找失败
System.out.println("查找失败");
JDialog wrong=new JDialog(this,null,true);
wrong.setBounds(550,300,300,200);
wrong.setTitle("未找到该学生");
JLabel w=new JLabel("未找到该学生");
w.setFont(new Font("宋体",Font.BOLD,18));
w.setBounds(100,100,100,100);
wrong.add(w);
wrong.setAlwaysOnTop(true);
wrong.setVisible(true);
}
}
@Override
public void mouseClicked(MouseEvent e) {
if(e.getSource()==seek){
System.out.println("点击了查找按钮");
try {
chazhao(id);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
//DelStudent
package java课题设计.功能类.修改学生或者删除学生;
import java.io.*;
public class DelStudent {
public static void removeLine(String filename, String targetLine) throws IOException {
File targetFile = new File(filename);
File tmpFile = new File("tmp.txt");
BufferedReader reader = new BufferedReader(new FileReader(targetFile));
BufferedWriter writer = new BufferedWriter(new FileWriter(tmpFile));
String currentLine;
boolean found = false;
while ((currentLine = reader.readLine()) != null) {
if (!currentLine.trim().equals(targetLine)) { // 如果当前行不是目标行,则写入到临时文件中
writer.write(currentLine);
writer.newLine();
} else {
found = true;
}
}
if (!found) { // 没有找到目标行,抛出异常
throw new IllegalArgumentException("Target line not found");
}
reader.close();
writer.close();
if (targetFile.delete()) { // 删除原文件
if (!tmpFile.renameTo(targetFile)) { // 重命名临时文件
throw new IOException("Failed to rename file");
}
} else {
throw new IOException("Failed to delete file");
}
}
}
//Revise
package java课题设计.功能类.修改学生或者删除学生;
import java课题设计.工具类.RandomID;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
//此类用于学生信息的修改(不能修改学号)
public class Revise extends JFrame implements MouseListener,DocumentListener {
Font f=new Font("宋体",Font.BOLD,30);
private JFrame pre;
JTextField nametext=new JTextField();
JTextField birthname=new JTextField();
JButton boy=new JButton("男");
JButton gril=new JButton("女");
JButton sure = new JButton("确认修改");
String stuname;
String sex;
String birthDate;
String s;
String PE,Java,Math;
JLabel PEs=new JLabel("体育成绩");
JLabel Javas=new JLabel("Java成绩");
JLabel Maths=new JLabel("数学成绩");
JTextField PETEXT=new JTextField();
JTextField MathText=new JTextField();
JTextField JavaText=new JTextField();
String PEgrade,Javagrade,Mathgrade;
public Revise() {
extracted();
iniImage();
this.setVisible(true);
}
public void extracted(){
this.setSize(700,700);//设置窗口大小
this.setTitle("修改学生信息");//设置窗口标题
this.setAlwaysOnTop(true);//设置此窗口总是位于其他窗口之上
this.setDefaultCloseOperation(3);//设置关闭方式,3为关闭当前窗口则结束程序运行
this.setLayout(null);//设置布局模式,null模式表示不受管理器设置管理,所有窗口的显示都由x,y显示
this.setLocationRelativeTo(null);//设置窗口显示在中间位置
sure.addMouseListener(this);
}
public void iniImage(){
//添加学生姓名输入提示
JLabel name=new JLabel("姓名");
name.setBounds(180,100,300,45);
name.setFont(f);
this.getContentPane().add(name);
//添加姓名输入框
nametext.setBounds(280,105,250,35);
this.getContentPane().add(nametext);
//获取到用户输入的姓名
nametext.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
stuname=nametext.getText();
}
});
//添加性别输入提示
JLabel sex=new JLabel("性别");
sex.setBounds(180,175,300,45);
sex.setFont(f);
this.getContentPane().add(sex);
//添加性别按钮选择
boy.setBounds(280,175,70,45);
boy.setFont(f);
this.getContentPane().add(boy);
gril.setBounds(380,175,70,45);
gril.setFont(f);
this.getContentPane().add(gril);
//添加出生日期输入提示
JLabel birth=new JLabel("出生日期");
birth.setBounds(130,255,300,45);
birth.setFont(f);
this.getContentPane().add(birth);
//添加出生日期输入框
birthname.setBounds(280,260,250,35);
this.getContentPane().add(birthname);
//添加监听器获取用户输入的出生日期
birthname.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
birthDate=birthname.getText();
}
});
//添加体育成绩提示框
PEs.setFont(f);
PEs.setBounds(130,335,300,45);
this.getContentPane().add(PEs);
//添加体育成绩文本框
PETEXT.setBounds(280,335,250,35);
this.getContentPane().add(PETEXT);
PETEXT.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
PEgrade=PETEXT.getText();
}
});
//添加Java成绩提示框
Javas.setFont(f);
Javas.setBounds(130,405,300,45);
this.getContentPane().add(Javas);
//添加体育成绩文本框
JavaText.setBounds(280,405,250,35);
this.getContentPane().add(JavaText);
JavaText.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
Javagrade=JavaText.getText();
}
});
//添加数学成绩提示框
Maths.setFont(f);
Maths.setBounds(130,475,300,45);
this.getContentPane().add(Maths);
//添加体育成绩文本框
MathText.setBounds(280,475,250,35);
this.getContentPane().add(MathText);
MathText.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
Mathgrade = MathText.getText();
//System.out.println("输入了出生日期");
}
@Override
public void removeUpdate(DocumentEvent e) {
Mathgrade = MathText.getText();
//System.out.println("输入了出生日期");
}
@Override
public void changedUpdate(DocumentEvent e) {
Mathgrade = MathText.getText();
//System.out.println("输入了出生日期");
}
});
//添加确定添加学生按钮
sure.setFont(f);
sure.setBounds(250,545,180,45);
this.getContentPane().add(sure);
}
@Override
public void mouseClicked(MouseEvent e) {
if(e.getSource()==sure){
System.out.println("点击了修改按钮");
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void insertUpdate(DocumentEvent e) {
}
@Override
public void removeUpdate(DocumentEvent e) {
}
@Override
public void changedUpdate(DocumentEvent e) {
}
}
//ReviseStudent
package java课题设计.功能类.修改学生或者删除学生;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
//本类用于修改和删除学生数据(除了学号)
public class ReviseStudent extends JFrame implements MouseListener {
Font f=new Font("宋体",Font.BOLD,25);
JButton ReviseStu=new JButton("修改学生信息");
JButton DelStu=new JButton("删除某个学生");
public ReviseStudent() {
extracted();
image();
this.setVisible(true);
}
public void extracted(){
this.setSize(488,430);
this.setTitle("选择查找方式");
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
this.setLayout(null);
this.setAlwaysOnTop(true);
//绑定监听事件
DelStu.addMouseListener(this);
ReviseStu.addMouseListener(this);
}
public void image(){
//添加"修改学生信息"按钮
ReviseStu.setBounds(116,80,247,80);
ReviseStu.setFont(f);
this.getContentPane().add(ReviseStu);
//添加"删除学生"按钮
DelStu.setBounds(116,215,247,80);
DelStu.setFont(f);
this.getContentPane().add(DelStu);
}
@Override
public void mouseClicked(MouseEvent e) {
if(e.getSource()==ReviseStu){
System.out.println("点击了修改学生信息");
//调用修改学生类
new StudentID();
this.setVisible(false);
}
else if(e.getSource()==DelStu){
System.out.println("点击了删除学生按钮");
//调用删除类
new DelID();
this.setVisible(false);
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
//StudentID
package java课题设计.功能类.修改学生或者删除学生;
import java课题设计.工具类.Seek;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
public class StudentID extends JFrame implements MouseListener {
Font f=new Font("宋体",Font.BOLD,25);
String id;
private JFrame pre;
private JTable table;
JButton seek=new JButton("查找");
public StudentID() {
extracted();
initImage();
this.setVisible(true);
}
public void initImage(){
//添加输入学号提示框
JLabel ID=new JLabel("请输入你要查找的学号");
ID.setFont(f);
ID.setBounds(75,40,400,100);
this.getContentPane().add(ID);
//输入学号输入文本框
JTextField IDtext=new JTextField();
IDtext.setBounds(75,140,250,50);
this.getContentPane().add(IDtext);
//添加监听器
IDtext.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
id = IDtext.getText();
}
@Override
public void removeUpdate(DocumentEvent e) {
id = IDtext.getText();
}
@Override
public void changedUpdate(DocumentEvent e) {
id = IDtext.getText();
}
});
//添加查找按钮
seek.setFont(f);
seek.setBounds(100,220,140,45);
this.getContentPane().add(seek);
}
public void extracted(){
//设置登录界面的长和宽
this.setSize(500,450);
this.setTitle("请输入你要修改的学生的学号");
this.setAlwaysOnTop(true);
this.setDefaultCloseOperation(3);
this.setLayout(null);
this.setLocationRelativeTo(null);
//绑定监听器
seek.addMouseListener(this);
}
public void chazhao(String id) throws IOException {
boolean flag= Seek.seek3(id);
if(flag==false){
//说明找到了这个学号的学生
new Revise();
this.setVisible(false);
}
else {
//跳出弹窗查找失败
System.out.println("查找失败");
JDialog wrong=new JDialog(this,null,true);
wrong.setBounds(550,300,300,200);
wrong.setTitle("未找到该学生");
JLabel w=new JLabel("未找到该学生");
w.setFont(new Font("宋体",Font.BOLD,18));
w.setBounds(100,100,100,100);
wrong.add(w);
wrong.setAlwaysOnTop(true);
wrong.setVisible(true);
}
}
@Override
public void mouseClicked(MouseEvent e) {
if(e.getSource()==seek){
System.out.println("点击了查找按钮");
try {
chazhao(id);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
(五)查找学生功能
此类用户查找学生功能的代码实现,查找学生功能使用了工具类中的Seek查找类,可以通过学号和姓名查找学生,并把符合条件的学生显示到一个表格当中,以供用户来对学生信息进行修改等操作,在按姓名查找过程中使用了模糊搜索功能,具体是使用正则表达式来实现模糊搜索这个功能的
//SeekStudent
package java课题设计.功能类.Seek;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowEvent;
//搜索学生类
public class SeekStudent extends JFrame implements MouseListener {
Font f =new Font("宋体",Font.BOLD,25);
JButton SeekName = new JButton("按姓名查找");
JButton SeekID = new JButton("按学号查找");
JFrame pre;
public SeekStudent(JFrame pre){
extracted();
image();
this.setVisible(true);
}
public void extracted(){
this.setSize(488,430);
this.setTitle("选择查找方式");
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
this.setLayout(null);
this.setAlwaysOnTop(true);
//绑定监听事件
SeekID.addMouseListener(this);
SeekName.addMouseListener(this);
}
public void image(){
//添加"按照学号查找"按钮
SeekID.setBounds(116,80,247,80);
SeekID.setFont(f);
this.getContentPane().add(SeekID);
//添加"按照姓名查找按钮"
SeekName.setBounds(116,215,247,80);
SeekName.setFont(f);
this.getContentPane().add(SeekName);
}
@Override
protected void processWindowEvent(WindowEvent e){
super.processWindowEvent(e);
if(e.getID()==WindowEvent.WINDOW_CLOSED){
this.setVisible(false);//隐藏当前窗口
pre.setVisible(true);//显示上一级窗口
}
}
@Override
public void mouseClicked(MouseEvent e) {
if(e.getSource()==SeekID){
//打开查找ID界面,关闭当前界面
//System.out.println("按照学号查找");
new Seekid(this);
this.setVisible(false);
}
else if(e.getSource()==SeekName){
//打开按姓名查找界面,关闭当前界面
new SeekName(this);
this.setVisible(false);
//System.out.println("按照姓名查找");
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
//SeekName
package java课题设计.功能类.Seek;
import java课题设计.工具类.Seek;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
//本类用于通过学生姓名来搜索学生
public class SeekName extends JFrame implements MouseListener {
Font f=new Font("宋体",Font.BOLD,25);
String name;
private JFrame pre;
private JTable table;
JButton seek=new JButton("查找");
public SeekName(JFrame pre){
extracted();
initImage();
this.setVisible(true);
}
public void initImage(){
//添加输入学号提示框
JLabel Name=new JLabel("请输入你要查找的姓名");
Name.setFont(f);
Name.setBounds(75,40,400,100);
this.getContentPane().add(Name);
//输入学号输入文本框
JTextField Nametext=new JTextField();
Nametext.setBounds(75,140,250,50);
this.getContentPane().add(Nametext);
//添加监听器
Nametext.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
name = Nametext.getText();
}
@Override
public void removeUpdate(DocumentEvent e) {
name = Nametext.getText();
}
@Override
public void changedUpdate(DocumentEvent e) {
name = Nametext.getText();
}
});
//添加查找按钮
seek.setFont(f);
seek.setBounds(100,220,140,45);
this.getContentPane().add(seek);
}
public void extracted(){
//设置登录界面的长和宽
this.setSize(500,450);
this.setTitle("请输入你要查找的学生的姓名");
this.setAlwaysOnTop(true);
this.setDefaultCloseOperation(3);
this.setLayout(null);
this.setLocationRelativeTo(null);
//绑定监听器
seek.addMouseListener(this);
}
public void chazhao(String stuname) throws IOException {
boolean flag= Seek.seek4(stuname);
Seek.seekSize(stuname);
if(flag==false){
List<String> results=new ArrayList<>();
results=Seek.findByName(stuname);
// 创建表格
String[] columnNames = {"学生姓名","性别", "学号", "体育成绩", "Java成绩", "高数成绩", "出生年月日"};
DefaultTableModel model = new DefaultTableModel(columnNames, 1000);
table = new JTable(model);
int i=0;
for (String s : results) {
//将取出的数据进行分割
String[] fields = s.split("\t");
String name = fields[0];
String sex = fields[1];
String sid = fields[2];
String PEscore = fields[3];
String Javascore = fields[4];
String Mathscore = fields[5];
String birthDate = fields[6];
//将学生数据添加到表格中
Object[] rowData = {name,sex, sid, PEscore, Javascore, Mathscore, birthDate};
model.setValueAt(name, i, 0);
model.setValueAt(sex,i,1);
model.setValueAt(sid, i, 2);
model.setValueAt(PEscore, i, 3);
model.setValueAt(Javascore, i, 4);
model.setValueAt(Mathscore, i, 5);
model.setValueAt(birthDate, i, 6);
i++;
}
// 创建 JScrollPane
JScrollPane scrollPane = new JScrollPane(table);
// 创建 JFrame 并展示 UI 界面
JFrame frame = new JFrame("学生信息表");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.add(scrollPane, BorderLayout.CENTER);
frame.setContentPane(contentPane);
frame.pack();
frame.setVisible(true);
}
else{
//跳出弹窗查找失败
System.out.println("查找失败");
JDialog wrong=new JDialog(this,null,true);
wrong.setBounds(550,300,300,200);
wrong.setTitle("未找到该学生");
JLabel w=new JLabel("未找到该学生");
w.setFont(new Font("宋体",Font.BOLD,18));
w.setBounds(100,100,100,100);
wrong.add(w);
wrong.setAlwaysOnTop(true);
wrong.setVisible(true);
}
}
@Override
public void mouseClicked(MouseEvent e) {
if(e.getSource()==seek){
System.out.println("点击了查找按钮");
//调用查找方法
try {
chazhao(name);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
//Seekid
package java课题设计.功能类.Seek;
import java课题设计.工具类.Seek;
import java课题设计.用户类包.Student;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowEvent;
import java.io.IOException;
//此类用于按照学生学号进行搜索学生
public class Seekid extends JFrame implements MouseListener {
Font f=new Font("宋体",Font.BOLD,25);
String id;
private JFrame pre;
private JTable table;
JButton seek=new JButton("查找");
public Seekid(JFrame pre) {
extracted();
initImage();
this.setVisible(true);
}
public void extracted(){
//设置登录界面的长和宽
this.setSize(500,450);
this.setTitle("请输入你要查找的学生的学号");
this.setAlwaysOnTop(true);
this.setDefaultCloseOperation(3);
this.setLayout(null);
this.setLocationRelativeTo(null);
//绑定监听器
seek.addMouseListener(this);
}
public void initImage(){
//添加输入学号提示框
JLabel ID=new JLabel("请输入你要查找的学号");
ID.setFont(f);
ID.setBounds(75,40,400,100);
this.getContentPane().add(ID);
//输入学号输入文本框
JTextField IDtext=new JTextField();
IDtext.setBounds(75,140,250,50);
this.getContentPane().add(IDtext);
//添加监听器
IDtext.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
id = IDtext.getText();
}
@Override
public void removeUpdate(DocumentEvent e) {
id = IDtext.getText();
}
@Override
public void changedUpdate(DocumentEvent e) {
id = IDtext.getText();
}
});
//添加查找按钮
seek.setFont(f);
seek.setBounds(100,220,140,45);
this.getContentPane().add(seek);
}
public void chazhao(String id) throws IOException {
boolean flag=Seek.seek3(id);
if(flag==false){
//说明找到了学号为id的学生
System.out.println("找到了");
//创建表格将其显示出来
String student=Seek.seek2(id);
// 创建表格
String[] columnNames = {"学生姓名","性别", "学号", "体育成绩", "Java成绩", "高数成绩", "出生年月日"};
DefaultTableModel model = new DefaultTableModel(columnNames, 10);
table = new JTable(model);
//将取出的数据进行分割
String[] fields = student.split("\t");
String name = fields[0];
String sex = fields[1];
String sid = fields[2];
double PEscore = Double.parseDouble(fields[3]);
double Javascore = Double.parseDouble(fields[4]);
double Mathscore = Double.parseDouble(fields[5]);
String birthDate = fields[6];
//将学生数据添加到表格中
Object[] rowData = {name,sex, id, String.format("%.0f", PEscore), String.format("%.0f", Javascore), String.format("%.0f", Mathscore), birthDate};
model.setValueAt(name, 1, 0);
model.setValueAt(sex,1,1);
model.setValueAt(id, 1, 2);
model.setValueAt(String.format("%.0f", PEscore), 1, 3);
model.setValueAt(String.format("%.0f", Javascore), 1, 4);
model.setValueAt(String.format("%.0f", Mathscore), 1, 5);
model.setValueAt(birthDate, 1, 6);
// 创建 JScrollPane
JScrollPane scrollPane = new JScrollPane(table);
// 创建 JFrame 并展示 UI 界面
JFrame frame = new JFrame("学生信息表");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.add(scrollPane, BorderLayout.CENTER);
frame.setContentPane(contentPane);
frame.pack();
frame.setVisible(true);
}
else{
//跳出弹窗查找失败
System.out.println("查找失败");
JDialog wrong=new JDialog(this,null,true);
wrong.setBounds(550,300,300,200);
wrong.setTitle("未找到该学生");
JLabel w=new JLabel("未找到该学生");
w.setFont(new Font("宋体",Font.BOLD,18));
w.setBounds(100,100,100,100);
wrong.add(w);
wrong.setAlwaysOnTop(true);
wrong.setVisible(true);
}
}
@Override
protected void processWindowEvent(WindowEvent e){
super.processWindowEvent(e);
if(e.getID()==WindowEvent.WINDOW_CLOSED){
this.setVisible(false);//隐藏当前窗口
pre.setVisible(true);//显示上一级窗口
}
}
@Override
public void mouseClicked(MouseEvent e) {
if(e.getSource()==seek){
System.out.println("点击了查找按钮");
try {
chazhao(id);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
(六)生成报表
本类用于读取文本文件中的学生数据,并且将数据拆分储存到表格当中,但表格只用于供用户看,并不能对数据进行操作
package java课题设计.功能类;
import java课题设计.工具类.Seek;
import java课题设计.工具类.Size;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.WindowEvent;
import java.io.*;
//此类用于读取学生数据并且显示表格
public class GenerateTable extends JFrame implements DocumentListener {
//生成表格功能
private JTable table;
int NUM_OF_STUDENTS;
private JFrame pre;
int length= Seek.SEEK();
public GenerateTable(JFrame pre) throws IOException {
//调用方法来获取文本文件的长度
Size b=new Size();
NUM_OF_STUDENTS=b.getA();
// 创建表格
String[] columnNames = {"学生姓名","性别", "学号", "体育成绩", "Java成绩", "高数成绩", "出生年月日"};
DefaultTableModel model = new DefaultTableModel(columnNames, NUM_OF_STUDENTS);
table = new JTable(model);
BufferedReader reader=new BufferedReader(new FileReader("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\StudentManagementSystem\\src\\java课题设计\\学生数据.txt"));
String line = null;
int i=0;
while((line=reader.readLine())!=null){
//将取出的数据进行分割
String[] fields =line.split("\t");
String name = fields[0];
String sex = fields[1];
String sid = fields[2];
//double PEscore = Double.parseDouble(fields[3]);
String PEscore = fields[3];
//double Javascore = Double.parseDouble(fields[4]);
String Javascore=fields[4];
//double Mathscore = Double.parseDouble(fields[5]);
String Mathscore=fields[5];
String birthDate = fields[6];
//将学生数据添加到表格中
Object[] rowData = {name,sex, sid, PEscore,Javascore, Mathscore, birthDate};
model.setValueAt(name, i, 0);
model.setValueAt(sex,i,1);
model.setValueAt(sid, i, 2);
//model.setValueAt(String.format("%.0f", PEscore), i, 3);
model.setValueAt(PEscore, i, 3);
//model.setValueAt(String.format("%.0f", Javascore), i, 4);
model.setValueAt(Javascore, i, 4);
//model.setValueAt(String.format("%.0f", Mathscore), i, 5);
model.setValueAt(Mathscore, i, 5);
model.setValueAt(birthDate, i, 6);
i++;
}
// 创建 JScrollPane
JScrollPane scrollPane = new JScrollPane(table);
// 创建 JFrame 并展示 UI 界面
JFrame frame = new JFrame("学生信息表");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.add(scrollPane, BorderLayout.CENTER);
frame.setContentPane(contentPane);
frame.pack();
frame.setVisible(true);
}
@Override
protected void processWindowEvent(WindowEvent e){
super.processWindowEvent(e);
if(e.getID()==WindowEvent.WINDOW_CLOSED){
this.setVisible(false);//隐藏当前窗口
pre.setVisible(true);//显示上一级窗口
}
}
@Override
public void insertUpdate(DocumentEvent e) {
}
@Override
public void removeUpdate(DocumentEvent e) {
}
@Override
public void changedUpdate(DocumentEvent e) {
}
}
(七)随机学生数据
由于在要求中有随机生成十万组学生数据来进行测试的要求,所以需要有这么一个类来实现
package java课题设计.功能类;
import java课题设计.工具类.RandomID;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDate;
import java.util.Random;
public class 学生数据写入文件 {
private static final int NUM_OF_STUDENTS = 100;
private JTable table;
public 学生数据写入文件() {
// 设置界面风格
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException |
UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
ranstudent();
}
public void ranstudent() {
// 创建表格
String[] columnNames = {"学生姓名","性别", "学号", "体育成绩", "Java成绩", "高数成绩", "出生年月日"};
DefaultTableModel model = new DefaultTableModel(columnNames, NUM_OF_STUDENTS);
table = new JTable(model);
// 创建一个 FileWriter 和一个 BufferedWriter 对象,用于将数据写入文件
try (FileWriter fw = new FileWriter("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\StudentManagementSystem\\src\\java课题设计\\学生数据.txt", true);
BufferedWriter bw = new BufferedWriter(fw)) {
// 写入文件标题
bw.write("学生姓名\t性别\t学号\t体育成绩\tJava成绩\t高数成绩\t出生年月日");
bw.newLine();
// 生成学生数据并写入文件
Random random = new Random();
for (int i = 0; i < NUM_OF_STUDENTS; i++) {
RandomID randomID = new RandomID();
String sex;
String name = "学生" + (i + 1);
int a=random.nextInt(2);
if(a==0){
sex="男";
}
else sex="女";
int id = randomID.getid();
double PEscore = randomID.getgrade();
double Javascore = randomID.getgrade();
double Mathscore = randomID.getgrade();
LocalDate birthDate = LocalDate.of(2000 - random.nextInt(10), random.nextInt(12) + 1, random.nextInt(28) + 1);
// 将学生数据写入文件
bw.write(name + "\t"+sex+"\t" + id + "\t" + String.format("%.0f", PEscore) + "\t" + String.format("%.0f", Javascore) + "\t" + String.format("%.0f", Mathscore) + "\t" + birthDate.toString());
bw.newLine();
//将学生数据添加到表格中
Object[] rowData = {name,sex, id, String.format("%.0f", PEscore), String.format("%.0f", Javascore), String.format("%.0f", Mathscore), birthDate};
model.setValueAt(name, i, 0);
model.setValueAt(sex,i,1);
model.setValueAt(id, i, 2);
model.setValueAt(String.format("%.0f", PEscore), i, 3);
model.setValueAt(String.format("%.0f", Javascore), i, 4);
model.setValueAt(String.format("%.0f", Mathscore), i, 5);
model.setValueAt(birthDate, i, 6);
}
System.out.println("数据已经成功写入文件!");
} catch (IOException e) {
e.printStackTrace();
}
// 创建 JScrollPane
JScrollPane scrollPane = new JScrollPane(table);
// 创建 JFrame 并展示 UI 界面
JFrame frame = new JFrame("学生信息表");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.add(scrollPane, BorderLayout.CENTER);
frame.setContentPane(contentPane);
frame.pack();
frame.setVisible(true);
}
}
(八)工具包
我将所有工具类都封装到了工具包当中
//Size
package java课题设计.工具类;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Size {
int a=0;
public Size() throws IOException {
BufferedReader reader=new BufferedReader(new FileReader("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\StudentManagementSystem\\src\\java课题设计\\学生数据.txt"));
String line = null;
while((line=reader.readLine())!=null){
a++;
}
}
public int getA(){
return a;
}
}
//Seek
package java课题设计.工具类;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//该类用于在用户进行登录和注册操作的时候对数据库进行的数据检索以及提供方法
public class Seek {
public static boolean seek(String str) throws IOException {
BufferedReader reader=new BufferedReader(new FileReader("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\StudentManagementSystem\\src\\java课题设计\\登陆数据.txt"));
String line=null;
while((line=reader.readLine())!=null) {
//由于在文本文件中,一行的数据会有一些空格或者别的字符导致使用contains无法正确判断是否有重复用户名
//所以使用trim方法来去除空格来进行正确的判断
if (line.trim().contains(str.trim())) return false;
}
return true;
}
public static String seek2(String str) throws IOException {
BufferedReader reader=new BufferedReader(new FileReader("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\StudentManagementSystem\\src\\java课题设计\\学生数据.txt"));
String line=null;
while((line=reader.readLine())!=null) {
//由于在文本文件中,一行的数据会有一些空格或者别的字符导致使用contains无法正确判断是否有重复用户名
//所以使用trim方法来去除空格来进行正确的判断
if (line.trim().contains(str.trim())) return line.trim();
}
return null;
}
public static boolean seek1(String str) throws IOException {
BufferedReader reader=new BufferedReader(new FileReader("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\StudentManagementSystem\\src\\java课题设计\\学生数据.txt"));
String line=null;
while((line=reader.readLine())!=null) {
//由于在文本文件中,一行的数据会有一些空格或者别的字符导致使用contains无法正确判断是否有重复用户名
//所以使用trim方法来去除空格来进行正确的判断
if (line.trim().contains(str.trim())) return false;
}
return true;
}
public static boolean seek3(String str) throws IOException {
BufferedReader reader=new BufferedReader(new FileReader("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\StudentManagementSystem\\src\\java课题设计\\学生数据.txt"));
String line=null;
while((line=reader.readLine())!=null) {
//由于在文本文件中,一行的数据会有一些空格或者别的字符导致使用contains无法正确判断是否有重复用户名
//所以使用trim方法来去除空格来进行正确的判断
line.trim();
String[] fields =line.split("\t");
String name = fields[0];
String sex = fields[1];
String sid = fields[2];
//double PEscore = Double.parseDouble(fields[3]);
//double Javascore = Double.parseDouble(fields[4]);
//double Mathscore = Double.parseDouble(fields[5]);
String birthDate = fields[6];
if(sid.equals(str)) {reader.close();return false;}
}
reader.close();
return true;
}
static int size=0;
public static void seekSize(String str) throws IOException {
BufferedReader reader=new BufferedReader(new FileReader("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\StudentManagementSystem\\src\\java课题设计\\学生数据.txt"));
String line=null;
while((line=reader.readLine())!=null) {
//由于在文本文件中,一行的数据会有一些空格或者别的字符导致使用contains无法正确判断是否有重复用户名
//所以使用trim方法来去除空格来进行正确的判断
line.trim();
String[] fields =line.split("\t");
String name = fields[0];
String sex = fields[1];
String sid = fields[2];
//double PEscore = Double.parseDouble(fields[3]);
//double Javascore = Double.parseDouble(fields[4]);
//double Mathscore = Double.parseDouble(fields[5]);
String birthDate = fields[6];
if(name.equals(str)) {size++;}
}
reader.close();
}
static int c=0;
public static boolean seek4(String str) throws IOException {
BufferedReader reader=new BufferedReader(new FileReader("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\StudentManagementSystem\\src\\java课题设计\\学生数据.txt"));
String line=null;
while((line=reader.readLine())!=null) {
//由于在文本文件中,一行的数据会有一些空格或者别的字符导致使用contains无法正确判断是否有重复用户名
//所以使用trim方法来去除空格来进行正确的判断
line.trim();
String[] fields =line.split("\t");
String name = fields[0];
String sex = fields[1];
String sid = fields[2];
//double PEscore = Double.parseDouble(fields[3]);
//double Javascore = Double.parseDouble(fields[4]);
//double Mathscore = Double.parseDouble(fields[5]);
String birthDate = fields[6];
if(name.contains(str)) {reader.close();return false;}
}
reader.close();
return true;
}
public static List<String> findByName(String name) {
List<String> results = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\StudentManagementSystem\\src\\java课题设计\\学生数据.txt"))) {
String line;
while ((line = br.readLine()) != null) {
// 解析每行记录的姓名、学号和分数
String[] fields = line.split("\t");
String recordName = fields[0];
String recordSex = fields[1];
String recordID = fields[2];
String recordPEscore = fields[3];
String recordJavascore = fields[4];
String recordMathscore = fields[5];
String recordBirth = fields[2];
// 使用正则表达式进行匹配
Pattern pattern = Pattern.compile(".*"+name+".*", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(recordName);
if (matcher.find()) {
// 将符合条件的学生记录添加到结果列表中
results.add(String.format("%s\t%s\t%s\t%s\t%s\t%s\t%s", recordName, recordSex,recordID, recordPEscore,recordJavascore,recordMathscore,recordBirth));
}
}
} catch (IOException e) {
e.printStackTrace();
}
// 返回所有符合条件的学生记录
return results;
}
public static int SEEK() throws IOException {
BufferedReader reader=new BufferedReader(new FileReader("C:\\Users\\邢\\IdeaProjects\\untitled5\\work\\StudentManagementSystem\\src\\java课题设计\\登陆数据.txt"));
int c=0;
String line=null;
while((line=reader.readLine())!=null) {
c++;
}
return c;
}
}
//RandomID
package java课题设计.工具类;
import java.util.*;
//该类用于生成随机ID以及生成各种随机数据的逻辑以及提供方法
public class RandomID {
int id=202200000;
HashSet<Integer> setid =new HashSet<>();
HashSet<Integer> setgrade1 =new HashSet<>();
Random random=new Random();
public int getid(){
int studentid = id + random.nextInt(100000);
//使用集合HashSet中没有重复元素的特点来生成唯一不重复的学号,并且支持同时生成十万组学号数据
while(!setid.add(studentid)){
studentid = id + random.nextInt(100000);
}
return studentid;
}
//随机生成符合正态分布的成绩
public int getgrade(){
double mean = 80; // 均值
double std = 20; // 标准差
int min = 0; // 最小值
int max = 100; // 最大值
double value = random.nextGaussian() * std + mean;
while (value < min || value > max) {
value = random.nextGaussian() * std + mean;
}
return (int)value;
}
public String getname(){
int a=(int)'a';
int b=(int)'A';
int namelength=random.nextInt(12);
char[] c=new char[namelength];
for(int i = 0; i < namelength; i++) {
int l = random.nextInt(2);
if(l == 1) {
a = (int)'a' + random.nextInt(26);
c[i] = (char)a;
} else if(l == 0) {
b = (int)'A' + random.nextInt(26);
c[i] = (char)b;
}
}
String name = String.valueOf(c);
return name;
}
}
(九)程序运行主入口
package java课题设计;
import java课题设计.功能类.AppJFrame;
public class StudentMSApp {
//APP运行主入口
public static void main(String[] args) {
new AppJFrame();
}
}
二、各个类的封装存放位置
总结
此次学生信息管理系统一共写了2356行,也是我大一学习过程当中写的最大的项目了,最大的遗憾就是在程序当中没有使用数据库对数据进行操作,后续我会把数据库版本也发到我的CSDN当中,以供大家交流指正