javaSE经典综合实例之学生管理系统1.0版---长篇(初学者)

第一次发布时间:2020年12月27日 01:58

第二次发布时间:2020年12月27日 18:46

第三次发布时间:2021年01月02日  15:34

演示视频表格操作界面:

单界面学生管理系统演示过程

演示视频:完整视频(少了演示修改和全部删除)

学生管理系统CRUD单界面版演示过程

源码链接:https://download.csdn.net/download/preston555/14011034

 

文章一共分为三大部分:初级、进阶、图形界面化三个阶段。此为1.0版

目标是进阶到:

2.0版综合应用程序

3.0版javaweb网站开发

4.0版maven项目管理SSM技术的综合应用

文章目录:

        1.学生管理系统的初级阶段01

                   主要知识点:控制语句结构及数组的应用

        2.学生管理系统的初级阶段02

                   主要知识点:面向对象的综合应用

        3.学生管理系统的初级阶段03

                   主要知识点:图形用户化界面、表格组件、以及数据库的简单使用

 

        1.学生管理系统的初级阶段01

1.总体设计:
    (1)首先输入学生人数和学科数目
    (2)其次输入各学科名称和各学生姓名
    (3)输入各学生各学科成绩
    (4)最后显示所有学生所有科目信息以及平均分、总分和排名
2.代码实现与分析:
    (1)输入需要一个Scanner类创建的对象,获取键盘输入内容
         Scanner input=new Scanner(System.in);//表示创建一个读取从控制台输入内容的流对象
    (2)输入学生人数和学生科目,使用上述对象读取从控制台输入的字符即可
         int studentNum=input.nextInt();//表示读取的是一个整数,非整数将报错,这里是学生人数
         int subjectNum=input.nextInt();//表示读取的是一个整数,非整数将报错,这里是科目总数
    (3)输入学生的姓名及各科名称、以及各个学生的各科成绩。使用数组的思想遍历输入
         String[] studentName=new String[studentNum];//创建一个指定学生人数的数组,记录学生的姓名
         String[] subjectName=new String[subjectNum];//创建一个指定科目总数的数组,记录科目的名称
         String[] stuInfo=new String[studentNum];//创建一个指定学生人数的数组,记录各个学生的姓名、科目成绩信息
         int[] scoreSum=new int[studentNum];//创建一个指定学生人数的数组,记录各个学生的各科成绩总和
         String header="序号"+"\t"+"姓名"+"\t";//输出的列名称

    (4)输入学生的姓名及各科名称、以及各个学生的各科成绩。使用循环遍历输入
         //1.输入学生的姓名,同时更新学生的信息
         for(int i=0;i<studentName.length;i++){
            System.out.println("请输入第 "+(i+1)+" 位学生的姓名:");
            String name=input.next();//输入学生的姓名
            studentName[i]=name;//更新存储学生姓名数组
            stuInfo[i] = name+"\t";//更新学生信息数组    
         }

         //2.输入各个科目的,同时更新列名的信息
         for(int i=0;i<subjectName.length;i++){
            System.out.println("请输入第 "+(i+1)+" 科的科目名称:");
            String name=input.next();//输入科目的名称
            subjectName[i]=name;//更新存储科目名称数组
            stuInfo[i] += name+"\t";//更新学生信息数组    
         }       

         //3.输入各个学生的各科科目的成绩,同时更新学生的信息和计算他们的总分
         for(int i=0;i<studentName.length;i++){
             int sum=0;//记录学生的各科成绩之和
             for(int j=0;j<subjectName.length;j++){
                System.out.println("请输入学生"+studentName[i]+"的"+subjectName[j]+"科目成绩:");
                int score=input.nextInt();//输入科目的成绩
                sum += score;//计算总分
                stuInfo[i] += score+"\t";//更新学生的信息  
             }   
             scoreSum[i]=sum;//更新学生总分的信息
             double avg=sum*1.0/subjectName.length;//计算平均分
             DecimalFormat df=new DecimalFormat("0.00");//格式不严格处理,保留两位小数
             avg=Double.valueOf(df.format(avg));//转换为double型
             stuInfo[i] +=sum +"\t"+avg+"\t";
         }   

        //4.所有输入结束,关闭流
        input.close();

    (5)根据总分排序
        //5.根据总分对学生进行排名(使用选择排序从高分到低分,同时更新学生信息数组)
        for (int i = 0; i < scoreSum.length-1; i++) {
            for (int j = i+1; j < scoreSum.length-1; j++) {
                if(scoreSum[i]<scoreSum[j]){
                    //交换比较值
                    int temp=scoreSum[i];
                    scoreSum[i]=scoreSum[j];
                    scoreSum[j]=temp;

                    //同时信息也交换,实现信息跟着总分排序
                    String str=stuInfo[i];
                    stuInfo[i]=stuInfo[j];
                    stuInfo[j]=str;
                }
            }
        }

        //6.输出结果
        System.out.println(header+"总分\t平均分\t排名");//输出列名
        for (int i = 0; i < stuInfo.length; i++) {
            System.out.println(stuInfo[i]+"第"+(i+1)+"名");//输出最后结果
        }


====================================测试过程==============================================
请输入学生的总人数:
3
请输入科目的总数:
3
请输入第 1 位学生的姓名:
语程峰
请输入第 2 位学生的姓名:
杨慧慧
请输入第 3 位学生的姓名:
刘子琪
请输入第 1 科的科目名称:
语文
请输入第 2 科的科目名称:
数学
请输入第 3 科的科目名称:
英语
请输入学生语程峰的语文科目成绩:
98
请输入学生语程峰的数学科目成绩:
98
请输入学生语程峰的英语科目成绩:
96
请输入学生杨慧慧的语文科目成绩:
98
请输入学生杨慧慧的数学科目成绩:
92
请输入学生杨慧慧的英语科目成绩:
96
请输入学生刘子琪的语文科目成绩:
96
请输入学生刘子琪的数学科目成绩:
98
请输入学生刘子琪的英语科目成绩:
90
序号	姓名	语文	数学	英语	总分	平均分	排名
1	语程峰	98	98	96	292	97.33	第1名
2	杨慧慧	98	92	96	286	95.33	第2名
3	刘子琪	96	98	90	284	94.67	第3名

Process finished with exit code 0 

==================================================================================================================================================================================

 

        2.学生管理系统的初级阶段02

1.总体设计要求与目的
    (1)先规定学生的人数
    (2)实现学生的添加和查找
    (3)根据学生编号更新学生信息和删除学生
    (4)根据学生编号输入学生各门成绩
    (5)根据某门成绩或总分排名
    (6)上述所有操作均可循环操作

2.巩固知识点:控制语句结构及数组知识,对象及类的综合使用

3.总体设想与设计
    (1)系统的上限人数由控制台输入人数决定
    (2)整个小实验是分为三大类:
            封装类Student,包含学生的基本信息,包括科目名称与成绩。
            主程序是实现循环操作的项目选择
            方法实现类实现的各个操作的具体方法
    (3)所有输入内容进行验证,查看是否符合要求
    (4)执行顺序大致可以分为:主程序操作选择--->调用处理方法---->调用封装类获取相关对象的数据
    (5)初步学习阶段尽可能少用系统工具类

4.具体实现步骤与思路分析:

    (1)主程序部分实现的是学生人数的输入,这就限定了这个管理系统的学生人数上限,使用输入流获取
         //1.创建输入流对象
        Scanner input=new Scanner(System.in);
        //2.输入学生总人数和科目的总数
        System.out.println("请输入学生的总人数:");
        int studentNum=input.nextInt();
        //3.创建一个指定人数的学生类数组
        Student[] stu=new Student[studentNum];
        //4.创建执行方法类对象
        StudentService stuService=new StudentServiceImpl(stu);

    (2)主程序部分实现的操作的循环使用,使用一个while循环实现,直至选择退出程序才结束
         
         //5.执行选择操作
        while (true) {
            System.out.println("请选择要执行的操作:");
            System.out.println("00:添加一个学生");
            System.out.println("01:根据学号修改学生信息");
            System.out.println("02:根据学号查找学生");
            System.out.println("03:根据性别查找学生");
            System.out.println("04:根据平均分查找学生");
            System.out.println("05:根据学号删除学生");
            System.out.println("06:删除所有学生");
            System.out.println("07:显示所有学生的所有信息");
            System.out.println("08:根据某门成绩进行降序排列显示");
            System.out.println("88:退出系统");

            String choose=input.next();
            if(choose.equals("00")){

            }else if(choose.equals("01")){

            }else if(choose.equals("02")){

            }else if(choose.equals("03")){

            }else if(choose.equals("04")){

            }else if(choose.equals("05")){

            }else if(choose.equals("06")){

            }else if(choose.equals("07")){

            }else if(choose.equals("08")){

            }else if(choose.equals("88")){
                System.out.println("谢谢使用学生管理系统,再见!");
                System.exit(0);
            }else{
                System.out.println("抱歉,没有该选项,请重新选择!");
            }
        }

    (3)封装类设计:Student.java
         属性有:String型 stu_ID,stu_name,stu_gender,rank; Double型 scoreAvg;
                Integer型 stu_age,java,phython,computer,scoreSum
         以及一个处理平均数格式的属性:DecimalFormat df=new DecimalFormat("0.00");
         重写其toString方法,使用"\t"分隔

    (4)主类设计:StudentAdmin.java,就是(1)(2)的主要内容,还有一个方法,实现学生信息修改选项:private String updateStudentByChoosing();

    (5)接口设计:接口:StudentService.java;就是把要执行的方法全部列举一遍

    (6)实现类设计:StudentServiceImpl.java;实现具体的方法

    (7)工具类设计1:Condition.java;各种输入判断以及部分条件判断,以确保执行操作是在合理的要求内实现

    (8)工具类设计2:Regex.java;正则表达式类

==================================================================================================================================================================================

5.接口类:StudentService.java

    //1.添加学生的方法
    void addStudentInformation();

    //2.根据学号修改学生信息
    void updateStudentInformationByStu_ID(String stu_ID);

    //3.根据学号查找学生信息
    void queryStudentInformationByStu_ID(String stu_ID);

    //4.根据性别查找学生
    void queryStudentInformationByStu_gender(String stu_gender);

    //5.根据平均分查找学生
    void queryStudentInformationByScoreAvg(String level,Double scoreAvg);

    //6.根据学号删除学生
    void deleteStudentInformationByStu_ID(String stu_ID);

    //7.删除所有学生
    void deleteAllStudentInformation();

    //8.显示所有学生的所有信息
    void queryAllStudentInformation();

    //9.根据某门成绩进行升序排列显示学生信息
    void queryStudentInformationBySubject(String subject);

==================================================================================================================================================================================

6.接口实现类:StudentServiceImpl.java;逐步实现上面的方法

(1)添加学生分析:
     1)添加的前提条件:数组里面有空位,即至少有一个元素的值是null;
     2)添加的实现原则是:必须是在前一项已经成功添加之后才能添加下一项,如要添加姓名,必须先有学号。依次添加所有对象属性完毕之后,进行总分求和,平均分求值,添加到数组中,更新数组排名,最后打印添加成功的对象信息;
     3)在实现属性添加过程中,实现所有输入的验证,不符合条件的值不允许执行,只能返回主菜单或者退出程序;

(01)添加学生实现过程:
      001.前提条件判断(创建一个判断类,包含所有的方法执行前的判断条件:BeforeAction.java):
          该类具有两个私有属性:private Student[] stu; private Scanner input;
          该类具有一个有参构造:参数是Student[] stu,Scanner input
          方法:public boolean isArrayHasEmpty();
                //1.首先数组为空判断
                if(stu !=null){
                    for(Student student:stu){
                        if(student==null)
                           return true;//有空位返回true
                    }
                }else{
                   return true;//有空位返回true
                }
                return false;//没有空位
      002.进入添加程序时,正式执行添加操作:
          方法:public void addStudentInformation();
          //1.创建一个学生对象,用于存储添加的学生信息
          Student student=new Student();
          //2.添加学号(要求1:学号必须是2020开头,后接任意4位数字;要求2:学号是唯一不可重复)
          //2.0.输入提示信息
          System.out.println("请输入学生的学号:");
          String inStr=input.next();

          //2.1.使用循环,确保一定是在结束该方法或者该程序或者满足条件下才退出循环
          while(true){
            //2.2.判断是否符合输入要求,即必须是2020开头,后接任意4位数字。使用Regex.java类,该类主要进行正则表达式的判断,即判断输入是否符合要求。
            /*
            *  判断学号是否符合输入要求:
            *  //1.正则表达式,表示以2020开头,后面是4位任意数字(后面列正则表达式)
            *  String regex="2020[0-9]{4}";
            *  //2.返回结果值(该方法通用)
            *  return inStr.matches(regex)==true ? true : false;
            *
            */
            if(Regex.isRequiredStuID(inStr)){//符合输入条件
                //2.3.判断学号是否重复(该方法可以抽取出来)
                boolean flag=true;
                if(stu !=null){
                    for(Student student1:stu){
                        if(studnet1 !=null && student1.getStu_ID.equals(inStr)){
                            flag=false;
                            break;
                        }
                    }
                }
                //学号没有重复给予赋值
                if(flag){
                    student.setStu_ID(inStr);
                }else{//学号重复提示消息,询问返回上一级菜单还是退出程序,还是继续输入
                    System.out.println("学号重复,是否继续,返回上一级菜单输入:00;退出程序输入:88;继续输入其它任意键");
                    String choose=input.next();
                    if(choose.equals("00"){
                        return;
                    }else if(choose.equals("88")){
                        System.out.println("谢谢使用学生管理系统,再见!");
                        input.close();//关闭流对象
                        System.exit(0);//退出程序
                    }

                }
            }else{//学号不符合要求,询问返回上一级菜单还是退出程序,还是继续输入
                System.out.println("学号输入不符合要求(要求2020开头,后接4位任意数字),是否继续,返回上一级菜单输入:00;退出程序输入:88;继续输入其它任意键");
                String choose=input.next();
                if(choose.equals("00"){
                    return;
                 }else if(choose.equals("88")){
                    System.out.println("谢谢使用学生管理系统,再见!");
                    input.close();//关闭流对象
                    System.exit(0);//退出程序
                 }
            }
            //循环不退出,重新输入学号验证
            System.out.println("请重新输入学号:");
            inStr=input.next();
           }

          //3.添加姓名、性别、年龄、分数的方法同上,只是没有重复值判断,只有正则表达式判断,以下列举对应的正则表达式:
            //01.姓名正则表达式,表示中文字符,且长度在[2,5]
            String regex = "[\\u4e00-\\u9fa5]{2,5}";

            //02.年龄正则表达式,表示范围[3,60]
            String regex="[3-9]|[1-5][0-9]|60";

            //03.性别正则表达式,表示男或女
            String regex="男|女";

            //04.分数正则表达式,表示范围[0,100]
            String regex="[0-9]|[1-9][0-9]|100";

          //4.总分设置和平均分设置(可以在封装类中处理,也可以单独创建方法,建议使用后者)
             //总分
             int sum=student.getJava()+student.getPython()+student.getComputer();
             student.setScoreSum(sum);
             //平均分
             DecimalFormat df=new DecimalFormat("0.00");//格式设置(该方法有弊端)
             String value=df.format((sum*1.0/3));//获取字符串型的平均数值
             double avg=Double.parseDouble(value);//转成double型数值
             student.setScoreAvg(avg);

          //5.更新数组
             for(int i=0;i<stu.length;i++){
                if(stu[i] ==null){
                    stu[i]=student;
                    break;
                }
             }
          //6.根据总分更新排序(分数由高到低降序)
             //重新排序(选择排序)
            if (stu != null) {
                for (int i = 0; i < stu.length-1; i++) {
                    if(stu[i] !=null) {
                        for (int j = i + 1; j < stu.length - 1; j++) {
                            if(stu[j] !=null) {
                                if (stu[i].getScoreSum() < stu[j].getScoreSum()) {
                                    Student temp = stu[i];
                                    stu[i] = stu[j];
                                    stu[j] = temp;
                                }
                            }
                        }
                    }
                }
            }
          //7.名次设置
             if (stu != null) {
                int ranks=1;
                for (int i = 0; i < stu.length; i++) {
                    if(stu[i] !=null){
                        stu[i].setRank("第"+ranks+"名");
                        ranks++;
                    }
                }
             }
          //8.添加学生程序结束

(02)总结分析:
      (1)上述的各个属性设置均可单独抽取成独立的方法,方便复用。
      (2)在(1)的基础上,可以对学号、姓名、性别、年龄、各科分数的输入判断方法进行更加简洁的优化。如果我们设置的提示信息一样的话,那么就可以简化成如下方法:
        //获取符合要求的返回值,action表示执行哪一样操作,inStr是初始输入判断
        public String getRequiredStringMessage(String action,String inStr);
        while(true){
            if(this.returnRegexBoolean(action,inStr){
                if(action.equals("学号")){
                    //判断学号是否重复(单独抽取成方法,内容和上面01列举的一样)
                    if(this.existSameStuID(inStr)){//重复学号信息提示
                        //信息提示结果处理,判断是否返回上一级菜单(内容和01列举的一样)
                        if(this.returnChooseResult())
                            return "return";//表示结束方法的执行,返回上一级菜单
                    }

                }else{
                    return inStr;//返回符合结果的值
                }
            }else{//输入不符合要求信息提示
                //信息提示结果处理,判断是否返回上一级菜单
                if(this.returnChooseResult())
                   return "return";//表示结束方法的执行,返回上一级菜单
            }
            //默认执行的命令
            System.out.println("请重新输入"+action+":");
            inStr=input.next();
        }
        //获取正则表达式的结果值
        private boolean returnRegexBoolean(String action,String inStr){
            if(action.equals("学号"))
                return Regex.isRequiredStuID(inStr);
            else if(action.equals("姓名"))
                return Regex.isRequiredStuName(inStr);
            else if(action.equals("性别"))
                return Regex.isRequiredStuGender(inStr);
            else if(action.equals("年龄"))
                return Regex.isRequiredStuAge(inStr);
            else
                return Regex.isRequiredStuScore(inStr);
        }

      (3)调用方法修改:
          //2.0.输入提示信息
          System.out.println("请输入学生的学号:");
          String inStr=input.next();    

          //结果返回
          String resultStr=this.getRequiredStringMessage("学号",inStr);
          if(resultStr.equals("return"))
             return;//返回上一级菜单
          else
             student.setStu_ID(resultStr);

          //继续下一个属性的添加,完全类似。修改方法中同样用此种方法   
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(2)根据学号修改学生信息分析:
     1)修改的前提条件:数组不为空,且数组中有该学号的学生信息,所以需对上述两个条件判断,符合才执行修改操作命令;
     2)修改的实现原则是:学号不允许修改,进入修改程序,首先询问修改的项目,根据项目执行修改功能,所有修改都执行更新信息。如果是修改科目分数,则进行总分、平均分更新以及排名更新;
     3)在实现属性修改过程中,实现所有输入的验证,不符合条件的值不允许执行,只能返回上一级菜单或者退出程序;
     4)目标实现的是可以通过命令询问实现循环修改;

