JAVA swing实现简单的学生管理系统

基本功能介绍

本系统实现了一个简单而实用的学生管理系统,通过这个学生管理系统我们可以进行一些基本的学生管理操作,它可以进行简单的添加学生、删除学生、修改学生、查找学生的操作,其中查看学生时可以按照学生学号和名字进行查找并且可以同时进行删除、修改操作。每进行一次操作后可做到对上一步操作的输入框清空,例如在添加学生完成后,各个属性的输入框被清空。在window下直接运行(StudentManage.jar)即可,界面简洁大方得体。它的设计按软件工程的方法进行,系统具有良好的界面、必要的交互信息和较好的健壮性,醒目美观的软件封面,使用人员能快捷简单地进行操作。

系统架构设计

系统采用三层架构模式:
(1)表现层(UI):展现给用户的界面,用户在使用一个系统的时候他的所见所得。
(2)数据访问层(dao):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
(3)实体层(Model):独立于两个层次,用来封装数据,在两层间传送数据。Model不引用各层次,但两个层都会引用Model。

系统类图设计

本项目我设置了五个包分别是com.study.bean、com.study.dao、com.study.test、com.study.daoImpl、com.study.view,其中com.study.bean包中含有Student实体类,com.study.dao包里有StudentDao(主要用来数据访问)类、com.study.Impl包里有StudentDaoImpl类、com.study.test包中有Test(用来测试本项目)类、com.study.view包中有AddStudent(添加学生页面)类、ShowStudents(展示学生信息)类、StudentManage(学生管理系统的主页面)类。

系统功能结构设计

本项目主要实现了添加学生、修改学生信息、查看学生(可以按学生姓名和学号进行查找)以及删除学生的功能。

界面设计

添加学生页面

查看学生页面

删除学生

代码:

实体类:

