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对象,不能直接打开文件,因此创建fileinputstream
FileInputStream 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 block
JOptionPane.showMessageDialog(null, "读取学生数据文件错误!请检查文件!");
e.printStackTrace();
}finally {
try {
if(ois!=null)
ois.close();
} catch (Exception e2) {
// TODO: handle exception
e2.printStackTrace();
}
}
}
}
/**
* 添加学生
* @param fruit
* @return 布尔值
*/
public boolean addStudent(Student student) {
// TODO Auto-generated method stub
//判断编号是否已存在,若已存在则返回false
for(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 stub
FileOutputStream 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 stub
String[][] 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 stub
if("".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
//判断学生姓名是否已存在,若已存在则返回true
for(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
//判断学号是否已存在,若已存在则返回true
for(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);//坐标布局或绝对布局
}
@Override
public 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() {
@Override
public 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() {
@Override
public 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() {
@Override
public 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);
}
@Override
public 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();
}
}
写到这里就结束了,如果有不当之处,还请多多指正。