(01)修改学生信息实现过程:
      //1.根据传进来的学生编号获取对应的元素对象(也可以把数组中的学生对象传进来做参数)
      Student student=null;
      if(stu !=null){
         for(int i=0;i<stu.length;i++){
            if(stu[i] !=null &&stu[i].getStu_ID().equals(inStr)){
                student=stu[i];
                break;
            }
         }
      }
      //2.询问修改项
      if(student !=null){
        //3.实现循环修改选择
        while(true){
            //4.选择修改的具体项(当然也可以设置默认的从头到尾除学号之外的修改)
            System.out.println("请输入你要修改的项目:00-姓名;11-性别;22-年龄;33-java;44-Python;55-computer)
            String choose=input.next();
            //5.开始修改
            if(choose.equals("00")){//修改姓名
               System.out.println("请输入学生的学号:");
               String inStr=input.next();    

               //结果返回
               String resultStr=this.getRequiredStringMessage("学号",inStr);
               if(resultStr.equals("return")==false)
                 student.setStu_ID(resultStr);               
            }
            ....
            else{
                //除学号之外从头开始修改
            }

            //6.更新对应数组元素(是不是可以优化成传进来下标,直接修改数组元素呢?)
             if(stu !=null){
                 for(int i=0;i<stu.length;i++){
                    if(stu[i] !=null &&stu[i].getStu_ID().equals(inStr)){
                        stu[i]=student;
                        break;
                    }
                 }
              }         
             //7.更新排名(同添加中一样,也可以考虑使用插入的方法,因为之前均都排好序了,只需修改一部分元素的位置即可)
             //8.设置名次(同添加中一样,如果始终保存前面没有空元素,可以在实现排名的时候就设置它的名次,同时更新其它元素的名次)           
           }
      }

以下的(3)到(9)实现方法过于简单或与前面内容几乎重复,不再重复列举。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(3)根据学号查找学生信息分析:
     1)查找的前提条件:数组不为空,且数组中有该学号的学生信息,所以需对上述两个条件判断,符合才执行修改操作命令;
     2)查找的实现原则是:当进入查找程序时,先去数组中查找对应学号的元素,找到打印出来并结束查找程序,找不到给出提示信息;

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(4)根据性别查找学生信息分析:
     1)查找的前提条件:数组不为空,且输入的性别是符合要求的,所以需对上述两个条件判断,符合才执行修改操作命令;
     2)查找的实现原则是:当进入查找程序时,先去数组中查找对应性别的元素,找到打印出来,找不到给出提示信息;

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(5)根据平均分查找学生信息分析:
     1)查找的前提条件:数组不为空,且输入的平均分是符合要求的,所以需对上述两个条件判断,符合才执行修改操作命令;
     2)查找的实现原则是:当进入查找程序时,首先询问查找的具体条件(大于、小于、等于),然后根据条件遍历数组,如果对象不为空且对象的平均分满足条件,就打印出来,如果找不到给出提示信息

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(6)根据学号删除学生信息分析:
     1)删除的前提条件:数组不为空,且输入的学号是符合要求的,在数组中是存在的才执行;
     2)删除的实现原则是:当进入删除程序时,遍历数组,找到学号相等的元素,将元素的值赋值为null即可,将删除信息打印出来,同时提示删除结果

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(7)删除所有学生信息分析:
     1)删除所有学生信息的前提条件:数组不为空;
     2)删除的实现原则是:当进入删除程序时,直接将数组设置为null即可,删除结束给出提示。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(8)显示所有学生的所有信息分析:
     1)前提条件:数组不为空;
     2)实现原则是:当进入程序时,直接遍历数组,将不为null值的元素打印出来即可,如若没有给出提示    

 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(9)根据某门成绩进行升序排列显示学生信息分析:
     1)前提条件:数组不为空;
     2)实现原则是:当进入程序时,首先询问选择的科目,然后对根据科目进行排序(分数由低到高),最后显示出来即可。    
    
演示视频如下:

学生管理系统无界面1.0版详细演示过程

源码链接:https://download.csdn.net/download/preston555/13944070

        3.学生管理系统的初级阶段03