package com.study.bean;import java.io.Serializable;public class Student implements Serializable{private String id;private String name;private String classname;public Student() {super();// TODO Auto-generated constructor stub}public Student(String id, String name, String classname) {super();this.id = id;this.name = name;this.classname = classname;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getClassname() {return classname;}public void setClassname(String classname) {this.classname = classname;}
}

dao层:

package com.study.dao;import com.study.bean.Student;public interface StudentDao {boolean addStudent(Student s);String[][] getStudends();Student getStudentById(String id);Student getStudentByname(String name);int delStudent(String id);boolean ifexitname(Student student);boolean ifexitid(Student student);void editStudent(Student student,String id);
}

daoImpl层:

package com.study.daoImpl;import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;import javax.swing.JOptionPane;import com.study.bean.Student;
import com.study.dao.StudentDao;public class StudentDaoImpl implements StudentDao{/*** 存放学生信息的数据结构(整个程序中查看、添加、修改和删除都应针对此list对象进行操作)* */private static List<Student> list= new ArrayList<Student>();//用于保存数据的文件名private static String filename="Student";//用于初始化的静态代码块,其作用是找到保存数据的文件并从中读入学生信息到list(仅在类加载时执行一次)static {File file =new File(filename);//如果文件存在,才能进行初始化if (file.exists()) {//对象输入流的参数是inputStream对象,不能直接打开文件,因此创建fileinputstreamFileInputStream fis = null;ObjectInputStream ois = null;  try {fis = new FileInputStream(filename);ois=new ObjectInputStream(fis);//从文件中读入学生数据list =(ArrayList<Student>) ois.readObject();} catch(EOFException e) {e.printStackTrace();list = new ArrayList<>();}catch (Exception e) {// TODO Auto-generated catch blockJOptionPane.showMessageDialog(null, "读取学生数据文件错误!请检查文件!");e.printStackTrace();}finally {try {if(ois!=null)ois.close();} catch (Exception e2) {// TODO: handle exceptione2.printStackTrace();}}}}/*** 添加学生* @param fruit* @return 布尔值*/public boolean addStudent(Student student) {// TODO Auto-generated method stub//判断编号是否已存在,若已存在则返回falsefor(Student s:list) {if(student.getId().equals(s.getId())) {return false;}}//将水果信息加入链表list.add(student);//把链表存入文件save();return true;}private static void save() {// TODO Auto-generated method stubFileOutputStream fos;ObjectOutputStream oos = null;try {fos = new FileOutputStream(filename);oos = new ObjectOutputStream(fos);oos.writeObject(list);} catch (Exception e) {JOptionPane.showMessageDialog(null, "保存学生数据文件错误!请检查文件权限!");e.printStackTrace();} finally {if (oos != null)try {oos.close();} catch (IOException e) {e.printStackTrace();}}}/*** 获取学生所有属性信息* @return 存放学生数据的二维数组*/public String[][] getStudends() {// TODO Auto-generated method stubString[][] data = new String[list.size()][5];int row = 0;  //当前行Iterator<Student> it = list.iterator();while(it.hasNext()) {Student s = it.next();//把学生信息数据转为数组形式data[row][0] = s.getId();data[row][1] = s.getName();data[row][2] = s.getClassname();row++;}return data;}/*** 按照学生学号找学生* @param id* @return Student*/public  Student getStudentById(String id){Student student = null;for(Student s:list) {if(s.getId().equals(id)) {student = s;}}return student;}/*** 按照学生姓名查找学生* @param name* @return Student*/public  Student getStudentByname(String name){Student student = null;for(Student s:list) {if(s.getName().equals(name)) {student = s;}}return student;}/*** 删除学生* @param id* @return */public  int delStudent(String id) {// TODO Auto-generated method stubif("".equals(id)) return 1;Iterator<Student> it = list.iterator();while(it.hasNext()){Student student = it.next();if(id.equals(student.getId())) {it.remove();}}save();return 0;}/*** 查看学生名是否存在* @param student* @return 布尔值*/public  boolean ifexitname(Student student) {// TODO Auto-generated method stub//判断学生姓名是否已存在,若已存在则返回truefor(Student s:list) {if(student.getName().equals(s.getName())) {return true;}}return false;}/*** 查看学号是否存在* @param student* @return 布尔值*/public  boolean ifexitid(Student student) {// TODO Auto-generated method stub//判断学号是否已存在,若已存在则返回truefor(Student s:list) {if(student.getId().equals(s.getId())) {return true;}}return false;}/*** 修改学生信息* @param student* @return 布尔值*/public  void editStudent(Student student,String id) {delStudent(id);addStudent(student);}
}

测试类:

package com.study.test;import com.study.view.StudentManage;public class Test {public static void main(String[] args) {StudentManage studentManage = new StudentManage();studentManage.setVisible(true);studentManage.setTitle("Student Manage");}
}

添加学生:

package com.study.view;import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;import com.study.bean.Student;
import com.study.dao.StudentDao;
import com.study.daoImpl.StudentDaoImpl;public class AddStudent extends JPanel implements ActionListener{JLabel lbid,lbclass,name;JTextField tfid,tfname,classname;JButton jButton;public AddStudent() {setLayout(null);Font font = new Font("黑体", Font.BOLD, 16);lbid=new JLabel("学号:");lbid.setBounds(50,70,100,40);lbid.setFont(font);tfid =new JTextField();tfid.setBounds(100,70,140,40);name=new JLabel("姓名:");name.setBounds(50,170,100,40);name.setFont(font);tfname =new JTextField();tfname.setBounds(100,170,140,40);lbclass=new JLabel("班级:");lbclass.setBounds(50,270,100,40);lbclass.setFont(font);classname =new JTextField();classname.setBounds(100,270,140,40);jButton = new JButton("确定添加");jButton.setBounds(300,170,100,40);jButton.addActionListener(this);add(lbid);add(tfid);add(name);add(tfname);add(lbclass);add(classname);add(jButton);setLayout(null);//坐标布局或绝对布局}@Overridepublic void actionPerformed(ActionEvent e) {//---1.判断必填信息是否完整//判断名称是否为空String name = tfname.getText();if("".equals(name)){JOptionPane.showMessageDialog(this, "学生姓名不能为空!", "错误提示", JOptionPane.ERROR_MESSAGE);return;}//判断学号是否不空String id = tfid.getText();if("".equals(id)){JOptionPane.showMessageDialog(this, "学号不能为空!", "错误提示", JOptionPane.ERROR_MESSAGE);return;}//判断班级名是否不空String classn = classname.getText();if("".equals(classn)){JOptionPane.showMessageDialog(this, "班级不能为空!", "错误提示", JOptionPane.ERROR_MESSAGE);return;}//判断学号是否为数字long num = 0;try{num = Long.parseLong(tfid.getText());} catch(Exception e1){JOptionPane.showMessageDialog(this, "学号应为数字!", "错误提示", JOptionPane.ERROR_MESSAGE);return;}StudentDao studentDao = new StudentDaoImpl();Student student = new Student();student.setId(tfid.getText());student.setName(tfname.getText());student.setClassname(classname.getText());boolean b = studentDao.addStudent(student);if(b == true) {JOptionPane.showMessageDialog(this, "保存学生信息成功!");tfname.setText(null) ;tfid.setText(null);classname.setText(null);}else {JOptionPane.showMessageDialog(this, "学号重复,学生信息未保存!","错误提示",JOptionPane.ERROR_MESSAGE);}}}

查看学生:

package com.study.view;import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;import com.study.bean.Student;
import com.study.dao.StudentDao;
import com.study.daoImpl.StudentDaoImpl;public class ShowStudents extends JPanel {JComboBox<String> comboUnit;JLabel idLabel,namelabel,classnamelabel;JTable table =null;JButton btnDel=null;JButton b,edit;JPanel jPanel,editpanel,westpanel,centerpanel,eastpanel;JTextField jTextField,id,name,classname;//表格标题String [] title= {"学生学号","学生姓名","学生班级"};StudentDao studentDao = new StudentDaoImpl();//获取学生信息(学生信息的列数应与表格标题的数量相同)String [][]data=studentDao.getStudends();public ShowStudents() {jPanel = new JPanel();comboUnit =new JComboBox<String>();//设置下拉列表组件comboUnit.addItem("按姓名查找");comboUnit.addItem("按学号查找");comboUnit.setSelectedIndex(1);jTextField = new JTextField(5);b = new JButton("确定");jPanel.add(comboUnit);jPanel.add(jTextField);jPanel.add(b);add(jPanel,BorderLayout.NORTH);editpanel = new JPanel();idLabel = new JLabel("学号:");id = new JTextField(5);namelabel = new JLabel("姓名:");name = new JTextField(5);classnamelabel = new JLabel("班级:");classname = new JTextField(5);edit = new JButton("确定修改");editpanel.add(idLabel);editpanel.add(id);editpanel.add(namelabel);editpanel.add(name);editpanel.add(classnamelabel);editpanel.add(classname);editpanel.add(edit);add(editpanel,BorderLayout.SOUTH);// TODO Auto-generated constructor stub//1.构造表格对象并显示//(1)创建表格table = new JTable(data,title);//(2)设置表格参数table.getColumnModel().getColumn(2).setPreferredWidth(200); table.getTableHeader().setReorderingAllowed(false);//不可改变列顺序table.getTableHeader().setResizingAllowed(false);//不可改变列宽table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//只能选一行//(3)创建滚动面板并把表格加到该面板中JScrollPane js = new JScrollPane(table);js.setPreferredSize(new Dimension(500, 240));//设置滚动面板的宽度、高度。需要在使用布局管理器的时候使用//(4)把滚动面板加入到窗口add(js,BorderLayout.CENTER);//2.构造删除按钮并显示//(1)创建按钮btnDel = new JButton("删除");//(2)通过匿名内部类为按钮添加事件处理btnDel.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//确认删除的提示//(1)弹出提示框int c = JOptionPane.showConfirmDialog(ShowStudents.this, "确认删除?","确认对话框",JOptionPane.YES_NO_OPTION);//(2)若用户没有选择是,则结束函数的执行。if(c!=JOptionPane.YES_OPTION) {return;}//获取编号//(1)找到表格中被选中的行号(从0开始)int row = table.getSelectedRow();if(row==-1){JOptionPane.showMessageDialog(ShowStudents.this, "已经没有数据可以删除!!","错误提示",JOptionPane.YES_NO_OPTION);return ;}//(2)根据行号找到学生学号(位于该行的首列)String id = data[row][0];//如果编号不为空,则进行删除if(!"".equals(id)){studentDao.delStudent(id);JOptionPane.showMessageDialog(ShowStudents.this, "删除成功!");}//重新显示表格//(1)获取新数据data = studentDao.getStudends();  //(2)构造新的表格模型(用于管理表格数据的对象)DefaultTableModel tableModel = new DefaultTableModel(data, title);//(3)替换原来的表格模型(更新数据的显示)table.setModel(tableModel);//(4)重新调整最后一列的宽度table.getColumnModel().getColumn(2).setPreferredWidth(200); }});//(3)把按钮加入到窗口add(btnDel);b.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {String name = comboUnit.getSelectedItem().toString();if(name.equals("按姓名查找")) {Student student = new Student();student.setName(jTextField.getText());boolean b = studentDao.ifexitname(student);if(b==true) {student = studentDao.getStudentByname(jTextField.getText());data[0][0] = student.getId();data[0][1] = student.getName();data[0][2] = String.valueOf(student.getClassname());DefaultTableModel tableModel = new DefaultTableModel(data, title);//(3)替换原来的表格模型(更新数据的显示)table.setModel(tableModel);//(4)重新调整最后一列的宽度table.getColumnModel().getColumn(2).setPreferredWidth(200); }else {JOptionPane.showMessageDialog(null, "该学生姓名不存在!!","错误提示",JOptionPane.ERROR_MESSAGE);jTextField.setText(null);return;}}if(name.equals("按学号查找")) {Student student = new Student();student.setId(jTextField.getText());boolean b = studentDao.ifexitid(student);if(b==true) {student = studentDao.getStudentById(jTextField.getText());data[0][0] = student.getId();data[0][1] = student.getName();data[0][2] = student.getClassname();DefaultTableModel tableModel = new DefaultTableModel(data, title);//(3)替换原来的表格模型(更新数据的显示)table.setModel(tableModel);//(4)重新调整最后一列的宽度table.getColumnModel().getColumn(2).setPreferredWidth(200); //设置第5列宽度为200}else {JOptionPane.showMessageDialog(null, "该学生学号不存在!!","错误提示",JOptionPane.ERROR_MESSAGE);jTextField.setText(null);return;}}}});edit.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {Student student = new Student();student.setId(id.getText());student.setName(name.getText());student.setClassname(classname.getText());//(1)找到表格中被选中的行号(从0开始)int row = table.getSelectedRow();if(row==-1){JOptionPane.showMessageDialog(ShowStudents.this, "已经没有数据可以修改!!","错误提示",JOptionPane.YES_NO_OPTION);return ;}//(2)根据行号找到学生学号(位于该行的首列)String idnum = data[row][0];//如果编号不为空,则进行修改if(!"".equals(idnum) && !"".equals(student.getId())&& !"".equals(student.getName())&& !"".equals(student.getClassname())){if(studentDao.ifexitid(student) == false) {studentDao.editStudent(student,idnum);JOptionPane.showMessageDialog(ShowStudents.this, "修改成功!");}else {JOptionPane.showMessageDialog(ShowStudents.this, "该学号已存在!!","错误提示",JOptionPane.YES_NO_OPTION);return;}}//重新显示表格//(1)获取新数据data = studentDao.getStudends();  //(2)构造新的表格模型(用于管理表格数据的对象)DefaultTableModel tableModel = new DefaultTableModel(data, title);//(3)替换原来的表格模型(更新数据的显示)table.setModel(tableModel);//(4)重新调整最后一列的宽度table.getColumnModel().getColumn(2).setPreferredWidth(200); }});}}

学生管理类:

package com.study.view;import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.naming.InitialContext;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;public class StudentManage extends JFrame implements ActionListener{JPanel centerPanel;public StudentManage() {init();}private void init() {//美化界面try {for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {if ("Nimbus".equals(info.getName())) {javax.swing.UIManager.setLookAndFeel(info.getClassName());break;}}} catch (ClassNotFoundException ex) {java.util.logging.Logger.getLogger(StudentManage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);} catch (InstantiationException ex) {java.util.logging.Logger.getLogger(StudentManage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);} catch (IllegalAccessException ex) {java.util.logging.Logger.getLogger(StudentManage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);} catch (javax.swing.UnsupportedLookAndFeelException ex) {java.util.logging.Logger.getLogger(StudentManage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);}setIconImage(new ImageIcon("lala.png").getImage());setSize(650,500);setLocationRelativeTo(null);setResizable(false);setDefaultCloseOperation(EXIT_ON_CLOSE);JPanel topjpanel = new JPanel();JLabel toplab = new JLabel("欢迎光临学生管理系统");toplab.setFont(new Font("黑体", Font.BOLD, 30));topjpanel.add(toplab,BorderLayout.CENTER);add(topjpanel, BorderLayout.NORTH);JPanel menupanel = new JPanel();menupanel.setLayout(new GridLayout(3,1));String [] strings = {"添加学生","查看学生","退出程序"};JButton [] buts = new JButton[strings.length];for (int i = 0; i < strings.length; i++) {buts[i] = new JButton(strings[i]);buts[i].addActionListener(this);buts[i].setFont(new Font("黑体", Font.BOLD, 16));menupanel.add(buts[i]);}add(menupanel, BorderLayout.WEST);centerPanel = new JPanel();JLabel centerlab = new JLabel(new ImageIcon("center.jpg"));centerlab.setFont(new Font("宋体", Font.BOLD, 36));centerPanel.add(centerlab);add(centerPanel);}@Overridepublic void actionPerformed(ActionEvent e) {if ("添加学生".equals(e.getActionCommand())) {centerPanel.setVisible(false);centerPanel = new AddStudent();add(centerPanel);}else if ("查看学生".equals(e.getActionCommand())) {centerPanel.setVisible(false);centerPanel = new ShowStudents();add(centerPanel);}else {dispose();}validate();}
}

写到这里就结束了,如果有不当之处,还请多多指正。

JAVA swing实现简单的学生管理系统相关推荐

  1. 2020 java swing jtable 合并_java学生管理系统(界面版)

    运行截图 ​ 项目说明: 本系统界面我个人就从简设计了,本来打算使用windowbuilder插件设计的,可想到使用windowbuilder插件之后导致代码冗余,会影响到代码可读性,可能对小白不友好 ...

  2. java swing+mysql简单零件销售管理系统、订货决策系统

    订货决策系统在新增订单选项,采用mysql数据库,界面简单 免费源代码下载(免费):链接:https://pan.baidu.com/s/1rXUsGcUnisg37ovntX9W2w 密码:nokv ...

  3. java+swing+mysql开发的学生卡管理系统

    基于java+swing+mysql开发的学生卡管理系统. 项目介绍: 系统基于swing图形化界面开发,数据库使用mysql,系统包含学生和管理员,系统功能如下: 学生:注册.登录:查看学生卡消费记 ...

  4. java学习(1):学生管理系统1

    最近又想开始接触java了,写了一个简单的学生管理系统找找感觉,分为三部分,适合萌新使用. 实现初步功能 1建立一个student的java类 import java.util.*; public c ...

  5. Eclipse+Java+Swing+Mysql实现员工信息管理系统

    目录 一.系统介绍 1.开发环境 2.技术选型 3.系统功能 4.数据库 二.系统展示 1.登录系统 2.主页面 3.部门管理 4.职位管理 5.员工管理 三.部分代码 AdminDao.java D ...

  6. 基于Java+Swing+Mysql实现汽车信息管理系统

    基于Java+Swing+Mysql实现汽车信息管理系统 一.系统介绍 二.功能展示 1.登陆 2.车辆信息 3.车辆入库 4.车辆出库 5.车辆查询 6.车辆信息修改 三.数据库 四.其它 1.其他 ...

  7. 基于Java+Swing+mysql餐厅点餐管理系统

    基于Java+Swing+mysql餐厅点餐管理系统 一.系统介绍 二.功能展示 1.用户登陆 2.用户注册(顾客) 3.顾客可以点餐 4.顾客可以查看订单信息 5.顾客可以修改个人信息 6.新增套餐 ...

  8. Android——一个简单的学生管理系统

    一个简单的学生管理系统 效果演示 实现功能总览 代码 效果演示 随手做的一个小玩意,还有很多功能没有完善,倘有疏漏,万望海涵. 实现功能总览 实现了登录.注册.忘记密码.成绩查询.考勤情况.课表查看. ...

  9. 【java毕业设计】基于java+swing+CS的图书销售管理系统GUI设计与实现(毕业论文+程序源码)——图书销售管理系统

    基于java+swing+CS的图书销售管理系统GUI设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+swing+CS的图书销售管理系统GUI设计与实现,文章末尾附有本毕业设计的 ...

最新文章

  1. /etc/profile /etc/profile .bash_profile .bashrc解释
  2. 【机器学习基础】撒花!李宏毅机器学习 2021 版正式开放上线
  3. BZOJ 4551树题解
  4. python管理系统web版_【程序源代码】python web 管理系统开发框架
  5. Rust 学习总结(1)—— 初识 Rust,作为新势力它的前景如何?
  6. dyld 加载 Mach-O
  7. ​30 岁了,依然一事无成
  8. java案例代码4-数组的复制
  9. Javascript特效代码大全(420个)
  10. html自动写对联,html+css纯代码给自己的网站添加对联广告位
  11. 全球与中国乳制品替代杏仁制品市场深度研究分析报告
  12. Java StackTraceElement源码总结 StackTraceElement源码注释翻译和解析中英文对照版
  13. java基于微信小程序的在线学习考试测试系统小程序 uniapp
  14. 多重共线性的解决方法
  15. 常用编码与为何要encode和decode
  16. Promise的含义和用法
  17. 惠普打印机 HP web 服务打不开
  18. 清橙网A1110. 街道
  19. debian宝塔界面安装php失败,debian-live-8.7.1 安装失败求助
  20. 2020-09-22关于dialog 问题

热门文章

  1. 浅析Shazam音乐识别算法:基于Matlab的实现与音乐特征提取的探讨
  2. leetcode螺旋矩阵总结
  3. ADSL接入网的结构
  4. Angr(十)——官方文档(Part1)
  5. Centos8安装软加密狗
  6. [风云人物]风云(中国第一本企业家自传)
  7. 卡尔曼滤波原理和Matlab以及python代码实现
  8. Dataset:机器学习中常用数据集下载链接集合之详细攻略
  9. itoa()函数与atoi()函数
  10. CLRS 3.1渐进记号