java学生管理系统基于java swing实现

项目初衷

该项目是我大一时java的结课大作业,当时因为刚刚做完基础编程实训,实训中做了一个javaswing项目,使用了少量设计模式的知识,运用了工厂模式,单例模式。虽然现在用到javaswing的时候很少,但希望本篇文章会对你有所帮助。

项目需求描述

学生信息管理系统跟踪学生的个人信息。

系统包含了学生所拥有的个人信息。学生的个人信息包括,姓名,学号,性别,专业,兴趣。

在学生信息管理系统中,学生能够:

查看所有的学生的信息

增加,删除,修改学生的兴趣。

查询学生。查询学生的方法有很多种,可以通过,学号,姓名,兴趣查询学生,并显示所要查询的学生的信息。

添加学生。输入学生的姓名,学号,选择年级,输入学生的专业,选择学生性别,选择学生的兴趣,添加学生。

删除学生。删除学生的方式有很多种,可以通过,学号,姓名,兴趣删除学生,先显示学生的信息,再删除学生。

项目设计

类图及简要说明

该系统先用student类创建对象,通过writeandread 和 seek 方法对所要寻找的对象进行搜索,在Jemain方法中进行操作,读取不同的信息,实现对兴趣的增删改,对信息的增删改,以及新建学生,最后通过在main函数中进行操作,进行运行。

    1. 全部文件结构及每个文件的存储结构设计
  1. 文件目录结构

Interests.txt

Students.txt

  1. 例如,其中在students.txt文件中存储了多个student的对象,每个对象的数据存储结构如下:

0003

小丽

2014

管理学

足球--篮球--看电视--

00666

小红

2015

营销

足球--打羽毛球--看小说--

00052

小刚

2013

土木工程

篮球--看电视--看小说--

0004

小青

2017

英语

篮球--看电视--看小说--跑步-----

20216618

王云博

2012

软件工程

足球--

主要功能的代码实现及关键知识点的代码实现

1.项目中如何使用继承,请举出一个代码实现例子并用文字说明

Student

public class Student extends Person{

       String profession;

       String sex;

       int year;

       public Student(String name , int number , String profession , String sex , int year) {

           super(name , number);

           this.profession = profession;

           this.sex = sex;

           this.year = year;

       }

       public void setProfession(String profession) {

           this.profession = profession;

       }

       public String getProfession() {

           return profession;

       }

       public void setSex(String sex) {

           this.sex = sex;

       }

       public String getSex() {

           return sex;

       }

       public void setYear(int year) {

           this.year = year;

       }

