学生信息管理系统简易版(文件IO代替数据库)
一.设计任务及要求
- 设计并实现一个学生信息管理系统
- 要求使用图形用户界面同时用数据库建立1或2个学生信息表。并且能连接数据库并实现查、增、删、改等功能。(这里使用TXT文件代替数据库)
二.需求分析
要求有完整的图形用户界面,界面应该能显示完整的学生信息表格,同时要能对学生信息完成添加、修改、查询、删除四个基本功能。学生信息表格的数据应该保存在数据库里,每次登录系统时即对数据库进行访问和修改,可以考虑用TXT文本代替数据库,在本地包里创建TXT文本,通过IO流进行访问。
三.总体设计
- 界面设计:初步规划为三个界面,一个登陆界面,一个主界面和一个添加信息的界面。登录界面通过在文本框中输入用户名和密码,点击登陆跳转到主界面,点击退出结束程序。主界面显示学生信息的列表,同时具有通过学号查询,修改和删除信息的功能。点击添加和修改,都会跳转到添加信息界面,添加信息界面包含对学生类的七种信息的添加和修改(覆盖)功能。点击返回即返回到主界面。
- 功能实现:封装一个学生信息类,具有学号、姓名、性别、年龄、电话号码、家庭住址、身份证号码等七种属性。编写一个function类,类里包含会用到的增删改查方法,以及读文件和写文件的方法,通过IO流与文件交互。主界面单独编写一个类,在本页面即可完成查找和删除的功能,添加和修改按钮则链接到信息添加界面。在主界面中,学生信息以表格的形式显示出来,表头设置为醒目的颜色便于观察,同时将表格放到滚动面板中,可以避免设置翻页的功能。使用学号进行查找,修改和删除功能时,若无与输入学号相对应的信息,则提示未查找到该学生,请重新输入。若成功执行,则提示修改或删除成功。执行添加功能时,自动跳转到添加页面,对七个信息进行输入,输入完成后点击保存则写入到文件中,同时刷新主界面,如果有信息未录入则默认用“–”代替。
四.代码详细实现
1.启动界面代码,程序唯一的main方法,单独独立出来,养成好习惯
/**
* @ClassName: StudentMessageControlSystem
* @Auther: Drawin
* @Date: 2021/12/25 22:25
* @Description:学生信息管理系统
* 要求:
* 使用图形用户界面
* 用数据库建立 1或 2个学生信息表。 (可以使用 txt 文件代替数据库
* 能连接数据库并实现查询、增、删、改等功能。
*/
public class StudentMessageControlSystem {
public static void main(String[] args) {
new LoginGUi();
}
}
2.Student类代码
public class Student {
private String stuID; /* 学生学号 */
private String name; /* 学生姓名 */
private String sex; /* 学生性别 */
private String age; /* 学生年龄 */
private String callnumber; /* 学生电话号码 */
private String home_place; /* 学生家庭住址,籍贯 */
private String identityID; /* 学生身份证号码 */
public Student(String stuID,String name,String sex,String age,String callnumber,String home_place,String identityID) {
this.stuID=stuID;
this.name=name;
this.sex=sex;
this.age=age;
this.callnumber=callnumber;
this.home_place=home_place;
this.identityID=identityID;
}
public Student() {
}
public String getStuID() {
return this.stuID;
}
public void setStuID(String stuID) {
this.stuID=stuID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
}
public String getSex() {
return this.sex;
}
public void setSex(String sex) {
this.sex=sex;
}
public String getAge() {
return this.age;
}
public void setAge(String age) {
this.age=age;
}
public String getCallnumber() {
return this.callnumber;
}
public void setCallnummber(String callnumber) {
this.callnumber=callnumber;
}
public String getHome_place() {
return this.home_place;
}
public void setHome_place(String home_place) {
this.home_place=home_place;
}
public String getIdentityID() {
return this.identityID;
}
public void setIdentityID(String identityID) {
this.identityID=identityID;
}
//从文件中录入的数据格式 "学号 姓名 性别 年龄 电话号码 家庭住址 身份证号码"
public String fileString()
{
return stuID+" "+name+" "+sex+" "+age+" "+callnumber+" "+home_place+" "+identityID;
}
}
3.MainView主界面代码,包括四个功能按钮,和完整的查找,删除功能
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Vector;
/**
* @ClassName: MainView
* @Auther: Drawin
* @Date: 2021/12/26 19:01
* @Description:主界面,四个功能按钮,和完整的查找,删除功能
*/
public class MainView extends JFrame implements ActionListener {
JTable table = null;
DefaultTableModel model = null;
JPanel jPanelNorth;
JTextField search;
JButton add,delete,modify,seek;
Function act =new Function();
//显示全部学生信息
public MainView() {
//顶部
JLabel jLabel = new JLabel("请输入学号");
jPanelNorth=new JPanel();
jPanelNorth.setLayout(new GridLayout(1, 6));
search =new JTextField(10);
add =new JButton("添加");
delete =new JButton("删除");
modify =new JButton("修改");
seek =new JButton("查找");
jPanelNorth.add(jLabel);
jPanelNorth.add(search);
jPanelNorth.add(seek);
jPanelNorth.add(add);
jPanelNorth.add(modify);
jPanelNorth.add(delete);
//中间的表格
JFrame jf = new JFrame("学生信息管理系统");
// 创建内容面板
JPanel panel = new JPanel();
// 表头(列名)
Vector columnNames=createColumnNames();
Vector data=createTableModelData();
// 创建一个默认的表格模型
model = new DefaultTableModel(data, columnNames);
table = new JTable(model);
table.setPreferredScrollableViewportSize(new Dimension(500, 80));
JScrollPane tablePanel = new JScrollPane(table);
// 设置表格内容颜色
table.setForeground(Color.BLACK); // 字体颜色
table.setFont(new Font(null, Font.PLAIN, 14)); // 字体样式
table.setSelectionForeground(Color.DARK_GRAY); // 选中后字体颜色
table.setSelectionBackground(Color.LIGHT_GRAY); // 选中后字体背景
table.setGridColor(Color.GRAY); // 网格颜色
// 设置表头
table.getTableHeader().setFont(new Font(null, Font.BOLD, 14)); // 设置表头名称字体样式
table.getTableHeader().setForeground(Color.RED); // 设置表头名称字体颜色
table.getTableHeader().setResizingAllowed(false); // 设置不允许手动改变列宽
table.getTableHeader().setReorderingAllowed(false); // 设置不允许拖动重新排序各列
// 设置行高
table.setRowHeight(40);
// 第一列列宽设置为40
table.getColumnModel().getColumn(0).setPreferredWidth(60);
// 设置滚动面板视口大小(超过该大小的行数据,需要拖动滚动条才能看到)
table.setPreferredScrollableViewportSize(new Dimension(640, 320));
// 把表格放到滚动面板中(表头将自动添加到滚动面板顶部)
JScrollPane scrollPane = new JScrollPane(table);
// 添加 滚动面板 到 内容面板
panel.add(scrollPane);
// JScrollPane pane = new JScrollPane(table);
// 设置 内容面板 到 窗口
jf.setContentPane(panel);
jf.pack();
jf.setSize(800, 500);
jf.add(jPanelNorth,BorderLayout.NORTH);
jf.add(scrollPane, BorderLayout.CENTER);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//数据居中显示
DefaultTableCellRenderer r = new DefaultTableCellRenderer();
r.setHorizontalAlignment(JLabel.CENTER);
table.setDefaultRenderer(Object.class, r);
jf.setLocationRelativeTo(null);
int t=table.getRowCount();
if(t<=0){
JOptionPane.showMessageDialog(null, "该系统中还没有录入学生信息!!!");
jf.setVisible(false);
}
else {
jf.setVisible(true);
}
//监听开始
add.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jf.setVisible(false);
new AddView();
}
});
modify.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new AddView();
}
});
seek.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String sID= search.getText();
int flag=act.seek(sID);
if (flag==-1)
{
JOptionPane.showMessageDialog(null, "未查找到该学号的学生!!!\n\n请重新输入");
return;
}
else{
JOptionPane.showMessageDialog(null,act.find(sID));
}
search.setText("");
}
});
delete.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String sID = search.getText(); //获取文本框中内容
int flag=act.seek(sID);
if(flag==-1)
{
JOptionPane.showMessageDialog(null, "未查找到该学号的学生!!!\n\n请重新输入");
}
else {
act.delete(sID);
act.writefile();
JOptionPane.showMessageDialog(null, "删除成功!!!\n");
}
new MainView();
search.setText("");
}
});
}
private Vector createColumnNames() {
Vector columnNames = new Vector();
//columnNames.add("序号");
columnNames.add("学号");
columnNames.add("姓名");
columnNames.add("性别");
columnNames.add("年龄");
columnNames.add("电话号码");
columnNames.add("家庭住址");
columnNames.add("身份证号码");
return columnNames;
}
private Vector createTableModelData() {
Vector data = new Vector();
String t=null;
try{
FileReader f1 = new FileReader("student.txt");
BufferedReader br=new BufferedReader(f1);
//arry.clear();// 清除原数组列表中的数据
int i=0;
while ((t= br.readLine())!= null)
{
String [] s=t.split("\\s+"); //通过空格分割字符串数组
Vector rowData = new Vector();
//rowData.add("i");
rowData.add(s[0]);
rowData.add(s[1]);
rowData.add(s[2]);
rowData.add(s[3]);
rowData.add(s[4]);
rowData.add(s[5]);
rowData.add(s[6]);
data.add(rowData);
// System.out.print(s[6]);
i++;
}
f1.close();
br.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return data;
}
@Override
public void actionPerformed(ActionEvent e) {
}
}
4.登录界面LoginGUI
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* @ClassName: LoginGUi
* @Auther: Drawin
* @Date: 2021/12/26 16:34
* @Description:
*/
public class LoginGUi extends JFrame implements ActionListener {
public LoginGUi(){
JFrame jFrame = new JFrame("登录");
JLabel jLabel1 = new JLabel(" 用户名");
JLabel jLabel2 = new JLabel(" 密码");
JTextField jTextField1 = new JTextField(10);
JTextField jTextField2 = new JTextField(10);
JButton jButton1 = new JButton("登录");
JButton jButton2 = new JButton("退出");
JPanel jPanel1 = new JPanel();
JPanel jPanel2 = new JPanel();
jPanel1.setLayout(new GridLayout(3,2));
jPanel2.setLayout(new GridLayout(1,2));
jPanel1.add(jLabel1);
jPanel1.add(jTextField1);
jPanel1.add(jLabel2);
jPanel1.add(jTextField2);
jPanel2.add(jButton1);
jPanel2.add(jButton2);
jFrame.add(jPanel1, BorderLayout.NORTH);
jFrame.add(jPanel2,BorderLayout.SOUTH);
jFrame.setVisible(true);
jFrame.setSize(350,150);
jFrame.setLocationRelativeTo(null);//在屏幕中间显示
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出关闭JFrame
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jFrame.setVisible(false);
new MainView();
}
});
jButton2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
@Override
public void actionPerformed(ActionEvent e) {
}
}
5.Function类,增删改查功能实现(通过IO)
import java.io.*;
import java.util.ArrayList;
/**
* @ClassName: Function
* @Auther: Drawin
* @Date: 2021/12/26 21:11
* @Description:
*/
public class Function {
ArrayList<Student> arry=new ArrayList<Student>();
public Function() //读文件,将文件中的学生信息存放在数组列表
{
this.readfile();
}
//根据学号查找学生信息,找到返回学号,找不到返回-1
public int seek(String str)
{
for (int i = 0; i<arry.size(); i++)
if (arry.get(i).getStuID().equals(str))
return i;//等于在数组列表的位置
return -1;
}
public String find(String str)
{
for (int i = 0; i<arry.size(); i++)
if (arry.get(i).getStuID().equals(str))
return arry.get(i).fileString();//等于在数组列表的位置
return null;
}
//修改学生信息
public void modify(YYX.Smcs.Student stu) {
int flag=seek(stu.getStuID()); //查找是否存在
arry.set(flag, stu); //替换 flag 处的学生信息
}
// 读文件
public boolean readfile() {
String t=null;
try{
FileReader f1 = new FileReader("student.txt");
BufferedReader br=new BufferedReader(f1);
arry.clear(); // 清除原数组列表中的数据
while ((t= br.readLine())!= null)
{
String [] s=t.split("\\s+");
YYX.Smcs.Student st=new Student (s[0],s[1],s[2],s[3],s[4],s[5],s[6]);
arry.add(st);
System.out.println("读取文件:");
System.out.println(s[0]);
}
f1.close();
br.close();
return true;
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
return false;
}
}
//添加学生信息
public boolean add(YYX.Smcs.Student stu)
{
System.out.println();
System.out.println("要添加的学生");
System.out.println(stu.fileString());
System.out.println();
if (seek(stu.getStuID())!=-1)
return false;
arry.add(stu);
return true;
}
//写,注意每行必须有七个元素,否则读取文件并判断是否存在时会出错时会出错,没有输入的用---代替
public boolean writefile() {
FileWriter fw=null;
BufferedWriter out=null;
try {
fw = new FileWriter("student.txt");
out = new BufferedWriter(fw);
//姓名学号等中间隔一个空格
for(int i=0;i<arry.size();i++){
String s=arry.get(i).fileString();
System.out.println("数组列表数据:");
System.out.println(arry.get(i).fileString());
out.write(s);
out.newLine();
}
out.close();
fw.close();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
//删除学生信息,并且文件中的内容也要修改
public boolean delete(String s) //添加学生记信息
{
int pos=seek(s);
if (pos==-1)
return false;
arry.remove(pos);
return true;
}
}
6.AddView 添加修改页面,第三个界面
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
/**
* @ClassName: AddView
* @Auther: Drawin
* @Date: 2021/12/26 19:52
* @Description:添加,修改功能
*/
public class AddView extends JFrame {
private JPanel jPanelCenter, jPanelSouth;
private JButton addButton, exitButton,modiButton;
private JTextField stuID,name,sex,age,callnumber,home_place,identityID;
Function act =new Function();
public AddView(){
//center
jPanelCenter = new JPanel();
jPanelCenter.setLayout(new GridLayout(7, 2));
jPanelCenter.add(new JLabel(" 学号"));
stuID=new JTextField();
jPanelCenter.add(stuID);
jPanelCenter.add(new JLabel(" 姓名"));
name = new JTextField();
jPanelCenter.add(name);
jPanelCenter.add(new JLabel(" 性别"));
sex = new JTextField();
jPanelCenter.add(sex);
jPanelCenter.add(new JLabel(" 年龄"));
age = new JTextField();
jPanelCenter.add(age);
jPanelCenter.add(new JLabel(" 电话号码"));
callnumber = new JTextField();
jPanelCenter.add(callnumber);
jPanelCenter.add(new JLabel(" 家庭住址"));
home_place = new JTextField();
jPanelCenter.add(home_place);
jPanelCenter.add(new JLabel(" 身份证号码"));
identityID = new JTextField();
jPanelCenter.add(identityID);
//south
jPanelSouth = new JPanel();
jPanelSouth.setLayout(new GridLayout(1, 3));
addButton=new JButton("添加");
exitButton=new JButton("返回");
modiButton=new JButton("修改");
jPanelSouth.add(addButton);
jPanelSouth.add(modiButton);
jPanelSouth.add(exitButton);
this.add(jPanelCenter, BorderLayout.CENTER);
this.add(jPanelSouth, BorderLayout.SOUTH);
//监听
exitButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisible(false);
new MainView();
}
});
Student s1=new Student();
ArrayList<Student> arry=new ArrayList<Student>();
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String sID = stuID.getText(); //获取文本框中内容
if(act.seek(sID)!=-1)
{
JOptionPane.showMessageDialog(null, "该学号对应的学生已经存在!");
//清空文本框
stuID.setText("");
name.setText("");
age.setText("");
callnumber.setText("");
home_place.setText("");
identityID.setText("");
return;
}
String sname = name.getText();
//先判断学号和姓名是否为空,如果为空,直接退出
if(sID.equals("")||sname.equals(""))
{
JOptionPane.showMessageDialog(null, "请重新输入");
return;
}
String sage = age.getText();
if(sage.equals(""))//年龄为空,没有输入
sage="--";
String scall = callnumber.getText();
if(scall.equals(""))
scall="--";
String shome = home_place.getText();
if(shome.equals(""))
shome="--";
String siden = identityID.getText();
if(siden.equals(""))
siden="--";
String ssex=sex.getText();
if (ssex.equals(""))
ssex="--";
s1.setStuID(sID);
s1.setAge(sage);
s1.setName(sname);
s1.setSex(ssex);
s1.setCallnummber(scall);
s1.setHome_place(shome);
s1.setIdentityID(siden);
System.out.println(s1.fileString());
act.add(s1);
act.writefile();
JOptionPane.showMessageDialog(null, "录入成功!!!");
setVisible(false);
new MainView();
}
});
modiButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String sID =stuID.getText(); //获取文本框中内容
int flag=act.seek(sID); //查找是否存在
if (flag==-1)
{
JOptionPane.showMessageDialog(null, "未查找到该学号的学生!!!\n\n请重新输入");
return;
}
else {
JOptionPane.showMessageDialog(null, "确认返回后请输入需要修改后的数据");
}
String sage = age.getText();
if(sage.equals(""))//年龄为空,没有输入
sage="--";
String scall = callnumber.getText();
if(scall.equals(""))
scall="--";
String shome = home_place.getText();
if(shome.equals(""))
shome="--";
String siden = identityID.getText();
if(siden.equals(""))
siden="--";
String ssex=sex.getText();
if (ssex.equals(""))
ssex="--";
String sname = name.getText();
//先判断学号和姓名是否为空,如果为空,直接退出
if(sname.equals(""))
{
JOptionPane.showMessageDialog(null, "录入的学生姓名为空!!!\n\n请重新输入");
return;
}
s1.setStuID(sID);
s1.setAge(sage);
s1.setName(sname);
s1.setSex(ssex);
s1.setCallnummber(scall);
s1.setHome_place(shome);
s1.setIdentityID(siden);
act.modify(s1); //修改
act.writefile();
JOptionPane.showMessageDialog(null, "修改成功!!!");
}
});
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setBounds(500, 300, 400, 270);
setVisible(true);
}
}
五.功能实现截图
1.登录界面
2.管理系统主界面
3.添加修改界面
4.查找功能
5.反馈信息
6.提示信息
六.参考文献
Java课程设计【学生信息管理系统】——振华OPPO
Java+学生信息管理系统+GUI+文件——H千面
学生信息管理系统–(Java+MySQL实现)——__Mzzz