一、设计思路如下:
    1.登陆界面:具有注册、登陆、记住密码、自动登录、找回账户、找回密码、取消功能。需要输入用户名、密码、验证码方可点击登陆
        (1)注册:同意条款方可注册;注册要求用户名唯一性,设置找回密码的问题三个
        (2)登陆:信息填写完全方可验证登陆
        (3)记住密码:如果选择记住密码则将登陆账号信息存到本地中,否则只保存账号信息
        (4)找回账户:通过回答两个注册问题正确回答方可找回
        (5)找回密码:通过账号和两个注册问题正确回答方可找回
        (6)取消:退出       

    2.操作界面:设计为左右界面,左界面显示日历及时间、右界面分上下界面,上界面CRUD命令、下界面表格显示数据
        (1)日历设置:可以查询1900年到2100年任一月的显示(同时显示二十四节气在对应日期下面)
        (2)时间设置:实时系统时间(单行设置,字符串形式:xxxx年xx月xx日 xx:xx:xx
        (3)右界面上部分:CRUD操作指令,其中查找设置为多条件查询,分别有:学号、姓名、年龄、科目分数,平均分、总分,大于、小于,等于条件选择(只针对数值型),什么都没选,默认是查询所有
        (4)添加第一结束之后,询问是否继续添加,继续则不退出添加界面、修改第一次修改结束后可以选择学号继续修改,不选择默认退出
        (5)删除只有根据学号或全部删除两项选择。
        (6)下界面设计,表格是允许进行增删改查的,统一提交时对结果进行判断,存在错误不提交,否则全部提交。      
        (7)表格内容允许导入与导出,导入部分若不和数据库的数据表设计一样,则弹出保存对话框选择保存到本地,若是一样的,弹出对话框询问保存至何处(本地还是数据库),判断条件,符合要求存储到数据库中
二、代码实现过程的简单分析

1.登陆系统

(1)进入登陆界面:采用BorderLayout布局,中间是一个标签,南边是一个进度条

package com.study.main;
......

public class EnterLogin extends JWindow implements Runnable  {


    JProgressBar progress;
    JLabel jll;
    int width, height;

    public static void main(String[] args) {
        new Thread(new EnterLogin()).start();
    }

    public EnterLogin() {
        // 需要保证图片文件在src目录下
        jll = new JLabel(new ImageIcon("image\\index.png"));

        progress = new JProgressBar();
        progress.setStringPainted(true);
        progress.setIndeterminate(false);
        progress.setBorderPainted(false);
        progress.setBackground(Color.darkGray);

        this.add(jll, BorderLayout.NORTH);
        this.add(progress, BorderLayout.SOUTH);

        this.setSize(400, 263);
        width = Toolkit.getDefaultToolkit().getScreenSize().width;
        height = Toolkit.getDefaultToolkit().getScreenSize().height;
        this.setLocation(width / 2 - 200, height / 2 - 150);
        this.setVisible(true);
    }

    @Override
    public void run() {
        // 1.数字变换,进度条显示
        for (int i = 0; i < 101; i++) {
            try {
                Thread.sleep(20);// 2.进度条的数字显示时间间隔
            } catch (Exception e) {
            }
            progress.setValue(i);// 显示进度条
        }
        // 3.进入登录界面,同时关闭该窗口
        new LoginStudentAdmin();
        this.dispose();
    }
}


(2)实现登陆界面的设计:登录界面布局为BorderLayout布局,北中南。北为图片显示、中间是登陆信息输入界面、南是记住密码与操作组件界面。实现鼠标和键盘的接口监听。

package com.study.myPage;

import com.study.bean.User;
import com.study.dialog.FindName;
import com.study.dialog.FindPassword;
import com.study.dialog.RegisterDialog;
import com.study.service.LoginService;
import com.study.service.VerifyCode;
import com.study.utils.DataUtils;
import com.study.utils.MyFont;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class LoginStudentAdmin extends JFrame implements MouseListener,KeyListener {

    //图片界面
    private JPanel imageJPanel;
    //代替图片标签
    private JLabel jb_image;

    //输入界面
    private JPanel loginJPanel;

    //登陆信息标签和输入框
    private JLabel jb_name,jb_password,jb_verify;
    private JTextField jtf_name,jtf_verify,jtf_showCode;

    private JPasswordField jpf_password;
    private JList jlist;

    //找回账号密码标签、验证码切换
    private JLabel jb_findName,jb_findPassword,jb_changeCode;
    //显示未输入内容提示标签
    private JLabel jb_messageName,jb_messagePassword,jb_messageVerify;

    //记住密码和自动登陆
    private JCheckBox jcb_remember,jcb_autoLogin;

    //下部分界面
    private JPanel buttonJPanel;
    //登陆、注册、取消按钮
    private JButton bt_login,bt_register,bt_cancle;

    private String codeShow="";
    private String codeStr="";

    private LoginService loginService=new LoginService();

    //记录初始化信息
    private String[][] datas=null;
    private String[] data_name=null;
    //记住密码的状态
    boolean rememberPassword=false;

    //记录自动登陆状态信息
//    private boolean autoLogin;


    /**
     * 生成验证码及初始化信息
     */
    {
        String code[] =VerifyCode.readVerifyCode();
        codeShow=code[0];
        codeStr=code[1];
        String[] stringsData=DataUtils.readLoginMessage();
        if (stringsData != null) {
            datas=new String[stringsData.length][2];
            data_name=new String[stringsData.length];
            for (int i = 0; i < stringsData.length; i++) {
                String ss[]=stringsData[i].split(",");
                if(ss.length==1){
                    datas[i][0]=ss[0];
                    datas[i][1]="";
                }else if(ss.length==2){
                    datas[i][0]=ss[0];
                    datas[i][1]=ss[1];
                }
                data_name[i]=ss[0];
            }
        }

//        autoLogin=DataUtils.readAutoLoginMessage();
    }

    /**
     * 无参构造执行窗口创建方法
     */
    public LoginStudentAdmin(){
        this.initJFrame();
    }

    /**
     * 上部分图片显示面板
     */
    private void initImageJPanel(){
        imageJPanel=new JPanel();
        jb_image=new JLabel(new ImageIcon("F:\\studyNote\\java\\20201226\\studentsys1.0\\stuedentsys1.0-3\\image\\top.png"));
        jb_image.setSize(this.getWidth(),100);
        imageJPanel.add(jb_image);
    }

    /**
     * 中间部分输入登陆信息界面
     */
    private void initLoginJPanel(){
        loginJPanel=new JPanel();
        loginJPanel.setLayout(null);

        jb_name=new JLabel("账  号:");
        if(datas !=null){//保存有账户名
            jtf_name=new JTextField(datas[datas.length-1][0]);
        }else{
            jtf_name=new JTextField();
        }

        jb_findName=new JLabel("<html><u>找回账号</u></html>");
        jb_messageName=new JLabel();
        jlist=new JList(data_name);

        jb_name.setBounds(50,10,80,30);
        jb_name.setFont(MyFont.font5);
        jtf_name.setBounds(130,10,150,30);
        jb_findName.setBounds(285,10,100,30);
        jb_findName.setForeground(Color.BLUE);
        jb_messageName.setBounds(175,35,120,25);
        jb_messageName.setFont(MyFont.font9);
        jb_messageName.setForeground(Color.RED);
        jlist.setBounds(130,40,130,120);
        jlist.setVisible(false);

        loginJPanel.add(jb_name);
        loginJPanel.add(jtf_name);
        loginJPanel.add(jb_findName);
        loginJPanel.add(jb_messageName);
        loginJPanel.add(jlist);


        jb_password=new JLabel("密  码:");

        if(datas !=null && datas[datas.length-1][1].equals("")==false){//最后一个是记住密码的状态
            rememberPassword=true;//记住密码的状态
            jpf_password=new JPasswordField(datas[datas.length-1][1]);
        }else{
            jpf_password=new JPasswordField();
        }

        jb_findPassword=new JLabel("<html><u>找回密码</u></html>");
        jb_messagePassword=new JLabel();

        jb_password.setBounds(50,60,80,30);
        jb_password.setFont(MyFont.font5);
        jpf_password.setBounds(130,60,150,30);
        jb_findPassword.setBounds(285,60,100,30);
        jb_findPassword.setForeground(Color.BLUE);
        jb_messagePassword.setBounds(175,85,120,25);
        jb_messagePassword.setFont(MyFont.font9);
        jb_messagePassword.setForeground(Color.RED);


        loginJPanel.add(jb_password);
        loginJPanel.add(jpf_password);
        loginJPanel.add(jb_findPassword);
        loginJPanel.add(jb_messagePassword);


        jb_verify=new JLabel("验证码:");
        jtf_verify=new JTextField("");
        jtf_showCode=new JTextField(codeShow);
        jtf_showCode.setFont(MyFont.font9);
        jtf_showCode.setEditable(false);
        jtf_showCode.setHorizontalAlignment(JTextField.CENTER);
        jb_changeCode=new JLabel("<html><u>更换一张</u></html>");
        jb_messageVerify=new JLabel();

        jb_verify.setBounds(50,110,80,30);
        jb_verify.setFont(MyFont.font5);
        jtf_verify.setBounds(130,110,70,30);
        jtf_showCode.setBounds(210,110,70,30);
        jb_changeCode.setBounds(285,110,100,30);
        jb_changeCode.setForeground(Color.BLUE);
        jb_messageVerify.setBounds(175,135,120,25);
        jb_messageVerify.setFont(MyFont.font9);
        jb_messageVerify.setForeground(Color.RED);



        loginJPanel.add(jb_verify);
        loginJPanel.add(jtf_verify);
        loginJPanel.add(jtf_showCode);
        loginJPanel.add(jb_changeCode);
        loginJPanel.add(jb_messageVerify);


    }

    /**
     * 添加监听事件
     */
     private void addListener(){
         //找回账号与密码监听
         jb_findName.addMouseListener(this);
         jb_findPassword.addMouseListener(this);
         jb_changeCode.addMouseListener(this);

         //复选框按钮监听
         jcb_remember.addMouseListener(this);
        // jcb_autoLogin.addMouseListener(this);

         //按钮监听
         bt_login.addMouseListener(this);
         bt_register.addMouseListener(this);
         bt_cancle.addMouseListener(this);

         //键盘监听
         jtf_name.addKeyListener(this);
         jpf_password.addKeyListener(this);
         jtf_verify.addKeyListener(this);

         jtf_name.addMouseListener(this);
         jpf_password.addMouseListener(this);
         jtf_verify.addMouseListener(this);
         jlist.addMouseListener(this);

         this.addMouseListener(this);
         
     }

    /**
     * 下部分选择登陆取消注册界面
     */
    private void initButtonJPanel(){
        buttonJPanel=new JPanel();
        buttonJPanel.setLayout(null);

        jcb_remember=new JCheckBox("记住密码");
        jcb_remember.setSelected(rememberPassword);
//        jcb_autoLogin=new JCheckBox("自动登陆");
//        jcb_autoLogin.setSelected(autoLogin);

        jcb_remember.setBounds(80,10,100,30);
//        jcb_autoLogin.setBounds(230,10,100,30);

        buttonJPanel.add(jcb_remember);
        //buttonJPanel.add(jcb_autoLogin);


        bt_login=new JButton("登  陆");
        bt_register=new JButton("注  册");
        bt_cancle=new JButton("取  消");

        bt_login.setBounds(60,80,80,30);
        bt_register.setBounds(155,80,80,30);
        bt_cancle.setBounds(250,80,80,30);


        buttonJPanel.add(bt_login);
        buttonJPanel.add(bt_register);
        buttonJPanel.add(bt_cancle);
    }

    /**
     * 界面容器设置
     */
    private void initJFrame(){
        this.initImageJPanel();
        this.initLoginJPanel();
        this.initButtonJPanel();
        this.addListener();

        GridLayout gridLayout = new GridLayout(3, 1);
        this.setLayout(gridLayout);
        this.add(imageJPanel,0);
        this.add(loginJPanel,1);
        this.add(buttonJPanel,2);

        this.setTitle("学生管理系统登陆界面");
        this.setSize(450,500);
        int width = Toolkit.getDefaultToolkit().getScreenSize().width;
        int height = Toolkit.getDefaultToolkit().getScreenSize().height;
        this.setLocation(width / 2 - 200, height / 2-400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

//        this.autoLogin();
    }

//    /**
//     * 进入自动登陆程序
//     */
//    private void autoLogin(){
//        if(jcb_autoLogin.isSelected()==true){
//            this.loginStudentAdminsys();
//        }
//    }

    @Override
    public void mouseClicked(MouseEvent e) {
       if(e.getSource()==bt_login){//登陆
           jlist.setVisible(false);
           if(this.codeIsEmpty())
                this.loginStudentAdminsys();
           else
               jtf_verify.requestFocus(true);

       }else if(e.getSource()==bt_register){//注册
           jlist.setVisible(false);
           new RegisterDialog(jtf_name,jpf_password,loginService);

       }else if(e.getSource()==bt_cancle){//取消
           jlist.setVisible(false);
           System.exit(0);

       }else if(e.getSource()==jb_findName){//找回账号
           jlist.setVisible(false);
           jb_findName.setForeground(Color.GRAY);
           new FindName(jb_findName,loginService);

       }else if(e.getSource()==jb_findPassword){//找回密码
           jlist.setVisible(false);
           jb_findPassword.setForeground(Color.GRAY);
           new FindPassword(jb_findPassword,loginService);

       }else if(e.getSource()==jb_changeCode){
           jlist.setVisible(false);
           this.updateVerifyCode();

       }else if(e.getSource()==jpf_password){
           jlist.setVisible(false);
           if(this.nameIsEmpty()==false)
               jtf_name.requestFocus(true);
           else
               jb_messageName.setText("");

       }else if(e.getSource()==jtf_verify){
           jlist.setVisible(false);
           if(this.nameIsEmpty())
                if(this.passwordIsEmpty()==false)
                    jpf_password.requestFocus(true);
                else
                    jb_messagePassword.setText("");
           else
               jtf_name.requestFocus(true);

       }else if(e.getSource()==jtf_name){
           jlist.setVisible(true);

       }else if(e.getSource()==jlist){
           String value = (String) jlist.getSelectedValue();
           jtf_name.setText(value);
           if (datas != null) {
               for (int i = 0; i < datas.length; i++) {
                   if(datas[i][0].equals(value)){
                       if(datas[i][1].equals("")==false){
                           jpf_password.setText(datas[i][1]);
                           break;
                       }

                   }
               }
           }
           jlist.setVisible(false);
           System.out.println(jlist.getSelectedValue());
       }else if(e.getSource() == this){
           jlist.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) {

    }

    /**
     * 用户名获取焦点
     */
    private void nameGetFocus(){
        if(jtf_name.getFocusTraversalKeysEnabled())
            jpf_password.requestFocus();//密码框获取光标
    }

    /**
     * 密码框获取焦点
     */
    private void passwordGetFocus(){
        if(jpf_password.getFocusTraversalKeysEnabled()){
            if(this.nameIsEmpty())
                jtf_verify.requestFocus();//验证码框获取光标
            else 
                jtf_name.requestFocus(true);
        }
    }

    /**
     * 验证码获取焦点
     */
    private void verifyGetFocus(){
        if(jtf_verify.getFocusTraversalKeysEnabled())
            if(this.passwordIsEmpty())
                if(this.codeIsEmpty())
                    this.loginStudentAdminsys();
                else
                    jtf_verify.requestFocus(true);
            else
                jpf_password.requestFocus(true);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getSource()==jtf_name&&e.getKeyCode()==KeyEvent.VK_ENTER) {
            jlist.setVisible(false);
            this.nameGetFocus();

        }else if(e.getSource()==jpf_password&&e.getKeyCode()==KeyEvent.VK_ENTER) {
            this.passwordGetFocus();

        } else if(e.getSource()==jtf_verify&&e.getKeyCode()==KeyEvent.VK_ENTER) {
            this.verifyGetFocus();
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    /**
     * 验证码更新
     */
    private void updateVerifyCode() {
        String[] code =VerifyCode.readVerifyCode();
        codeShow=code[0];
        jtf_showCode.setText(codeShow);
        codeStr=code[1];
    }

    /**
     * 实行登陆操作
     */
    private void loginStudentAdminsys(){
        if(this.booleanLoginMessage()){
            //1.获取登录名
            String name=jtf_name.getText();
            //2.获取密码
            String password=this.getLoginPassword(jpf_password.getPassword());
            //3.保存登陆信息
            this.saveLoginInformationToFile(name,password);
            //4.清空提示信息
            this.clearMessage();
            //5.登陆进新页面
            new StudentAdmin();
            //6.关闭当前窗口
            this.dispose();
        }else{
            JOptionPane.showMessageDialog(null,"登陆失败,请查找原因!");
        }
    }

    /**
     * 登陆所有基本条件的判断(所有文本域不为空)
     *
     * @return 均不为空且正确返回结果值true,否则返回false
     */
    private boolean booleanLoginMessage(){

        if(this.nameIsEmpty()){//姓名符合
            //创建对象
            User user=new User();
            //获取姓名
            user.setName(jtf_name.getText());
            if(this.passwordIsEmpty()){//密码不为空
                //获取密码
                user.setPassword(this.getLoginPassword(jpf_password.getPassword()));
                if(loginService.queryUser(user)){//用户存在
                   return true;
                }else{
                    jb_messagePassword.setText("密码不正确!");
                    return false;
                }
            }

        }
        return false;
    }

    /**
     * 用户名判断
     * @return 返回的结果字符串:“false”表示不符合,否则符合要求
     */
    private boolean nameIsEmpty(){
        //1.获取字符串
        String name= jtf_name.getText();
        //2.判断是否符合条件
        if(name != null && name.equals("")==false){
            if(loginService.queryUserByName(name)==false){
                jb_messageName.setText("");
                return true;
            }else{
                jb_messageName.setText("该用户名不存在!");
                this.updateVerifyCode();
                return false;
            }
        }
        jb_messageName.setText("用户名不能为空");
        this.updateVerifyCode();
        return false;
    }

    /**
     * 密码判断是否为空值
     * @return 获取结果值,true为真,否则为false
     */
    private boolean passwordIsEmpty(){
        String password=this.getLoginPassword(jpf_password.getPassword());
        //3.判断是否符合条件
        if(password != null && password.equals("")==false){
            jb_messagePassword.setText("");
            return true;
        }
        jb_messagePassword.setText("密码不能为空!");
        this.updateVerifyCode();
        return false;
    }

    /**
     * 密码获取
     * @return 返回的结果字符串
     */
    private String getLoginPassword(char[] chars){
        String password="";
        if (chars != null) {
            for (char aChar : chars) {
                password +=aChar;
            }
        }
        return password;
    }


    /**
     * 判断验证码是否符合
     * @return 返回的结果字符串:“false”表示不符合,否则符合要求
     */
    private boolean codeIsEmpty(){
        //1.获取字符串
        String code=jtf_verify.getText();
        //2.判断是否符合条件
        if(code !=null && code.equals("")==false){
            if(code.equals(codeStr)){
                jb_messageVerify.setText("");
                return true;
            }else{
                jb_messageVerify.setText("验证码输入错误");
                this.updateVerifyCode();
                return false;
            }
        }
        jb_messageVerify.setText("验证码不能为空");
        this.updateVerifyCode();
        return false;

    }

    /**
     * 保存登陆状态信息
     * @param name 用户名
     * @param password 密码
     */
    private void saveLoginInformationToFile(String name,String password){
        //1.记住用户名
        String str=name+",";
        //2.判断是否记住密码
        if(jcb_remember.isSelected()==true){//记住密码
                str += password;//保存密码
        }

        //3.保存记录信息:仅用户名、用户名和密码两种状态
        String[] strings = DataUtils.readLoginMessage();
        DataUtils.saveLoginMessage(strings,str);


//        //4.判断是否自动登陆
//        if(jcb_autoLogin.isSelected()==true){//记住自动登陆状态
//            DataUtils.saveAutoLoginMessage("true");
//        }else{//不自动登陆
//            DataUtils.saveAutoLoginMessage("false");
//        }

    }

    /**
     * 成功登录清空提示信息
     */
    private void clearMessage(){
        jb_messageName.setText("");
        jb_messagePassword.setText("");
        jb_messageVerify.setText("");
    }

}

(3)找回账户和密码界面

package com.study.dialog;

import com.study.bean.User;
import com.study.service.LoginService;
import com.study.utils.MyFont;
import com.study.utils.Regex;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class FindNameAndPassword extends JDialog implements MouseListener,KeyListener,WindowListener {

    //标签
    private JLabel jb_header,jb_name,jb_question1, jb_question2, jb_question3,jb_result;
    private JLabel jb_messageName,jb_messageQ1,jb_messageQ2,jb_messageQ3;

    private JTextField jtf_name,jtf_question1, jtf_question2, jtf_question3;
    public JTextField jtf_result;

    private JButton bt_submit,bt_cancle;

    private String action;

    private LoginService loginService;
    private JLabel jb_findAccount;

    public FindNameAndPassword(String action,JLabel jb_findPassword, LoginService loginService){
        this.action=action;
        this.jb_findAccount=jb_findPassword;
        this.loginService=loginService;
        this.initJDialog();
    }

    private void initComponent(){
        //标题
        jb_header=new JLabel("请完成如下信息的填写:");
        jb_header.setBounds(20,20,260,30);
        jb_header.setFont(MyFont.font5);
        this.add(jb_header);
        
        //账号部分
        if("name".equals(action)){
            jb_name=new JLabel("请根据以下问题完成账号的查找");
            jb_name.setBounds(50,80,200,30);
        } else if ("password".equals(action)) {
            jb_name=new JLabel("输入账号:");
            jtf_name=new JTextField();
            jb_messageName=new JLabel();
            jb_name.setBounds(50,80,70,30);
            jtf_name.setBounds(120,80,130,30);
            jb_messageName.setBounds(110,110,260,30);
            this.add(jtf_name);
            this.add(jb_messageName);
        }


        this.add(jb_name);


        //问题回答部分
        jb_question1=new JLabel("Question1:你就读的小学是哪一所?");
        jtf_question1=new JTextField();
        jb_messageQ1=new JLabel();
        jb_messageQ1.setFont(MyFont.font11);
        jb_messageQ1.setForeground(Color.RED);

        jb_question1.setBounds(50,140,260,30);
        jtf_question1.setBounds(70,170,200,30);
        jb_messageQ1.setBounds(275,170,200,30);

        jb_question2=new JLabel("Question2:你目前最敬佩的人是谁?");
        jtf_question2=new JTextField();
        jb_messageQ2=new JLabel();
        jb_messageQ2.setFont(MyFont.font11);
        jb_messageQ2.setForeground(Color.RED);

        jb_question2.setBounds(50,220,260,30);
        jtf_question2.setBounds(70,250,200,30);
        jb_messageQ2.setBounds(275,250,200,30);

        jb_question3=new JLabel("Question3:你目前的人生目标是啥?");
        jtf_question3=new JTextField();
        jb_messageQ3=new JLabel();
        jb_messageQ3.setFont(MyFont.font11);
        jb_messageQ3.setForeground(Color.RED);

        jb_question3.setBounds(50,300,260,30);
        jtf_question3.setBounds(70,330,200,30);
        jb_messageQ3.setBounds(275,330,200,30);

        this.add(jb_question1);this.add(jb_question2);this.add(jb_question3);
        this.add(jtf_question1);this.add(jtf_question2);this.add(jtf_question3);
        this.add(jb_messageQ1);this.add(jb_messageQ2);this.add(jb_messageQ3);

        //结果及按钮
        jb_result=new JLabel("查询结果:");
        jtf_result=new JTextField();
        jtf_result.setEnabled(false);

        jb_result.setBounds(70,380,60,30);
        jtf_result.setBounds(130,380,140,30);

        this.add(jb_result);this.add(jtf_result);

        bt_submit=new JButton("提  交");
        bt_cancle=new JButton("取  消");

        bt_submit.setBounds(70,430,80,30);
        bt_cancle.setBounds(180,430,80,30);

        this.add(bt_submit);this.add(bt_cancle);
    }

    private void addListener(){
        if("password".equals(action))
            jtf_name.addKeyListener(this);
        jtf_question1.addKeyListener(this);
        jtf_question2.addKeyListener(this);
        jtf_question3.addKeyListener(this);

        jtf_question1.addMouseListener(this);
        jtf_question2.addMouseListener(this);
        jtf_question3.addMouseListener(this);
        bt_submit.addMouseListener(this);
        bt_cancle.addMouseListener(this);

    }

    private void initJDialog(){
        this.setLayout(null);
        this.initComponent();
        this.addListener();

        if("name".equals(action)) {
            this.setTitle("找回账号");
        }else if("password".equals(action)) {
            this.setTitle("找回密码");
        }
        this.setSize(360,520);
        this.setLocation(300,200);
        this.setResizable(false);
        this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        this.setVisible(true);
        this.addWindowListener(this);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        if("password".equals(action)&&e.getSource()==jtf_name&&e.getKeyCode()==KeyEvent.VK_ENTER){
            this.jtextFileNameGetFocus();
        }else if(e.getSource()==jtf_question1&&e.getKeyCode()==KeyEvent.VK_ENTER){
            this.jtextFileQuestion1GetFocus();
        }else if(e.getSource()==jtf_question2&&e.getKeyCode()==KeyEvent.VK_ENTER){
            this.jtextFileQuestion2GetFocus();
        }else if(e.getSource()==jtf_question3&&e.getKeyCode()==KeyEvent.VK_ENTER){
            this.jtextFileQuestion3GetFocus();
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    /**
     * 账号焦点改变执行的方法
     */
    private void jtextFileNameGetFocus(){
        if(jtf_name.getFocusTraversalKeysEnabled()){
            //判断姓名的合法性
            if(this.isRequiredName())
                jtf_question1.requestFocus();//密码框获取光标
            else
                jtf_name.requestFocus(true);
        }
    }

    /**
     * 第一个问题光标移到到下一处时执行的方法
     */
    private void jtextFileQuestion1GetFocus(){
        if(jtf_question1.getFocusTraversalKeysEnabled()){
            if(this.isRequiredQuestion(jtf_question1,jb_messageQ1))
                jtf_question2.requestFocus();//问题2框获取光标
            else
                jtf_question1.requestFocus(true);
        }
    }

    /**
     * 第二个问题光标移到到下一处时执行的方法
     */
    private void jtextFileQuestion2GetFocus(){
        if(jtf_question2.getFocusTraversalKeysEnabled()){
            if(this.isRequiredQuestion(jtf_question2,jb_messageQ2))
                jtf_question3.requestFocus();//问题3框获取光标
            else
                jtf_question2.requestFocus(true);
        }
    }

    /**
     * 第三个问题光标移到到下一处时执行的方法
     */
    private void jtextFileQuestion3GetFocus(){
        if(jtf_question3.getFocusTraversalKeysEnabled()){
            if(this.isRequiredQuestion(jtf_question3,jb_messageQ3))
                if("name".equals(action))
                     this.findBackUserName();
                else
                    this.findBackUserPassword();
            else
                jtf_question3.requestFocus(true);
        }
    }

    /**
     * 判断问题答案是否已经输入内容
     *
     * @return 返回布尔值,true是符合要求的,反之不符合要求
     */
    private boolean isRequiredQuestion(JTextField jtf,JLabel jb){
        String text =jtf.getText();
        if(text !=null && text.equals("")==false){
            jb.setText("");
            return true;
        }else{
            jb.setText("请输入内容!");
            return false;
        }
    }

    /**
     * 判断姓名是否符合要求
     *
     * @return 返回布尔值,true是符合要求的,反之不符合要求
     */
    private boolean isRequiredName(){
        String name=jtf_name.getText();
        //1.判断用户名不为空
        if(name != null && name.equals("")==false){//不为空进行验证
            //2.验证输入的合法性
            if(Regex.isRequiredName(name)){//输入合法
                return true;
            }else {
                //输入不合法,显示提示信息
                jb_messageName.setText("输入不合法,由字母/数字/中文字符组成!");
                jb_messageName.setForeground(Color.RED);
            }
        }else {
            //为空显示提示信息
            jb_messageName.setText("请输入账号信息!");
            jb_messageName.setForeground(Color.RED);
        }
        return false;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if("password".equals(action)&&e.getSource()==jtf_question1){
            if(this.isRequiredName())
                jb_messageName.setText("");
            else
                jtf_name.requestFocus(true);

        }else if(e.getSource()==jtf_question2){
            if(this.isRequiredQuestion(jtf_question1,jb_messageQ1))
                jb_messageQ1.setText("");
            else
                jtf_question1.requestFocus(true);
            this.jtextFileQuestion1GetFocus();

        }else if(e.getSource()==jtf_question3){
            if(this.isRequiredQuestion(jtf_question2,jb_messageQ2))
                jb_messageQ2.setText("");
            else
                jtf_question2.requestFocus(true);

            this.jtextFileQuestion2GetFocus();

        }else if(e.getSource()==bt_submit){
            if(this.isRequiredQuestion(jtf_question3,jb_messageQ3)){
                jb_messageQ3.setText("");
                if("name".equals(action))
                    this.findBackUserName();
                else if("password".equals(action))
                    this.findBackUserPassword();

            }else {
                jtf_question3.requestFocus(true);
            }


        }else if(e.getSource()==bt_cancle){
            jb_findAccount.setForeground(Color.BLUE);
            jb_findAccount.setEnabled(true);
            this.dispose();
        }

    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }

    /**
     * 找回密码信息
     */
    private void findBackUserPassword(){
        if(this.isRequiredName()&&this.isRequiredQuestion(jtf_question1,jb_messageQ1)&&this.isRequiredQuestion(jtf_question2,jb_messageQ2)&&this.isRequiredQuestion(jtf_question3,jb_messageQ3)){
            User user=this.getUserInformation();
            User user1 = loginService.queryUserByNameAndThreeQuestion(user);
            if (user1 != null) {
                JOptionPane.showMessageDialog(null,"恭喜你!成功找回密码!");
                jtf_result.setText(user1.getPassword());
            }else{
                jtf_result.setText("");
                JOptionPane.showMessageDialog(null,"未查找到账号,请再尝试!");
            }
        }
    }

    /**
     * 找回账号信息
     */
    private void findBackUserName(){
        if(this.isRequiredQuestion(jtf_question1,jb_messageQ1)&&this.isRequiredQuestion(jtf_question2,jb_messageQ2)&&this.isRequiredQuestion(jtf_question3,jb_messageQ3)){
            User user=this.getUserInformation();
            User user1 = loginService.queryUserByThreeQuestion(user);
            if (user1 != null) {
                JOptionPane.showMessageDialog(null,"恭喜你!成功找回账号!");
                jtf_result.setText(user1.getName());
            }else{
                jtf_result.setText("");
                JOptionPane.showMessageDialog(null,"未查找到账号,请再尝试!");
            }
        }
    }

    /**
     * 获取封装对象信息
     * 
     * @return 返回user
     */
    private User getUserInformation(){
        User user=new User();
        if("password".equals(action))
            user.setName(jtf_name.getText());
        user.setQuestion1(jtf_question1.getText());
        user.setQuestion2(jtf_question2.getText());
        user.setQuestion3(jtf_question3.getText());
        return user;
    }

    @Override
    public void windowOpened(WindowEvent e) {

    }

    @Override
    public void windowClosing(WindowEvent e) {
        if(e.getSource()==this){
            jb_findAccount.setForeground(Color.BLUE);
            jb_findAccount.setEnabled(true);
        }

    }

    @Override
    public void windowClosed(WindowEvent e) {

    }

    @Override
    public void windowIconified(WindowEvent e) {

    }

    @Override
    public void windowDeiconified(WindowEvent e) {

    }

    @Override
    public void windowActivated(WindowEvent e) {

    }

    @Override
    public void windowDeactivated(WindowEvent e) {

    }
}


(4)注册界面
package com.study.dialog;

import com.study.bean.User;
import com.study.service.LoginService;
import com.study.utils.MyFont;
import com.study.utils.Regex;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

/**
 * 注册界面
 */
public class RegisterDialog extends JDialog implements MouseListener,KeyListener {

    //标签:账号、密码、确认密码、找寻账号或密码的三个问题
    JLabel jb_name, jb_password, jb_okPassword, jb_question1, jb_question2, jb_question3;
    //检测用户名
    JLabel jb_checkName;
    //查看条款
    JLabel jb_lookDetail;

    //输入文本域
    JTextField jtf_name, jtf_question1, jtf_question2, jtf_question3;
    JPasswordField jpf_password, jpf_okPassword;

    //信息提示标签
    JLabel jb_message,jb_okMessage,jb_messageQ1,jb_messageQ2,jb_messageQ3;

    //同意条款确按钮
    JRadioButton rbt;

    //确认、取消按钮
    JButton bt_OK, bt_cancle;

    //声明对象
    private LoginService loginService;
    //声明标签
    private JTextField jtf_updateName;
    private JPasswordField jtf_updatePassword;

    /**
     * 有参构造方法
     */
    public RegisterDialog(JTextField jtf_updateName,JPasswordField jtf_updatePassword,LoginService loginService) {
        this.jtf_updateName=jtf_updateName;
        this.jtf_updatePassword=jtf_updatePassword;
        this.loginService=loginService;
        this.initJDialog();
    }

    private void initComponent() {
        //账号部分
        jb_name = new JLabel("账          号:");
        jtf_name = new JTextField();
        jb_checkName = new JLabel("由字母、数字、中文字符组成");

        jb_name.setBounds(50, 20, 80, 30);
        jtf_name.setBounds(130, 20, 150, 30);
        jb_checkName.setBounds(285, 20, 200, 30);
        jb_checkName.setFont(MyFont.font11);
        jb_checkName.setForeground(Color.BLUE);

        this.add(jb_name);
        this.add(jtf_name);
        this.add(jb_checkName);

        //密码部分
        jb_password = new JLabel("密         码:");
        jpf_password = new JPasswordField();
        jb_message=new JLabel("由字母、数字组成,长度[6,30]");

        jb_password.setBounds(50,70,80,30);
        jpf_password.setBounds(130,70,150,30);
        jb_message.setBounds(285,70,200,30);
        jb_message.setFont(MyFont.font11);
        jb_message.setForeground(Color.BLUE);

        //确认密码部分
        jb_okPassword = new JLabel("确认密码:");
        jpf_okPassword = new JPasswordField();
        jb_okMessage = new JLabel();
        //jb_okMessage.setVisible(false);

        jb_okPassword.setBounds(50,120,80,30);
        jpf_okPassword.setBounds(130,120,150,30);
        jb_okMessage.setBounds(285,120,200,30);
        jb_okMessage.setFont(MyFont.font11);
        jb_okMessage.setForeground(Color.RED);

        this.add(jb_password);
        this.add(jb_okPassword);
        this.add(jpf_password);
        this.add(jpf_okPassword);
        this.add(jb_message);
        this.add(jb_okMessage);


        //问题设置部分
        jb_question1=new JLabel("Question1:你就读的小学是哪一所?");
        jtf_question1=new JTextField();
        jb_messageQ1=new JLabel();
        jb_messageQ1.setFont(MyFont.font11);
        jb_messageQ1.setForeground(Color.RED);

        jb_question1.setBounds(50,170,260,30);
        jtf_question1.setBounds(70,200,200,30);
        jb_messageQ1.setBounds(275,200,200,30);

        jb_question2=new JLabel("Question2:你目前最敬佩的人是谁?");
        jtf_question2=new JTextField();
        jb_messageQ2=new JLabel();
        jb_messageQ2.setFont(MyFont.font11);
        jb_messageQ2.setForeground(Color.RED);

        jb_question2.setBounds(50,250,260,30);
        jtf_question2.setBounds(70,280,200,30);
        jb_messageQ2.setBounds(275,280,200,30);

        jb_question3=new JLabel("Question3:你目前的人生目标是啥?");
        jtf_question3=new JTextField();
        jb_messageQ3=new JLabel();
        jb_messageQ3.setFont(MyFont.font11);
        jb_messageQ3.setForeground(Color.RED);

        jb_question3.setBounds(50,330,260,30);
        jtf_question3.setBounds(70,360,200,30);
        jb_messageQ3.setBounds(275,360,200,30);

        this.add(jb_question1);this.add(jb_question2);this.add(jb_question3);
        this.add(jtf_question1);this.add(jtf_question2);this.add(jtf_question3);
        this.add(jb_messageQ1);this.add(jb_messageQ2);this.add(jb_messageQ3);

        //确认条款和按钮部分
        rbt=new JRadioButton("同意条款注册账号");
        jb_lookDetail=new JLabel("<html><u>查看详细条款信息</u></html>");
        bt_OK=new JButton("确  定");
        bt_cancle=new JButton("取  消");

        rbt.setBounds(50,420,150,30);
        jb_lookDetail.setBounds(200,420,150,30);
        jb_lookDetail.setForeground(Color.BLUE);
        bt_OK.setBounds(70,480,80,30);
        bt_cancle.setBounds(180,480,80,30);

        this.add(rbt);
        this.add(jb_lookDetail);
        this.add(bt_OK);
        this.add(bt_cancle);

    }

    private void addActionListener(){
        jtf_name.addKeyListener(this);
        jpf_password.addKeyListener(this);
        jpf_okPassword.addKeyListener(this);
        jtf_question1.addKeyListener(this);
        jtf_question2.addKeyListener(this);
        jtf_question3.addKeyListener(this);

        jtf_name.addMouseListener(this);
        jpf_password.addMouseListener(this);
        jpf_okPassword.addMouseListener(this);
        jtf_question1.addMouseListener(this);
        jtf_question2.addMouseListener(this);
        jtf_question3.addMouseListener(this);

        jb_lookDetail.addMouseListener(this);
        rbt.addMouseListener(this);
        bt_OK.addMouseListener(this);
        bt_cancle.addMouseListener(this);
    }

    private void initJDialog(){
        this.setLayout(null);
        this.initComponent();
        this.addActionListener();

        this.setTitle("用户注册界面");
        this.setSize(500,565);
        this.setLocation(300,150);
        this.setResizable(false);
        this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        this.setVisible(true);
    }


    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {

        if(e.getSource()==jtf_name && e.getKeyCode()==KeyEvent.VK_ENTER)
            this.jtextFileNameGetFocus();

        else if(e.getSource()==jpf_password && e.getKeyCode()==KeyEvent.VK_ENTER)
            this.jtextFilePasswordGetFocus();

        else if(e.getSource()==jpf_okPassword && e.getKeyCode()==KeyEvent.VK_ENTER)
            this.jtextFileOkPasswordGetFocus();

        else if(e.getSource()==jtf_question1 && e.getKeyCode()==KeyEvent.VK_ENTER)
            this.jtextFileQuestion1GetFocus();

        else if(e.getSource()==jtf_question2 && e.getKeyCode()==KeyEvent.VK_ENTER)
            this.jtextFileQuestion2GetFocus();

        else if(e.getSource()==jtf_question3 && e.getKeyCode()==KeyEvent.VK_ENTER)
            this.jtextFileQuestion3GetFocus();
    }

    /**
     * 账号焦点改变执行的方法
     */
    private void jtextFileNameGetFocus(){
        if(jtf_name.getFocusTraversalKeysEnabled()){
            //判断姓名的合法性
            if(this.isRequiredName())
                jpf_password.requestFocus();//密码框获取光标
            else
                jtf_name.requestFocus(true);
        }
    }

    /**
     * 第一次输入密码光标移动到下一处时执行的方法
     */
    private void jtextFilePasswordGetFocus(){
        if(jpf_password.getFocusTraversalKeysEnabled()){
            //判断密码是否符合条件
            if(this.isRequiredPassword())
                jpf_okPassword.requestFocus();//确认密码框获取光标
                        
        }
    }

    /**
     * 第二次输入密码光标移动到下一处时执行的方法
     */
    private void jtextFileOkPasswordGetFocus(){
        if(jpf_okPassword.getFocusTraversalKeysEnabled()){
            if(this.isRequiredOkPassword())
                jtf_question1.requestFocus();//问题1框获取光标
        }
    }

    /**
     * 第一个问题光标移到到下一处时执行的方法
     */
    private void jtextFileQuestion1GetFocus(){
        if(jtf_question1.getFocusTraversalKeysEnabled()){
            if(this.isRequiredQuestion(jtf_question1,jb_messageQ1))
                jtf_question2.requestFocus();//问题2框获取光标
            else
                jtf_question1.requestFocus(true);
        }
    }

    /**
     * 第二个问题光标移到到下一处时执行的方法
     */
    private void jtextFileQuestion2GetFocus(){
        if(jtf_question2.getFocusTraversalKeysEnabled()){
            if(this.isRequiredQuestion(jtf_question2,jb_messageQ2))
                jtf_question3.requestFocus();//问题3框获取光标
            else
                jtf_question2.requestFocus(true);
        }
    }

    /**
     * 第三个问题光标移到到下一处时执行的方法
     */
    private void jtextFileQuestion3GetFocus(){
        if(jtf_question3.getFocusTraversalKeysEnabled()){
            if(this.isRequiredQuestion(jtf_question3,jb_messageQ3))
                if(rbt.isSelected()==true)
                    this.registerUser();
                else
                    JOptionPane.showMessageDialog(null,"请先同意条款","提示消息",1);
            else
                jtf_question3.requestFocus(true);
        }
    }


    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if(e.getSource()==rbt) {
            if(this.isRequiredQuestion(jtf_question3,jb_messageQ3)==false)
                jtf_question3.requestFocus(true);

        }else if(e.getSource()==jb_lookDetail) {
            new DetailDialog();

        }else if(e.getSource()==bt_OK ) {
            if(rbt.isSelected()==true)
                this.registerUser();
            else
                JOptionPane.showMessageDialog(null,"同意条款方可注册!");

        }else if(e.getSource()==bt_cancle) {
            this.dispose();//退出注册界面

        }else if(e.getSource()==jpf_password) {
            if(this.isRequiredName()==false)
                jtf_name.requestFocus(true);


        }else if(e.getSource()==jpf_okPassword) {
            if(this.isRequiredPassword()==false)
                jpf_password.requestFocus(true);

        }else if(e.getSource()==jtf_question1) {
            if(this.isRequiredOkPassword()==false)
                jpf_okPassword.requestFocus(true);

        }else if(e.getSource()==jtf_question2) {
            if(this.isRequiredQuestion(jtf_question1,jb_messageQ1)==false)
                jtf_question1.requestFocus(true);

        }else if(e.getSource()==jtf_question3) {
            if(this.isRequiredQuestion(jtf_question2,jb_messageQ2)==false)
                jtf_question2.requestFocus(true);
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }

    /**
     * 进入注册方法,正式注册信息
     */
    private void registerUser(){
        //全部符合要求,正式注册
        if(this.booleanRegisterCondition()){
            String name=jtf_name.getText();
            String password=this.getStringFromPasswordFile(jpf_password.getPassword());
            User user=new User();
            user.setName(name);
            user.setPassword(password);
            user.setQuestion1(jtf_question1.getText());
            user.setQuestion2(jtf_question2.getText());
            user.setQuestion3(jtf_question3.getText());
            if(loginService.insertUser(user)) {
                this.updateLoginMessage(name,password);
                JOptionPane.showMessageDialog(null, "注册成功!");
            }else {
                JOptionPane.showMessageDialog(null, "注册失败!");
            }
        }else{
            JOptionPane.showMessageDialog(null,"有错误,请检查!");
        }
    }

    /**
     * 判断所有输入的结果
     * @return 全部符合要求返回true,否则返回false
     */
    private boolean booleanRegisterCondition(){
        if(this.isRequiredName()&&this.isRequiredPassword()&&this.isRequiredOkPassword()&&this.isRequiredQuestion(jtf_question1,jb_messageQ1)&&this.isRequiredQuestion(jtf_question2,jb_messageQ2)&&this.isRequiredQuestion(jtf_question3,jb_messageQ3))
            return true;
        return false;
    }

    /**
     * 判断姓名是否符合要求
     * 
     * @return 返回布尔值,true是符合要求的,反之不符合要求
     */
    private boolean isRequiredName(){
        String name=jtf_name.getText();
        //1.判断用户名不为空
        if(name != null && name.equals("")==false){//不为空进行验证
            //2.验证输入的合法性
            if(Regex.isRequiredName(name)){//输入合法
                //3.查询是否重名
                if(loginService.queryUserByName(name)) {//不重名
                    jb_checkName.setText("由字母、数字、中文字符组成");
                    jb_checkName.setForeground(Color.BLUE);
                    return true;
                }else {
                    //重名显示提示信息,结束执行
                    jb_checkName.setText("该账号已经存在,请重新输入!");
                    jb_checkName.setForeground(Color.RED);
                }
            }else {
                //输入不合法,显示提示信息
                jb_checkName.setText("输入不合法,只能由字母、数字、中文字符组成!");
                jb_checkName.setForeground(Color.RED);
            }
        }else {
            //为空显示提示信息
            jb_checkName.setText("请输入账号信息!");
            jb_checkName.setForeground(Color.RED);
        }
        return false;
    }

    /**
     * 判断密码输入是否符合条件
     * @return
     */
    private boolean isRequiredPassword(){
        char[] password = jpf_password.getPassword();
        String passwordStr=this.getStringFromPasswordFile(password);
        if(passwordStr !=null && passwordStr.equals("")==false){
            if(Regex.isRequiredPassword(passwordStr)){
                jb_message.setText("由字母、数字组成,长度[6,30]");
                jb_message.setForeground(Color.BLUE);
                return true;
            }else{
                jb_message.setText("输入不合法!");
                jb_message.setForeground(Color.RED);
                return false;
            }
        }else{
            jb_message.setText("密码不能为空");
            jb_message.setForeground(Color.RED);
            return false;
        }
        
    }

    /**
     * 将密码字符数组转成字符串形式
     * 
     * @param password 密码
     * @return 返回字符串
     */
    private String getStringFromPasswordFile(char[] password){
        String str="";
        if (password != null) {
            for (char c : password) {
                str +=c;
            }
        }
        return str;
    }

    /**
     * 判断确认密码是否符合要求
     * 
     * @return 返回布尔值,true是符合要求的,反之不符合要求
     */
    private boolean isRequiredOkPassword(){
        if(this.isRequiredPassword()){
            char[] password = jpf_okPassword.getPassword();
            String passwordStr=this.getStringFromPasswordFile(password);
            if(passwordStr !=null && passwordStr.equals("")==false){
                if(Regex.isRequiredPassword(passwordStr)){
                    String passwordStr1=this.getStringFromPasswordFile(jpf_password.getPassword());
                    if(passwordStr.equals(passwordStr1)){
                        jb_okMessage.setText("");
                        return true;
                    }else{
                        jb_okMessage.setText("前后两次输入密码不相符!");
                        return false;
                    }
                    
                }else{
                    jb_okMessage.setText("确认密码输入不合法!");
                    return false;
                }
            }else{
                jb_okMessage.setText("确认密码不能为空");
                return false;
            }
            
        }else{
            jb_okMessage.setText("前后两次输入密码不相符!");
            return false;
        }
    }

    /**
     * 判断问题答案是否已经输入内容
     * 
     * @return 返回布尔值,true是符合要求的,反之不符合要求
     */
    private boolean isRequiredQuestion(JTextField jtf,JLabel jb){
        String text =jtf.getText();
        if(text !=null && text.equals("")==false){
            jb.setText("");
            return true;
        }else{
            jb.setText("问题答案不能为空!");
            return false;
        }
    }

    /**
     * 更新登陆信息
     * @param name 用户名
     * @param password 密码
     */
    public void updateLoginMessage(String name,String password){
        jtf_updateName.setText(name);
        jtf_updatePassword.setText(password);
    }

}

2.学生管理系统界面的设计与代码实现(部分)
(1)整体设计
package com.study.myPage;


import com.study.myTable.MyJTable;
import com.study.myTable.MyTable;
import com.study.myTable.MyTablePopupMenu;
import com.study.service.StudentSevice;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class StudentAdmin extends JFrame implements MouseListener{

    private JSplitPane bottomJSp;

    private JPanel leftPanel;
    private CalendarPanel calendarPanel;
    private TimePanel timePanel;

    private MenuPanel menuPanel;

    private JSplitPane studentJSp;

    private JScrollPane jScrollPane;
    
    private MyJTable jTable;

    private JPanel tablePanel,tableBottomPanel;

    private StudentSevice studentSevice=new StudentSevice();
    
    
    public StudentAdmin(){
        this.initJFrame();
    }

    /**
     * 左边的日历和时钟显示
     */
    private void initLeftPanel(){
        leftPanel=new JPanel();
        leftPanel.setLayout(new BorderLayout());

        calendarPanel=new CalendarPanel();
        timePanel=new TimePanel();

        leftPanel.add(calendarPanel,BorderLayout.CENTER);
        leftPanel.add(timePanel,BorderLayout.SOUTH);

    }

    /**
     * 右边上部分内容
     */
    private void initStudentPanel(){
        menuPanel=new MenuPanel(studentSevice,jTable);
    }

    /**
     * 右边下部分内容
     */
    private void initTablePanel(){
        tablePanel=new JPanel();
        tablePanel.setLayout(new BorderLayout());

        MyTable myTable=new MyTable(studentSevice);
        jTable=new MyJTable(myTable);
        jScrollPane=new JScrollPane(jTable);
        jScrollPane.setSize(tablePanel.getWidth(),tablePanel.getHeight()-120);

        tableBottomPanel=new JPanel();
        tableBottomPanel.setSize(tablePanel.getWidth(),60);
        JLabel label=new JLabel("原创作者:语程峰");
        tableBottomPanel.add(label);
        tablePanel.add(jScrollPane);
        tablePanel.add(tableBottomPanel,BorderLayout.SOUTH);
    }

    /**
     * 上下界面
     */
    private void initStudentJSplitPane(){
        studentJSp=new JSplitPane(JSplitPane.VERTICAL_SPLIT,menuPanel,tablePanel);
        studentJSp.setDividerLocation(280);
    }

    /**
     * 左右界面
     */
    private void initBottomJSplitPane(){
        bottomJSp=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,leftPanel,studentJSp);
        bottomJSp.setDividerLocation(300);
    }

    private void addListener(){
        jTable.addMouseListener(this);
    }

    /**
     * 初始化界面
     */
    private void initJFrame(){
        this.initLeftPanel();
        this.initTablePanel();
        this.initStudentPanel();
        this.initStudentJSplitPane();
        this.initBottomJSplitPane();
        this.add(bottomJSp);
        this.addListener();

        this.setTitle("学生管理系统操作界面");
        this.setSize(1200,1000);
        this.setLocation(200,50);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if(e.getSource()==jTable&&e.getButton()==MouseEvent.BUTTON3){
            MyTablePopupMenu myTablePopupMenu = new MyTablePopupMenu(jTable);
            myTablePopupMenu.show(e.getComponent(),e.getX(),e.getY());
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }
    

}

(2)各个界面
package com.study.myPage;

import com.study.utils.MyFont;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.Date;

public class CalendarPanel extends JPanel implements ActionListener {

    private JComboBox jcbb_year,jcbb_month;

    private JLabel jb_year,jb_month;

    private JTextArea textarea;

    private JButton bt_carry;


    private JLabel jb_time;
    private Timer timer;

    private String[] yearArr,monthArr;

    private Date date=new Date();
    private int indexYear=date.getYear();
    private int indexMonth=date.getMonth();
    private int year,month;

    public CalendarPanel(){
        this.initArrays();
        this.initComponent();
        this.addListener();
    }

    private void initArrays() {
        yearArr=new String[201];
        for(int i=0;i<201;i++){
            yearArr[i]=i+1900+"";
        }

        monthArr=new String[12];
        for(int i=0;i<12;i++){
            monthArr[i]=i+1+"";
        }
    }

    private void initComponent(){
        this.setLayout(null);
        jcbb_year=new JComboBox(yearArr);
        jcbb_year.setSelectedIndex(indexYear);
        year=Integer.parseInt((String)jcbb_year.getSelectedItem());
        jb_year=new JLabel("年");
        jcbb_year.setBounds(20,100,60,25);
        jb_year.setBounds(85,100,20,25);


        jcbb_month=new JComboBox(monthArr);
        jcbb_month.setSelectedIndex(indexMonth);
        month=Integer.parseInt((String)jcbb_month.getSelectedItem());
        jb_month=new JLabel("月");
        jcbb_month.setBounds(115,100,40,25);
        jb_month.setBounds(160,100,20,25);


        bt_carry=new JButton("查询");
        bt_carry.setBounds(200,100,60,25);



        textarea=new JTextArea();
        textarea.setBounds(20,140,250,230);
        textarea.setEditable(false);
        textarea.setBackground(Color.LIGHT_GRAY);
        textarea.setForeground(Color.BLUE);
        this.getCalendar();

        timer=new Timer(1000,this);
        timer.start();
        jb_time=new JLabel("当前时间:"+Calendar.getInstance().getTime().toLocaleString());
        jb_time.setBounds(20,375,250,40);
        jb_time.setForeground(Color.BLUE);
        jb_time.setFont(MyFont.font9);
        this.add(jb_time);

        this.add(jcbb_month);
        this.add(jcbb_year);
        this.add(jb_month);
        this.add(jb_year);
        this.add(bt_carry);
        this.add(textarea);
    }

    private void addListener(){
        jcbb_year.addActionListener(this);
        jcbb_month.addActionListener(this);
        bt_carry.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        jb_time.setText("当前时间:"+Calendar.getInstance().getTime().toLocaleString());
        if(e.getSource()==jcbb_year||e.getSource()==jcbb_month||e.getSource()==bt_carry){
            this.carryUpdateCalendar();
        }
    }

    private void carryUpdateCalendar(){
        year=Integer.parseInt((String)jcbb_year.getSelectedItem());
        month=Integer.parseInt((String)jcbb_month.getSelectedItem());
        this.getCalendar();
    }

    private void getCalendar() {
        //1.获取1900年到指定年份的总天数
        int days=0;
        for(int i=1900;i<year;i++){
            if(this.isIntercalation(i))
                days += 366;
            else
                days +=365;
        }

        //2.获取到指定月数的前一个月的总天数
        for(int i=1;i<month;i++) {
            if (i == 4 || i == 6 || i == 9 || i == 11) {
                days += 30;
            } else if (i == 2) {
                if(this.isIntercalation(year))
                    days +=29;
                else
                    days +=28;
            } else {
                days += 31;
            }
        }


        //3.获取当月的天数
        int day=0;
        if (month == 4 || month == 6 || month == 9 || month == 11) {
            day = 30;
        } else if (month == 2) {
            if(this.isIntercalation(year))
                day =29;
            else
                day =28;
        } else {
            day = 31;
        }

        //4.获取查询月第一天是星期几(1900年1月1日是星期一):对7取模,余数就是对应的星期,0对应星期日
        int weekday=(days+1)%7;
        String[] str={"日","一","二","三","四","五","六"};
        String content=String.format("%7s","");
        for (int i = 0; i < str.length; i++) {
            if(i>=2 && i<4){
                content +=String.format("%s",str[i])+String.format("%7s","");
            }else{
                content +=String.format("%s",str[i])+String.format("%8s","");
            }

        }


        content +="\n\n"+String.format("%7s", "");
        //5.打印星期几之前的空格:空格数是weekday
        for(int i=0;i<weekday;i++){
            content +=String.format("%4s", "")+String.format("%7s", "");
        }
        
        //6.打印月日历
        for(int i=1;i<=day;i++){
            if((i+weekday) %7==0){
                if(i<10)
                    content +=String.format("%4s", i)+String.format("%7s", "")+"\n\n"+String.format("%7s", "");
                else
                    content +=String.format("%2s", i)+String.format("%7s", " ")+"\n\n"+String.format("%6s", "");
            }else{
                if(i<10)
                        content +=String.format("%3s", i)+String.format("%7s", "");
                else
                    content +=String.format("%2s", i)+String.format("%7s", "");
            }
        }

        textarea.setText(content);
    }

    /**
     * 闰年判断:普通闰年是能被4整除,同时不能被100整除;世纪闰年是能被400整除
     * 
     * @param year 年份
     * @return 返回布尔值,true是闰年,false是平年
     */
    private boolean isIntercalation(int year){
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
            return true;
        else
            return false;
    }
}


package com.study.myPage;

import com.study.bean.Student;
import com.study.myTable.MyJTable;
import com.study.myTable.MyTable;
import com.study.service.StudentSevice;
import com.study.utils.DataTxtAndExcel;
import com.study.utils.ModelUtils;
import com.study.utils.Regex;

import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

public class MenuPanel extends JPanel implements MouseListener, KeyListener {

    private JRadioButton rbt_query, rbt_queryAll, rbt_insert, rbt_update, rbt_deleteOne, rbt_deleteAll;

    private ButtonGroup bg;

    private JLabel jb_id, jb_name, jb_age, jb_separator1, jb_rank, jb_separator2, jb_gender, jb_subject, jb_score, jb_separator3, jb_sum, jb_separator4;

    private JTextField jtf_id, jtf_name, jtf_age1, jtf_age2, jtf_rank1, jtf_rank2, jtf_gender, jtf_subject, jtf_score1, jtf_score2, jtf_sum1, jtf_sum2;

    private JButton bt_clear, bt_query;

    private JRadioButton rbt_header;

    private JButton bt_readTxt,bt_saveTxt,bt_readTable,bt_saveTable;

    private StudentSevice studentSevice;

    private MyJTable jTable;

    private DataTxtAndExcel dataTxt=new DataTxtAndExcel();

    public MenuPanel() {
        this.initComponent();
    }

    public MenuPanel(StudentSevice studentSevice,MyJTable jTable){
        this.studentSevice=studentSevice;
        this.jTable=jTable;
        this.initComponent();
    }

    /**
     * 所有组件进行初始化
     */
    private void initComponent(){
        this.setLayout(null);
        this.initJRadioButton();
        this.initQueryComponent();
        this.initButton();
        this.addListener();
    }


    private void initJRadioButton() {
        rbt_queryAll = new JRadioButton("查询全部");
        rbt_insert = new JRadioButton("添加");
        rbt_update = new JRadioButton("修改");
        rbt_deleteOne = new JRadioButton("选择删除");
        rbt_deleteAll = new JRadioButton("删除全部");
        rbt_query = new JRadioButton("条件查询");

        rbt_queryAll.setBounds(50, 20, 80, 30);
        rbt_insert.setBounds(160, 20, 80, 30);
        rbt_update.setBounds(270, 20, 80, 30);
        rbt_deleteOne.setBounds(380, 20, 80, 30);
        rbt_deleteAll.setBounds(490, 20, 80, 30);
        rbt_query.setBounds(50, 60, 80, 30);

        bg = new ButtonGroup();
        bg.add(rbt_queryAll);
        bg.add(rbt_insert);
        bg.add(rbt_update);
        bg.add(rbt_deleteAll);
        bg.add(rbt_deleteOne);
        bg.add(rbt_query);

        this.add(rbt_queryAll);
        this.add(rbt_insert);
        this.add(rbt_update);
        this.add(rbt_deleteAll);
        this.add(rbt_deleteOne);
        this.add(rbt_query);

        rbt_header=new JRadioButton("其它操作");
        bg.add(rbt_header);
        rbt_header.setBounds(50,180,80,30);

        bt_readTxt=new JButton("文本导入");
        bt_saveTxt=new JButton("导入文本");
        bt_readTxt.setBounds(50,220,90,30);
        bt_saveTxt.setBounds(160,220,90,30);

        bt_readTable=new JButton("表格导入");
        bt_saveTable=new JButton("导入表格");
        bt_readTable.setBounds(280,220,90,30);
        bt_saveTable.setBounds(390,220,90,30);

        this.add(rbt_header);this.add(bt_readTxt);this.add(bt_saveTxt);
        this.add(bt_readTable);this.add(bt_saveTable);

    }

    private void initQueryComponent() {
        //学号
        jb_id = new JLabel("学号:");
        jtf_id = new JTextField();

        jb_id.setBounds(50, 100, 40, 30);
        jtf_id.setBounds(90, 105, 100, 25);
        this.add(jb_id);
        this.add(jtf_id);

        //姓名
        jb_name = new JLabel("姓名:");
        jtf_name = new JTextField();

        jb_name.setBounds(210, 100, 40, 30);
        jtf_name.setBounds(250, 105, 100, 25);
        this.add(jb_name);
        this.add(jtf_name);


        //年龄
        jb_age = new JLabel("年龄:");
        jtf_age1 = new JTextField();
        jb_separator1 = new JLabel("--");
        jtf_age2 = new JTextField();

        jb_age.setBounds(370, 100, 40, 30);
        jtf_age1.setBounds(410, 105, 40, 25);
        jb_separator1.setBounds(450, 105, 10, 25);
        jtf_age2.setBounds(460, 105, 40, 25);
        this.add(jb_age);
        this.add(jtf_age1);
        this.add(jb_separator1);
        this.add(jtf_age2);


        //性别
        jb_gender = new JLabel("性别:");
        jtf_gender = new JTextField();

        jb_gender.setBounds(520, 100, 40, 30);
        jtf_gender.setBounds(560, 105, 100, 25);
        this.add(jb_gender);
        this.add(jtf_gender);

        //科目
        jb_subject = new JLabel("科目:");
        jtf_subject = new JTextField();

        jb_subject.setBounds(50, 140, 40, 30);
        jtf_subject.setBounds(90, 145, 100, 25);
        this.add(jb_subject);
        this.add(jtf_subject);


        jb_score = new JLabel("分数:");
        jtf_score1 = new JTextField();
        jb_separator2 = new JLabel("--");
        jtf_score2 = new JTextField();

        jb_score.setBounds(210, 140, 40, 30);
        jtf_score1.setBounds(250, 145, 40, 25);
        jb_separator2.setBounds(290, 145, 10, 25);
        jtf_score2.setBounds(300, 145, 40, 25);
        this.add(jb_score);
        this.add(jtf_score1);
        this.add(jb_separator2);
        this.add(jtf_score2);

        //总分
        jb_sum = new JLabel("总分:");
        jtf_sum1 = new JTextField();
        jb_separator3 = new JLabel("--");
        jtf_sum2 = new JTextField();

        jb_sum.setBounds(370, 140, 40, 30);
        jtf_sum1.setBounds(410, 145, 40, 25);
        jb_separator3.setBounds(450, 145, 10, 25);
        jtf_sum2.setBounds(460, 145, 40, 25);
        this.add(jb_sum);
        this.add(jtf_sum1);
        this.add(jb_separator3);
        this.add(jtf_sum2);

        //排名
        jb_rank = new JLabel("名次:");
        jtf_rank1 = new JTextField();
        jb_separator4 = new JLabel("--");
        jtf_rank2 = new JTextField();

        jb_rank.setBounds(520, 140, 40, 30);
        jtf_rank1.setBounds(560, 145, 40, 25);
        jb_separator4.setBounds(600, 145, 10, 25);
        jtf_rank2.setBounds(610, 145, 40, 25);
        this.add(jb_rank);
        this.add(jtf_rank1);
        this.add(jb_separator4);
        this.add(jtf_rank2);

    }

    private void initButton() {
        bt_clear = new JButton("清空条件");
        bt_query = new JButton("点击查询");
        bt_clear.setBounds(680, 100, 90, 30);
        bt_query.setBounds(680, 140, 90, 30);

        this.add(bt_clear);
        this.add(bt_query);
    }

    private void addListener() {
        //1.文本框监听
        jtf_id.addKeyListener(this);
        jtf_name.addKeyListener(this);
        jtf_age1.addKeyListener(this);
        jtf_age2.addKeyListener(this);
        jtf_rank1.addKeyListener(this);
        jtf_rank2.addKeyListener(this);
        jtf_gender.addKeyListener(this);
        jtf_subject.addKeyListener(this);
        jtf_score1.addKeyListener(this);
        jtf_score2.addKeyListener(this);
        jtf_sum1.addKeyListener(this);
        jtf_sum2.addKeyListener(this);


        //2.按钮监听
        rbt_queryAll.addMouseListener(this);
        rbt_insert.addMouseListener(this);
        rbt_update.addMouseListener(this);
        rbt_deleteOne.addMouseListener(this);
        rbt_deleteAll.addMouseListener(this);
        bt_query.addMouseListener(this);
        bt_clear.addMouseListener(this);
        bt_readTxt.addMouseListener(this);
        bt_saveTxt.addMouseListener(this);
        bt_readTable.addMouseListener(this);
        bt_saveTable.addMouseListener(this);
    }

    /**
     * 清空所有文本域
     */
    private void clearContentAllJTextField() {
        jtf_id.setText("");
        jtf_name.setText("");
        jtf_age1.setText("");
        jtf_age2.setText("");
        jtf_rank1.setText("");
        jtf_rank2.setText("");
        jtf_gender.setText("");
        jtf_subject.setText("");
        jtf_score1.setText("");
        jtf_score2.setText("");
        jtf_sum1.setText("");
        jtf_sum2.setText("");
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getSource()==jtf_id && e.getKeyCode()==KeyEvent.VK_ENTER){
            if(jtf_id.getFocusTraversalKeysEnabled())
                jtf_name.requestFocus(true);

        }else if(e.getSource()==jtf_name && e.getKeyCode()==KeyEvent.VK_ENTER){
            if(jtf_name.getFocusTraversalKeysEnabled())
                jtf_age1.requestFocus(true);

        }else if(e.getSource()==jtf_age1 && e.getKeyCode()==KeyEvent.VK_ENTER){
            if(jtf_age1.getFocusTraversalKeysEnabled())
                jtf_age2.requestFocus(true);

        }else if(e.getSource()==jtf_age2 && e.getKeyCode()==KeyEvent.VK_ENTER){
            if(jtf_age2.getFocusTraversalKeysEnabled())
                jtf_gender.requestFocus(true);

        }else if(e.getSource()==jtf_gender && e.getKeyCode()==KeyEvent.VK_ENTER){
            if(jtf_gender.getFocusTraversalKeysEnabled())
                jtf_subject.requestFocus(true);

        }else if(e.getSource()==jtf_subject && e.getKeyCode()==KeyEvent.VK_ENTER){
            if(jtf_subject.getFocusTraversalKeysEnabled())
                jtf_score1.requestFocus(true);

        }else if(e.getSource()==jtf_score1 && e.getKeyCode()==KeyEvent.VK_ENTER){
            if(jtf_score1.getFocusTraversalKeysEnabled())
                jtf_score2.requestFocus(true);

        }else if(e.getSource()==jtf_score2 && e.getKeyCode()==KeyEvent.VK_ENTER){
            if(jtf_score2.getFocusTraversalKeysEnabled())
                jtf_sum1.requestFocus(true);

        }else if(e.getSource()==jtf_sum1 && e.getKeyCode()==KeyEvent.VK_ENTER){
            if(jtf_sum1.getFocusTraversalKeysEnabled())
                jtf_sum2.requestFocus(true);

        }else if(e.getSource()==jtf_sum2 && e.getKeyCode()==KeyEvent.VK_ENTER){
            if(jtf_sum2.getFocusTraversalKeysEnabled())
                jtf_rank1.requestFocus(true);

        }else if(e.getSource()==jtf_rank1 && e.getKeyCode()==KeyEvent.VK_ENTER){
            if(jtf_rank1.getFocusTraversalKeysEnabled())
                jtf_rank2.requestFocus(true);

        }else if(e.getSource()==jtf_rank2 && e.getKeyCode()==KeyEvent.VK_ENTER){
            if(jtf_rank2.getFocusTraversalKeysEnabled())
                this.queryStudentInformationByCondition();
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if(e.getSource()==bt_clear){
            this.clearContentAllJTextField();

        }else if(e.getSource()==bt_query){//条件查询
            this.queryStudentInformationByCondition();

        }else if(e.getSource()==rbt_queryAll){//查询全部
            ModelUtils.queryAllStudentsInformation(studentSevice,jTable);

        }else if(e.getSource()==rbt_insert){//添加
            new InsertAndUpdate("insert",studentSevice,jTable);

        }else if(e.getSource()==rbt_update){//修改
            this.updateStudentById();

        }else if(e.getSource()==rbt_deleteOne){//删除
            this.deleteStudentById();

        }else if(e.getSource()==rbt_deleteAll){
            studentSevice.deleteAllStudentsInformation();
            ModelUtils.queryAllStudentsInformation(studentSevice,jTable);

        }else if(e.getSource()==bt_readTxt){//导入文本文档
            ArrayList<Student> students = dataTxt.readFromTxt();
            MyTable myTable = new MyTable(students);
            jTable.setModel(myTable);

        }else if(e.getSource()==bt_saveTxt){
            ArrayList<Student> students = studentSevice.queryAllStudentsInformation();
            dataTxt.writeToTxt(students);

        }else if(e.getSource()==bt_readTable){
            ArrayList<Student> students = dataTxt.readFromExcel();
            MyTable myTable = new MyTable(students);
            jTable.setModel(myTable);

        }else if(e.getSource()==bt_saveTable){
            dataTxt.writeToExcel(jTable);

        }
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }

    /**
     * 修改学生列表
     */
    private void updateStudentById(){
        int row=jTable.getSelectedRow();
        if(row==-1){
            JOptionPane.showMessageDialog(null,"请选中要修改的行再执行该命令");
            return;
        }else {
            long id= (Long) jTable.getValueAt(row,0);
            Student student=studentSevice.queryStudentById(id);
            if (student != null) {
                new InsertAndUpdate("update",studentSevice,jTable,student);
            }else{
                JOptionPane.showMessageDialog(null,"无效选择,系统没有该学生的信息!");
            }

        }
    }

    /**
     * 根据ID删除学生
     */
    private void deleteStudentById(){
        int[] rows = jTable.getSelectedRows();
        if(rows ==null){
            JOptionPane.showMessageDialog(null,"请选中要删除的行再执行该命令");
            return;
        }else {
                Long[] id = new Long[rows.length];
                for (int i = 0; i < rows.length; i++) {
                    id[i] = (Long) jTable.getValueAt(rows[i], 0);
                }
                boolean result = studentSevice.deleteStudentByIds(id);
                ModelUtils.queryAllStudentsInformation(studentSevice, jTable);
                if (result == false) {
                    JOptionPane.showMessageDialog(null, "删除失败!");
                }
        }
    }

    /**
     * 条件查询学生
     */
    private void queryStudentInformationByCondition(){
        //1.创建两个数组,分别存储名称和值
        String[] name=new String[11];
        String[] value=new String[11];

        //2.判断学号,将结果添加到数组中
        this.dealStudentStuID(name,value);

        //3.判断姓名
        this.dealStudentStuName(name,value);

        //4.判断性别
        this.dealStudentStuGender(name,value);

        //5.判断年龄
        this.dealStudentStuAge(name,value);

        //6.判断科目成绩
        this.dealStudentSubjectScore(name,value);

        //7.判断总分
        this.dealStudentScoreSum(name,value);

        //8.判断排名
        this.dealStudentRank(name,value);

        //9.调用方法执行
        ArrayList<Student> students=studentSevice.queryStudentInformationByCondition(name, value);
        if (students != null) {
            MyTable myTable = new MyTable(students);
            jTable.setModel(myTable);
        }else {
            JOptionPane.showMessageDialog(null,"没有查询到任何信息");
        }

    }

    /**
     * 判断查询条件之学号
     * @param name 属性名数组
     * @param value 属性值数组
     */
    private void dealStudentStuID(String[] name, String[] value) {
        String text = jtf_id.getText();
        if(Regex.isRequiredStuID(text)){
            name[0]="stu_ID";
            value[0]=text;
        }else{
            name[0]=null;
            value[0]=null;
        }
    }

    /**
     * 判断查询条件之姓名
     * @param name 属性名数组
     * @param value 属性值数组
     */
    private void dealStudentStuName(String[] name, String[] value) {
        String text = jtf_name.getText();
        if(Regex.isRequiredStuName(text)){
            name[1]="stu_name";
            value[1]=text;
        }else{
            name[1]=null;
            value[1]=null;
        }
    }

    /**
     * 判断查询条件之性别
     * @param name 属性名数组
     * @param value 属性值数组
     */
    private void dealStudentStuGender(String[] name, String[] value) {
        String text = jtf_gender.getText();
        if(Regex.isRequiredStuGender(text)){
            name[2]="stu_gender";
            value[2]=text;
        }else{
            name[2]=null;
            value[2]=null;
        }
    }

    /**
     * 判断查询条件之年龄
     * @param name 属性名数组
     * @param value 属性值数组
     */
    private void dealStudentStuAge(String[] name, String[] value) {
        String text1 = jtf_age1.getText();
        String text2 = jtf_age2.getText();
        if(Regex.isRequiredStuAge(text1)){
            name[3]="stu_age";
            value[3]=text1;
        }else{
            name[3]=null;
            value[3]=null;
        }
        if(Regex.isRequiredStuAge(text2)){
            name[4]="stu_age";
            value[4]=text2;
        }else{
            name[4]=null;
            value[4]=null;
        }
    }

    /**
     * 判断查询条件之科目的分数
     * @param name 属性名数组
     * @param value 属性值数组
     */
    private void dealStudentSubjectScore(String[] name, String[] value) {
        String text1 = jtf_score1.getText();
        String text2 = jtf_score2.getText();
        String text = jtf_subject.getText();
        text=text.toLowerCase();

        if(text.equals("java")||text.equals("python")||text.equals("computer")){
            if(Regex.isRequiredStuScore(text1)){
                name[5]=text;
                value[5]=text1;
            }else{
                name[5]=null;
                value[5]=null;
            }
            if(Regex.isRequiredStuScore(text2)){
                name[6]=text;
                value[6]=text2;
            }else{
                name[6]=null;
                value[6]=null;
            }
        }
    }

    /**
     * 判断查询条件之总分
     * @param name 属性名数组
     * @param value 属性值数组
     */
    private void dealStudentScoreSum(String[] name, String[] value) {
        String text1 = jtf_sum1.getText();
        String text2 = jtf_sum2.getText();
        if(Regex.isRequiredInteger(text1)){
            name[7]="scoreSum";
            value[7]=text1;
        }else{
            name[7]=null;
            value[7]=null;
        }
        if(Regex.isRequiredInteger(text2)){
            name[8]="scoreSum";
            value[8]=text2;
        }else{
            name[8]=null;
            value[8]=null;
        }
    }


    /**
     * 判断查询条件之名次
     * @param name 属性名数组
     * @param value 属性值数组
     */
    private void dealStudentRank(String[] name, String[] value) {
        String text1 = jtf_rank1.getText();
        String text2 = jtf_rank2.getText();
        if(Regex.isRequiredRank(text1)){
            name[9]="ranking";
            value[9]=text1;
        }else{
            name[9]=null;
            value[9]=null;
        }
        if(Regex.isRequiredRank(text2)){
            name[10]="ranking";
            value[10]=text2;
        }else{
            name[10]=null;
            value[10]=null;
        }
    }


}


==================================================================================================================================================================================
crud菜单操作界面
package com.study.myPage;

import com.study.bean.Student;
import com.study.myTable.MyJTable;
import com.study.service.StudentSevice;
import com.study.utils.ModelUtils;
import com.study.utils.MyFont;
import com.study.utils.Regex;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.math.BigDecimal;
import java.text.DecimalFormat;

public class InsertAndUpdate extends JDialog implements MouseListener, KeyListener {
    private JLabel jb_stuID, jb_stuName, jb_stuGender, jb_stuAge, jb_java, jb_python, jb_computer;

    private JLabel jb_stuID1, jb_stuName1, jb_stuGender1, jb_stuAge1, jb_java1, jb_python1, jb_computer1;

    private JTextField jtf_stuID, jtf_stuName, jtf_stuGender, jtf_stuAge, jtf_java, jtf_python, jtf_computer;

    private JButton bt_submit, bt_cancle, bt_clear;

    private String action;

    private StudentSevice studentSevice;

    private MyJTable jTable;

    private Student updateStudent;

    public InsertAndUpdate(String action, StudentSevice studentSevice, MyJTable jTable) {
        this.action = action;
        this.studentSevice = studentSevice;
        this.jTable = jTable;
        this.initDialog();
    }

    public InsertAndUpdate(String action, StudentSevice studentSevice, MyJTable jTable, Student student) {
        this.action = action;
        this.studentSevice = studentSevice;
        this.jTable = jTable;
        this.updateStudent = student;
        this.initDialog();
    }

    public void initComponent() {
        this.setLayout(null);

        jb_stuID = new JLabel("学          号:");
        if ("update".equals(action)) {
            jtf_stuID = new JTextField(updateStudent.getStu_ID());
            jtf_stuID.setEditable(false);
        } else if ("insert".equals(action)) {
            jtf_stuID = new JTextField();
        }


        jb_stuID.setBounds(50, 30, 80, 30);
        jtf_stuID.setBounds(125, 30, 100, 30);

        jb_stuName = new JLabel("姓          名:");
        if ("update".equals(action)) {
            jtf_stuName = new JTextField(updateStudent.getStu_name());
        } else if ("insert".equals(action)) {
            jtf_stuName = new JTextField();
        }


        jb_stuName.setBounds(50, 80, 80, 30);
        jtf_stuName.setBounds(125, 80, 100, 30);

        jb_stuGender = new JLabel("性          别:");
        if ("update".equals(action)) {
            jtf_stuGender = new JTextField(updateStudent.getStu_gender());
        } else if ("insert".equals(action)) {
            jtf_stuGender = new JTextField();
        }


        jb_stuGender.setBounds(50, 130, 80, 30);
        jtf_stuGender.setBounds(125, 130, 100, 30);

        jb_stuAge = new JLabel("年          龄:");
        if ("update".equals(action)) {
            jtf_stuAge = new JTextField(updateStudent.getStu_age()+"");
        } else if ("insert".equals(action)) {
            jtf_stuAge = new JTextField();
        }


        jb_stuAge.setBounds(50, 180, 80, 30);
        jtf_stuAge.setBounds(125, 180, 100, 30);

        jb_java = new JLabel("java:");
        if ("update".equals(action)) {
            jtf_java = new JTextField(updateStudent.getJava()+"");
        } else if ("insert".equals(action)) {
            jtf_java = new JTextField();
        }


        jb_java.setBounds(50, 230, 80, 30);
        jtf_java.setBounds(125, 230, 100, 30);

        jb_python = new JLabel("Python:");
        if ("update".equals(action)) {
            jtf_python = new JTextField(updateStudent.getPython()+"");
        } else if ("insert".equals(action)) {
            jtf_python = new JTextField();
        }


        jb_python.setBounds(50, 280, 80, 30);
        jtf_python.setBounds(125, 280, 100, 30);

        jb_computer = new JLabel("computer:");
        if ("update".equals(action)) {
            jtf_computer = new JTextField(updateStudent.getComputer()+"");
        } else if ("insert".equals(action)) {
            jtf_computer = new JTextField();
        }


        jb_computer.setBounds(50, 330, 80, 30);
        jtf_computer.setBounds(125, 330, 100, 30);

        this.add(jb_stuID);
        this.add(jtf_stuID);
        this.add(jb_stuName);
        this.add(jtf_stuName);
        this.add(jb_stuGender);
        this.add(jtf_stuGender);
        this.add(jb_stuAge);
        this.add(jtf_stuAge);
        this.add(jb_java);
        this.add(jtf_java);
        this.add(jb_python);
        this.add(jtf_python);
        this.add(jb_computer);
        this.add(jtf_computer);

        //信息提示部门
        if ("insert".equals(action)) {
            jb_stuID1 = new JLabel("学号以2021开头,后接6位任意数字");
            jb_stuID1.setFont(MyFont.font9);
            jb_stuID1.setForeground(Color.BLUE);
            jb_stuID1.setBounds(225, 30, 260, 30);
            this.add(jb_stuID1);
        }

        jb_stuName1 = new JLabel("只能是中文,长度[2,5]");
        jb_stuName1.setFont(MyFont.font9);
        jb_stuName1.setForeground(Color.BLUE);
        jb_stuName1.setBounds(225, 80, 200, 30);
        this.add(jb_stuName1);
        jb_stuGender1 = new JLabel("仅可以输入男或女");
        jb_stuGender1.setFont(MyFont.font9);
        jb_stuGender1.setForeground(Color.BLUE);
        jb_stuGender1.setBounds(225, 130, 200, 30);
        this.add(jb_stuGender1);
        jb_stuAge1 = new JLabel("年龄范围:[3-60]整数");
        jb_stuAge1.setFont(MyFont.font9);
        jb_stuAge1.setForeground(Color.BLUE);
        jb_stuAge1.setBounds(225, 180, 200, 30);
        this.add(jb_stuAge1);
        jb_java1 = new JLabel("分数范围:[0-100]整数");
        jb_java1.setFont(MyFont.font9);
        jb_java1.setForeground(Color.BLUE);
        jb_java1.setBounds(225, 230, 200, 30);
        this.add(jb_java1);
        jb_python1 = new JLabel("分数范围:[0-100]整数");
        jb_python1.setFont(MyFont.font9);
        jb_python1.setForeground(Color.BLUE);
        jb_python1.setBounds(225, 280, 200, 30);
        this.add(jb_python1);
        jb_computer1 = new JLabel("分数范围:[0-100]整数");
        jb_computer1.setFont(MyFont.font9);
        jb_computer1.setForeground(Color.BLUE);
        jb_computer1.setBounds(225, 330, 200, 30);
        this.add(jb_computer1);


        bt_submit = new JButton("提交");
        bt_clear = new JButton("清空");
        bt_cancle = new JButton("取消");
        bt_submit.setBounds(80, 390, 60, 30);
        bt_cancle.setBounds(190, 390, 60, 30);
        bt_clear.setBounds(300, 390, 60, 30);
        this.add(bt_submit);
        this.add(bt_cancle);
        this.add(bt_clear);


    }

    private void addListener() {
        //鼠标监听
        jtf_stuName.addMouseListener(this);
        jtf_stuGender.addMouseListener(this);
        jtf_stuAge.addMouseListener(this);
        jtf_java.addMouseListener(this);
        jtf_python.addMouseListener(this);
        jtf_computer.addMouseListener(this);
        bt_submit.addMouseListener(this);
        bt_cancle.addMouseListener(this);
        bt_clear.addMouseListener(this);


        //键盘监听
        if ("insert".equals(action))
            jtf_stuID.addKeyListener(this);
        jtf_stuName.addKeyListener(this);
        jtf_stuGender.addKeyListener(this);
        jtf_stuAge.addKeyListener(this);
        jtf_java.addKeyListener(this);
        jtf_python.addKeyListener(this);
        jtf_computer.addKeyListener(this);

    }

    private void initDialog() {
        this.initComponent();
        this.addListener();
        if ("update".equals(action))
            this.setTitle("修改学生界面");
        else if ("insert".equals(action))
            this.setTitle("添加学生界面");
        this.setSize(500, 500);
        this.setResizable(false);
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        this.setVisible(true);
    }

    /**
     * 判断学号是否符合要求
     *
     * @return 返回布尔值,true符合,false不符合
     */
    private boolean isRequiredStuID() {
        String stuId = jtf_stuID.getText();
        if (stuId != null && stuId.equals("") == false) {
            if (Regex.isRequiredStuID(stuId)) {
                    if (studentSevice.queryStudentByStuID(stuId)) {
                        jb_stuID1.setText("学号以2021开头,后接6位任意数字");
                        jb_stuID1.setForeground(Color.BLUE);
                        return true;
                    } else {
                        jb_stuID1.setText("该学号已经存在,要求学号唯一性!");
                    }

            } else {
                jb_stuID1.setText("输入的学号不符合要求!");
            }
        } else {
            jb_stuID1.setText("内容不能为空");

        }
        jb_stuID1.setForeground(Color.RED);
        return false;

    }

    /**
     * 判断名字是否符合要求
     *
     * @return 返回布尔值,true符合,false不符合
     */
    private boolean isRequiredName() {
        String stuName = jtf_stuName.getText();
        if (stuName != null && stuName.equals("") == false) {
            if (Regex.isRequiredStuName(stuName)) {
                jb_stuName1.setText("只能是中文,长度[2,5]");
                jb_stuName1.setForeground(Color.BLUE);
                return true;
            } else {
                jb_stuName1.setText("输入的姓名不符合要求!");
            }
        } else {
            jb_stuName1.setText("内容不能为空");
        }
        jb_stuName1.setForeground(Color.RED);
        return false;

    }

    /**
     * 判断性别输入是否符合要求
     *
     * @return 返回布尔值,true符合,false不符合
     */
    private boolean isRequiredGender() {
        String stuGender = jtf_stuGender.getText();
        if (stuGender != null && stuGender.equals("") == false) {
            if (Regex.isRequiredStuGender(stuGender)) {
                jb_stuGender1.setText("仅可以输入男或女");
                jb_stuGender1.setForeground(Color.BLUE);
                return true;
            } else {
                jb_stuGender1.setText("输入的性别不符合要求!");
            }
        } else {
            jb_stuGender1.setText("内容不能为空");
        }
        jb_stuGender1.setForeground(Color.RED);
        return false;
    }

    /**
     * 判断性别输入是否符合要求
     *
     * @return 返回布尔值,true符合,false不符合
     */
    private boolean isRequiredAge() {
        String stuAge = jtf_stuAge.getText();
        if (stuAge != null && stuAge.equals("") == false) {
            if (Regex.isRequiredStuAge(stuAge)) {
                jb_stuAge1.setText("年龄范围:[3-60]整数");
                jb_stuAge1.setForeground(Color.BLUE);
                return true;
            } else {
                jb_stuAge1.setText("输入的年龄不符合要求!");
            }
        } else {
            jb_stuAge1.setText("内容不能为空");
        }
        jb_stuAge1.setForeground(Color.RED);
        return false;
    }

    /**
     * 判断年龄输入是否符合要求
     *
     * @return 返回布尔值,true符合,false不符合
     */
    private boolean isRequiredScore(JTextField jtf, JLabel jb) {
        String inStr = jtf.getText();
        if (inStr != null && inStr.equals("") == false) {
            if (Regex.isRequiredStuScore(inStr)) {
                jb.setText("分数范围:[0-100]整数");
                jb.setForeground(Color.BLUE);
                return true;
            } else {
                jb.setText("输入的分数不符合要求!");
            }
        } else {
            jb.setText("内容不能为空");
        }
        jb.setForeground(Color.RED);
        return false;
    }

    /**
     * 判断是否是所有条件都满足
     *
     * @return 返回布尔值,true均满足,false不满足
     */
    private boolean isAllRequiredConditon() {
        boolean requiredName = this.isRequiredName();
        boolean requiredGender = this.isRequiredGender();
        boolean requiredAge = this.isRequiredAge();
        boolean requiredScoreJava = this.isRequiredScore(jtf_java, jb_java1);
        boolean requiredScorePython = this.isRequiredScore(jtf_python, jb_python1);
        boolean requiredScoreComputer = this.isRequiredScore(jtf_computer, jb_computer1);

        if (requiredName && requiredGender && requiredAge && requiredScoreJava && requiredScorePython && requiredScoreComputer){
            if("insert".equals(action)){
                if(this.isRequiredStuID())
                    return true;
            }else{
                return true;
            }
        }
        return false;

    }

    /**
     * 添加学生
     */
    private void insertStudent() {
        if (this.isAllRequiredConditon()) {
            Student student = this.getInsertStudent();
            boolean insert = studentSevice.insertStudent(student);
            if (insert) {
                JOptionPane.showMessageDialog(null, "添加成功!");
                ModelUtils.queryAllStudentsInformation(studentSevice, jTable);
            } else {
                JOptionPane.showMessageDialog(null, "添加失败!");
            }

        } else {
            JOptionPane.showMessageDialog(null, "有错误,请检查!");
        }

    }

    /**
     * 修改学生的信息
     */
    private void updateStudent() {
        if (this.isAllRequiredConditon()) {
            Student student = this.getUpdateStudent();
            boolean update = studentSevice.updateStudent(student);
            if (update) {
                JOptionPane.showMessageDialog(null, "修改成功!");
                ModelUtils.queryAllStudentsInformation(studentSevice, jTable);
            } else {
                JOptionPane.showMessageDialog(null, "修改失败!");
            }

        } else {
            JOptionPane.showMessageDialog(null, "有错误,请检查!");
        }

    }


    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        if ("insert".equals(action)&&e.getSource() == jtf_stuID && e.getKeyCode() == KeyEvent.VK_ENTER) {
            if (jtf_stuID.getFocusTraversalKeysEnabled())
                if (this.isRequiredStuID())
                    jtf_stuName.requestFocus(true);
                else
                    jtf_stuID.requestFocus(true);


        } else if (e.getSource() == jtf_stuName && e.getKeyCode() == KeyEvent.VK_ENTER) {
            if (jtf_stuName.getFocusTraversalKeysEnabled())
                if (this.isRequiredName())
                    jtf_stuGender.requestFocus(true);
                else
                    jtf_stuName.requestFocus(true);


        } else if (e.getSource() == jtf_stuGender && e.getKeyCode() == KeyEvent.VK_ENTER) {
            if (jtf_stuGender.getFocusTraversalKeysEnabled())
                if (this.isRequiredGender())
                    jtf_stuAge.requestFocus(true);
                else
                    jtf_stuGender.requestFocus(true);

        } else if (e.getSource() == jtf_stuAge && e.getKeyCode() == KeyEvent.VK_ENTER) {
            if (jtf_stuAge.getFocusTraversalKeysEnabled())
                if (this.isRequiredAge())
                    jtf_java.requestFocus(true);
                else
                    jtf_stuAge.requestFocus(true);

        } else if (e.getSource() == jtf_java && e.getKeyCode() == KeyEvent.VK_ENTER) {
            if (jtf_java.getFocusTraversalKeysEnabled())
                if (this.isRequiredScore(jtf_java, jb_java1))
                    jtf_python.requestFocus(true);
                else
                    jtf_java.requestFocus(true);

        } else if (e.getSource() == jtf_python && e.getKeyCode() == KeyEvent.VK_ENTER) {
            if (jtf_python.getFocusTraversalKeysEnabled())
                if (this.isRequiredScore(jtf_python, jb_python1))
                    jtf_computer.requestFocus(true);
                else
                    jtf_python.requestFocus(true);

        } else if (e.getSource() == jtf_computer && e.getKeyCode() == KeyEvent.VK_ENTER) {
            if (jtf_computer.getFocusTraversalKeysEnabled())
                this.carrySubmit();
        }
    }

    /**
     * 执行提交操作
     */
    private void carrySubmit() {
        if (this.isRequiredScore(jtf_computer, jb_computer1)) {
            if ("update".equals(action)) {
                this.updateStudent();
            } else if ("insert".equals(action)) {
                this.insertStudent();
            }
        } else {
            jtf_computer.requestFocus(true);
        }
    }


    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if (e.getSource() == bt_submit) {
            this.carrySubmit();

        } else if (e.getSource() == bt_cancle) {
            this.dispose();

        } else if (e.getSource() == jtf_stuName) {
            if ("insert".equals(action)&&this.isRequiredStuID() == false)
                jtf_stuID.requestFocus(true);

        } else if (e.getSource() == jtf_stuGender) {
            if (this.isRequiredName() == false)
                jtf_stuName.requestFocus(true);

        } else if (e.getSource() == jtf_stuAge) {
            if (this.isRequiredGender() == false)
                jtf_stuGender.requestFocus(true);


        } else if (e.getSource() == jtf_java) {
            if (this.isRequiredAge() == false)
                jtf_stuAge.requestFocus(true);


        } else if (e.getSource() == jtf_python) {
            if (this.isRequiredScore(jtf_java, jb_java1) == false)
                jtf_java.requestFocus(true);

        } else if (e.getSource() == jtf_computer) {
            if (this.isRequiredScore(jtf_python, jb_python1) == false)
                jtf_python.requestFocus(true);

        } else if (e.getSource() == bt_clear) {
            this.clearAllJTextField();
        }

    }

    private void clearAllJTextField() {
        if ("insert".equals(action))
            jtf_stuID.setText("");
        jtf_stuName.setText("");
        jtf_stuGender.setText("");
        jtf_stuAge.setText("");
        jtf_java.setText("");
        jtf_python.setText("");
        jtf_computer.setText("");

    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }

    private Student getInsertStudent() {
        Student student = new Student();
        student.setStu_ID(jtf_stuID.getText());
        student.setStu_name(jtf_stuName.getText());
        student.setStu_gender(jtf_stuGender.getText());
        student.setStu_age(Integer.parseInt(jtf_stuAge.getText()));
        int java = Integer.parseInt(jtf_java.getText());
        int python = Integer.parseInt(jtf_python.getText());
        int computer = Integer.parseInt(jtf_computer.getText());
        student.setJava(java);
        student.setPython(python);
        student.setComputer(computer);

        int sum = java + python + computer;
        student.setScoreSum(sum);
        student.setScoreAvg(this.getStudentScoreAvg(sum));

        return student;
    }

    private Student getUpdateStudent()
    {
        updateStudent.setStu_name(jtf_stuName.getText());
        updateStudent.setStu_gender(jtf_stuGender.getText());
        updateStudent.setStu_age(Integer.parseInt(jtf_stuAge.getText()));
        int java = Integer.parseInt(jtf_java.getText());
        int python = Integer.parseInt(jtf_python.getText());
        int computer = Integer.parseInt(jtf_computer.getText());
        updateStudent.setJava(java);
        updateStudent.setPython(python);
        updateStudent.setComputer(computer);

        int sum=java+python+computer;
        updateStudent.setScoreSum(sum);
        updateStudent.setScoreAvg(this.getStudentScoreAvg(sum));

        return updateStudent;
    }

    private BigDecimal getStudentScoreAvg(Integer sum) {
        DecimalFormat df=new DecimalFormat("0.00");
        String format = df.format(new BigDecimal(sum*1.0/3));
        return new BigDecimal(format);
    }

}

==================================================================================================================================================================================
表格模型界面
package com.study.myTable;

import com.study.bean.Student;
import com.study.service.StudentSevice;
import com.study.utils.ModelUtils;
import com.study.utils.Regex;

import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;

public class MyTable extends AbstractTableModel implements TableModelListener {
    private StudentSevice studentSevice;

    public ArrayList list=new ArrayList<>();

    public ArrayList<String> header=new ArrayList<>();


    /**
     * 获取列名
     */
    {
        //1.初始化列名
        header.add("序号");
        header.add("学号");
        header.add("姓名");
        header.add("性别");
        header.add("年龄");
        header.add("java");
        header.add("Python");
        header.add("computer");
        header.add("总分");
        header.add("平均分");
        header.add("名次");
    }


    /**
     * 获取行数
     *
     * @return 返回总行数
     */
    @Override
    public int getRowCount() {
        return list.size();
    }

    /**
     * 获取列数
     *
     * @return 返回总列数
     */
    @Override
    public int getColumnCount() {
        return header.size();
    }

    /**
     * 获取列名
     *
     * @param column 列号
     * @return 得到列名
     */
    @Override
    public String getColumnName(int column) {
        return this.header.get(column);
    }

    /**
     * 获取单元格的值
     *
     * @param rowIndex 行号
     * @param columnIndex 列号
     * @return 得到对应单元格的具体值
     */
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return ((ArrayList)list.get(rowIndex)).get(columnIndex);
    }

    /**
     *  更新单元格的值
     *
     * @param newValue 修改的新值
     * @param rowIndex 行号
     * @param columnIndex 列号
     */
    @Override
    public void setValueAt(Object newValue, int rowIndex, int columnIndex) {
        ((ArrayList)this.list.get(rowIndex)).set(columnIndex,newValue);
        fireTableCellUpdated(rowIndex,columnIndex);
    }



    public MyTable(StudentSevice studentSevice){
        this.studentSevice=studentSevice;
        this.queryAllStudentsInformation();
        this.addTableModelListener(this);

    }

    public MyTable(ArrayList<Student> students){
        this.initArrayListContent(students);
        this.addTableModelListener(this);
    }


    /**
     * 将信息添加到集合中用于显示
     *
     * @param students 对象的信息集合
     */
    private void initArrayListContent(ArrayList<Student> students){
        if (students != null) {
            for (Student student : students) {
                ArrayList list1=new ArrayList();
                list1.add(student.getId());
                list1.add(student.getStu_ID());
                list1.add(student.getStu_name());
                list1.add(student.getStu_gender());
                list1.add(student.getStu_age());
                list1.add(student.getJava());
                list1.add(student.getPython());
                list1.add(student.getComputer());
                list1.add(student.getScoreSum());
                list1.add(student.getScoreAvg());
                list1.add(student.getRanking());
                list.add(list1);
            }
        }
    }


    /**
     * 查询全部并显示所有信息
     */
    private void queryAllStudentsInformation(){
        ArrayList<Student> students = studentSevice.queryAllStudentsInformation();
        this.initArrayListContent(students);
    }


    /**
     * 表格监听,实现各种功能操作
     *
     * @param e
     */
    @Override
    public void tableChanged(TableModelEvent e) {
        int firstRow = e.getFirstRow();
        int lastRow=e.getLastRow();

        int column=e.getColumn();

        /**
         * 	事件的类型值有:
         *  TableModelEvent.INSERT;
         *  TableModelEvent.UPDATE;
         *  TableModelEvent.DELETE;
         */


        int type=e.getType();

        if(type==TableModelEvent.UPDATE) {
            String inStr=String.valueOf(this.getValueAt(firstRow,column));
            if(column >4 && column<8){
                if(Regex.isRequiredStuScore(inStr)){
                    // 获取单元格的值,同时获取其附近的其它值
                    String value1=String.valueOf(this.getValueAt(firstRow,5));
                    String value2=String.valueOf(this.getValueAt(firstRow,6));
                    String value3=String.valueOf(this.getValueAt(firstRow,7));

                    Student student=new Student();
                    student.setJava(Integer.parseInt(value1));
                    student.setPython(Integer.parseInt(value2));
                    student.setComputer(Integer.parseInt(value3));

                    // 总分、平均分更新
                    int sum=student.getJava()+student.getPython()+student.getComputer();
                    BigDecimal avg = new BigDecimal((sum * 1.0) / 3);
                    DecimalFormat df=new DecimalFormat("0.00");
                    BigDecimal format = new BigDecimal(df.format(avg));

                    student.setScoreSum(sum);
                    student.setScoreAvg(format);
                    student.setId(Long.parseLong(String.valueOf(this.getValueAt(firstRow,0))));

                    // 表格值更新
                    this.setValueAt(sum,firstRow,8);
                    this.setValueAt(format,firstRow,9);

                    // 更新数据表
                    studentSevice.updateStudentScore(student);

                    // 名次更新
                    ArrayList<Student> students = studentSevice.queryAllStudentsInformationOrderBySumDesc();
                    ModelUtils.updateStudentsRanking(students,studentSevice);
                    students = studentSevice.queryAllStudentsInformation();
                    if (students != null) {
                        for (int i = 0; i < students.size(); i++) {
                            this.setValueAt(students.get(i).getRanking(),i,10);
                        }

                    }

                }
            }
            System.out.println("执行了?");
        }else if(type==TableModelEvent.DELETE){
            System.out.println("删除啦");

        }else if(type==TableModelEvent.INSERT){
            System.out.println("添加啦");

        }


    }
}




 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你好,2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值