       public int getYear() {

           return year;

       }

Student类继承了Person类,继承了Person类中的两个属性,使用无参,带参构造两种方法

使用了set,get方法用来获取对象的属性。

2.项目中如何使用多态,请举出一个代码实现例子并用文字说明

public void write(String x) {

                Person p = new Student();

                p.getName();

                p.getNumber();

                String pathname = "interest.txt";

                try {

                    FileWriter fw = new FileWriter(pathname,true);

                    BufferedWriter bw = new BufferedWriter(fw);

                    bw.write("\r\n");

                    bw.write(x);                  

                    bw.close();

                    fw.close();

                } catch (Exception e) {

                    e.printStackTrace();

                }

   运用多态的方法,对象p既可以运用父类Person方法,也可以运用子类Student的方法,运用多态的方法,提高了程序的拓展性和可维护性。

  1. 项目中如何使用封装,请举出一个代码实现例子并用文字说明
private void login()

        {

            panel1.removeAll();

            JButton button1_1=new JButton("增加删除修改学生兴趣");  

            button1_1.setSize(200, 50);  

            button1_1.setLocation(420, 50);  

            JButton button1_2=new JButton("查询或修改学生信息");  

            button1_2.setSize(200, 50);  

            button1_2.setLocation(420, 150);

            JButton button1_3=new JButton("添加学生信息");  

            button1_3.setSize(200, 50);  

            button1_3.setLocation(420, 250);

            JButton button1_4=new JButton("删除学生信息");  

            button1_4.setSize(200, 50);  

            button1_4.setLocation(420, 350);

            JButton button1_5=new JButton("查看所有学生信息");  

            button1_5.setSize(200, 50);  

            button1_5.setLocation(420, 450);

              button1_1.addActionListener(new ActionListener() {

                    @Override

                    public void actionPerformed(ActionEvent e) {

                       rewrite_insterst();

                    }

                });

              button1_2.addActionListener(new ActionListener() {

                    @Override

                    public void actionPerformed(ActionEvent e) {

                        rewrite_student();

                    }

                });

              button1_3.addActionListener(new ActionListener() {

                    @Override

                    public void actionPerformed(ActionEvent e) {

                       increase_student();

    

                    }

                });

              button1_4.addActionListener(new ActionListener() {

                    @Override

                    public void actionPerformed(ActionEvent e) {

                       delete_student();

   

                    }

                });

              button1_5.addActionListener(new ActionListener() {

                    @Override

                    public void actionPerformed(ActionEvent e) {

                       show_all_students();

                    }

                });

            panel1.add(button1_1);

            panel1.add(button1_2);    

            panel1.add(button1_3);    

            panel1.add(button1_4);    

            panel1.add(button1_5);

            panel1.repaint();

            frame.add(panel1);

            frame.setVisible(true);

        }

        public void rewrite_insterst()

        {

            panel1.removeAll();

            JButton button0=new JButton("返回");

            button0.setSize(100, 50);  

            button0.setLocation(40, 0);

            JButton button2_1=new JButton("增加学生兴趣");

            button2_1.setSize(200, 50);  

            button2_1.setLocation(420, 50);  

            JButton button2_2=new JButton("删除学生兴趣");

            button2_2.setSize(200, 50);  

            button2_2.setLocation(420, 150);

            JButton button2_3=new JButton("修改学生兴趣");

            button2_3.setSize(200, 50);  

            button2_3.setLocation(420, 250);

            button0.addActionListener(new ActionListener() {

                @Override

                public void actionPerformed(ActionEvent e) {

                   login();



                }

            });

            button2_1.addActionListener(new ActionListener() {

                @Override

                public void actionPerformed(ActionEvent e) {

                   increase_interest();



                }

            });

            button2_2.addActionListener(new ActionListener() {

                @Override

                public void actionPerformed(ActionEvent e) {

                   delete_interest();



                }

            });

            button2_3.addActionListener(new ActionListener() {

                @Override

                public void actionPerformed(ActionEvent e) {

                   change_interest();



                }

            });

            panel1.add(button0);

            panel1.add(button2_1);

            panel1.add(button2_2);

            panel1.add(button2_3);

            panel1.repaint();

            frame.setVisible(true);

使用private进行封装,使得内部代码更加强壮,用来限定类的属性和方法的访问权限,可以用来保护代码,防止代码被我们无意破坏。

  1. 项目中如何使用设计模式,请举出一个代码实现例子并用文字说明
public  int change( int n, String newStr)  {

                String[] dd=new String[its.length];

                 int k=0;

                  FileWriter writer = null; 

                    try {    

                        // 打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件,false表示覆盖的方式写入

                        writer = new FileWriter("interest.txt", false);

                        for(int i=0;i<its.length;i++)

                        {

                           if(i==n)

                           {

                               dd[i]=newStr;

                               k++;

                           }

                           else

                           dd[i]=its[i];

                        }

                    BufferedWriter bw = new BufferedWriter(writer);

                    for(int j=0;j<dd.length;j++)

                    {

                       if(j==0)

                           bw.write(dd[j]);

                       else {

                        bw.write("\r\n");

                        bw.write(dd[j]);

                       }

                    }

                        bw.close();

                        writer.close();   

                    } catch (IOException e) {    

                        e.printStackTrace();    

                    } finally {    

                        try {                            

                            if(writer != null){ 

                                writer.close();    

                            } 

                        } catch (IOException e) {    

                            e.printStackTrace();    

                        }    

                    }

                   return k;

运用简单工厂模式,创建对象,实例化对象。工厂方法让类的实例化对象推迟到子类中进行。

  1. 项目中如何使用文件流,请举出一个代码实现例子并用文字说明
public class WriterRead {

     static int increacenum=10;

     static String [][]xueshengs=new String[40][];

     WriterRead()

     {

         read();

     }

     public void read()

    {

            String pathname = "students.txt";

            File file = new File(pathname);

             BufferedReader reader = null; 

             String [] temp = new String [40];

                int line=0; 

                try{ 

                        reader=new BufferedReader(new FileReader(file)); 

                        while((temp[line]=reader.readLine())!=null){ 

                           if(line==0)

                           {

                               char ch=temp[0].charAt(0);

                               int  num = ch - '0';

                               xueshengs=new String[40][num];

                              

                           }

                           else {

                            if(line>=temp.length-1) {

                               temp=increa(temp,temp.length);

                            }

                            String[]  one= temp[line].split("\\|");

                            setxueshengs(one,line-1);

                           }

                            line++; 

                        } 

                      

                } 

                catch(Exception e){ 

                    e.printStackTrace(); 

                } 

        }

        public void write(String x) {

            String pathname = "students.txt";

            try {

                FileWriter fw = new FileWriter(pathname,true);

                BufferedWriter bw = new BufferedWriter(fw);

                bw.write("\r\n");

                bw.write(x);             

                bw.close();

                fw.close();

            } catch (Exception e) {

                e.printStackTrace();

            }

            }



           

       

        String[] increa(String[] a,int num)

        {

            String [] b = new String [num+increacenum];

            xueshengs=new String[num+increacenum][8];

            System.arraycopy(b,0,a,0,num);

            return b;

           

        }

        void setxueshengs(String[] a,int x)

        {

            for(int i=0;i<a.length;i++)

            {

                xueshengs[x][i]=a[i];          }

        }

        String[][] getxueshengs(){

            return xueshengs;

           

        }

        public  int change( int n, String newStr)  {

            read();

            String[][] dd=new String[xueshengs.length][xueshengs[0].length];

             int k=0;

              FileWriter writer = null; 

                try {    

                    // 打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件,false表示覆盖的方式写入

                    writer = new FileWriter("students.txt", false);

                    for(int i=0;i<xueshengs.length;i++)

                    {

                       if(i==n)

                       {

                           String[] kk=newStr.split("\\|");

                           for(int j=0;j<dd[i].length;j++)

                               dd[i][j]=kk[j];

                       }

                       else

                           for(int j=0;j<xueshengs[i].length;j++)

                               dd[i][j]=xueshengs[i][j];

                      

                    }

                BufferedWriter bw = new BufferedWriter(writer);

                bw.write(String.valueOf(xueshengs[0].length));

                int j=0;

               while(dd[j][0]!=null)

                {                

                    bw.write("\r\n");

                    bw.write(dd[j][0]+"|"+dd[j][1]+"|"+dd[j][2]+"|"+dd[j][3]+"|"+dd[j][4]+"|"+dd[j][5]);

                    j++;

                  

                }

                    bw.close();

                    writer.close();   

                } catch (IOException e) {    

                    e.printStackTrace();    

                } finally {    

                    try {                            

                        if(writer != null){ 

                            writer.close();    

                        } 

                    } catch (IOException e) {    

                        e.printStackTrace();    

                    }    

                }

                return k;

}

        public  int delete( int n)  {

            read();

            if(n>xueshengs.length)

                return 0;

            String[][] dd=new String[xueshengs.length-1][xueshengs[0].length];

             int k=0;

              FileWriter writer = null; 

                try {    

                    // 打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件,false表示覆盖的方式写入

                    writer = new FileWriter("students.txt", false);

                    int i=0;

                    int m=0;

                    while(xueshengs[i][0]!=null)

                    {

                      

                       if(i==n)

                       {

                           m--;

                       }

                       else

                           for(int j=0;j<xueshengs[i].length;j++)

                               dd[m][j]=xueshengs[i][j];

                              

                       m++;

                       i++;

                    }

                    System.out.println(dd[0][4]);

                BufferedWriter bw = new BufferedWriter(writer);

                bw.write(Integer.toString(xueshengs[0].length));

                int h=0;

                while(dd[h][0]!=null)

                {                

                    bw.write("\r\n");

                    bw.write(dd[h][0]+"|"+dd[h][1]+"|"+dd[h][2]+"|"+dd[h][3]+"|"+dd[h][4]+"|"+dd[h][5]);

                    h++;

                  

                }

                    bw.close();

                    writer.close();   

                } catch (IOException e) {    

                    e.printStackTrace();    

                } finally {    

                    try {                            

                        if(writer != null){ 

                            writer.close();    

                        } 

                    } catch (IOException e) {    

                        e.printStackTrace();    

                    }    

                }

                return k;

}

        }

使用缓冲流,字节流方法,运用BufferedReader和BufferedWriter方法,缓冲流,将所有的数据缓冲到一起,最终存入文件中。提高了文件的存储效率。先创建read方法,读取数据,从文件中读取并将数据分割存储进入数组。再创建write方法,写入数据,并将数据集合到一起存储到文件中。

  1. 项目中如何使用异常处理,请举出一个代码实现例子并用文字说明
public void increase_interest()

        {

            String s=JOptionPane.showInputDialog("请输入:");

            try

            {

                ints.write(s);

                JOptionPane.showMessageDialog(null, "添加成功","添加学生兴趣",  JOptionPane.CLOSED_OPTION);

            }

             catch(Exception e){ 

                    e.toString(); 

                    JOptionPane.showMessageDialog(null, "添加出错","添加学生兴趣",  JOptionPane.ERROR_MESSAGE);

                } 

        }

        public void delete_interest()

        {

            String s=JOptionPane.showInputDialog("请输入:");

            try

            {

                int k=0;

                for(int i=0;i<interest.length;i++)

                {

                   if(interest[i].equals(s))

                       break;

                   k++;

                }

                int b=ints.change(k,"-");

                if(b==0)

                   JOptionPane.showMessageDialog(null, "兴趣中没有这一项","删除学生兴趣",  JOptionPane.ERROR_MESSAGE);

                else

                JOptionPane.showMessageDialog(null, "删除成功","删除学生兴趣",  JOptionPane.CLOSED_OPTION);

                  

            }

             catch(Exception e){ 

                    e.toString(); 

                    JOptionPane.showMessageDialog(null, "删除出错","删除学生兴趣",  JOptionPane.ERROR_MESSAGE);

                } 

        }

        public void change_interest()

        {

            String s=JOptionPane.showInputDialog("请输入要修改的兴趣:");

            String t=JOptionPane.showInputDialog("请输入要修改后的兴趣:");

            try

            {

                int k=0;

                for(int i=0;i<interest.length;i++)

                {

                   if(interest[i].equals(s))

                       break;

                   k++;

                }

                int b=ints.change(k,t);

                if(b==0)

                   JOptionPane.showMessageDialog(null, "兴趣中没有这一项","改变学生兴趣",  JOptionPane.ERROR_MESSAGE);

                else

                JOptionPane.showMessageDialog(null, "改变成功","改变学生兴趣",  JOptionPane.CLOSED_OPTION);

                  

            }

             catch(Exception e){ 

                    e.toString(); 

                    JOptionPane.showMessageDialog(null, "删除出错","删除学生兴趣",  JOptionPane.ERROR_MESSAGE);

使用try...catch...方法,在界面中输入格式错误,无法增删改兴趣,无法增删改信息等这种异常时,进行替换,用try...catch...方法用来抛出界面中的异常。             } 

 项目过程分析

在选题过程中,我想做一个有关我们学生日常的,所以我做了一个学生管理系统。用于管理学生的个人信息。用于记录学生的学号,姓名,年级,性别,专业,兴趣等个人信息。在编码过程中,我发现不同种类的信息分类存储,设置方法过于麻烦,所以我设置了一个通用方法

public class DataUtils {

    public static Object readObject(File file) throws IOException, ClassNotFoundException {

        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));

        Object obj = objectInputStream.readObject();

        objectInputStream.close();

        return obj;

    }



    public static <T> void writeObject(File file, List<T> list) throws IOException {

        // 对象序列化操作

        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));

        // 将List转换为数组

        // Object[] obj = new Object[list.size()];

        T[] obj = (T[]) new Object[list.size()];

        list.toArray(obj);

        // 写入数据

        objectOutputStream.writeObject(obj);

        objectOutputStream.flush();

        objectOutputStream.close();

    }



    public <T> void writeObject(List<T> list) {

        T[] obj = null;

        list.toArray(obj);

    }

}

修改后的代码如下,采用<T>的方法用于存储,使用一个方法存储String,int等不同种类的信息。

编码结束后在测试代码时,报出了以下异常:

java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2

出现了数组越界的异常,数组指向错误,总数为2,数组索引错误。

将数组的长度+1,即可完成修改,使得程序正常运行。

项目结果展示

  • 主页
  • 查看学生信息
  • 添加学生
  • 删除学生
  • 学号删除学生
  • 关键字删除学生
  • 按兴趣删除学生
  • 增删改查学生兴趣
  • 查找学生
  • 项目创新说明

该项目使用GUI界面,使得程序运行更简洁,更方便。采用了windowbuilder插件,用于设计GUI界面。使用java继承,封装,多态,IO流,异常处理功能。既实现了java的基本功能,又实现了系统的进一步拓展。

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值