学生成绩管理系统(java swing)

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.filechooser.FileNameExtensionFilter;

class Interface {
    JFrame jf = new JFrame("From:shish");
    JPanel jp1 = new JPanel(), jp2 = new JPanel(), jpinit = new JPanel(), jpAbout = new JPanel();
    JPanel jptitle = new JPanel();
    Box vbox1 = Box.createVerticalBox(); // 底下编辑垂直分布
    Box vboxmain = Box.createVerticalBox(); // 主要展示面垂直分布
    Menu m = new Menu(); // 菜单
    editBottom eb = new editBottom(); // 底部编辑框
    Data d = new Data(); // 数据处理
    File nfile = null; // 保存地址
    File rfile = null; // 读取文件地址
    public int now_number = 0; // 系统中学生数量
    public int now_sum = 0;  // 是否展示总分
    public int now_avg = 0; // 是否展示平均分
    public int new_file = 0; // 是否存在新建的页面
    public int fenxi = 0; // 是否展示数据分析
    public int now_view = 0; // 是否为视图状态
    public int now_save = 0; // 是否保存

    // 主页
    public void initInterface() {
        vboxmain.removeAll();
        JTextArea jta = new JTextArea();
        jta.setBackground(Color.white);
        jta.setText("



                                                  " +
                " 欢 迎 
                         " +
                "           使 用 学 生 管 理 系 统 !


         " +
                "                   独学而无友┗( ▔, ▔ )┛则孤陋寡闻             " +
                "              
		 ღゝ◡╹)ノ♡






");
        jta.setFont(new Font("华文行楷", Font.PLAIN, 34));
        jta.setEditable(false);
        jpinit.add(jta, "Center");
        vboxmain.add(jpinit);
        vboxmain.repaint();
        jf.add(vboxmain);
    }
    // 菜单关于界面
    public void aboutInterface() {
        JTextArea jta = new JTextArea();
        jta.setBackground(Color.white);
        jta.setText("

作者:shish                                     " +
                "                                                      " +
                "
博客:https://www.cnblogs.com/shish
" +
                "GitHub:https://github.com/shishenhao
" +
                "关于作者:超级无敌的菜鸡
" +
                "声援作者:您的鼓励是作者的最大动力!










");
        jta.setFont(new Font("华文行楷", Font.PLAIN, 32));
        jta.setEditable(false);
        jpAbout.add(jta, "Center");
        vboxmain.add(jpAbout);
        jf.add(vboxmain);
    }
    // 新建一个窗口的界面
    public void newCreate() {
        jptitle.removeAll();
        JTextArea jta = new JTextArea(1, 70);
        jta.setBackground(Color.white);
        jta.setEditable(false);
        jta.setFont(new Font("华文行楷", Font.PLAIN, 28));
        jta.setText("                               		               学 生 成 绩 管 理 系 统  ");
        JTextArea jtaa = new JTextArea(1, 70);
        jtaa.setBackground(Color.LIGHT_GRAY);
        jtaa.setFont(new Font("微软雅黑", Font.PLAIN, 22));
        jtaa.setEditable(false);
        jtaa.setText("	                 编号         |        学号         |        姓名        |       课程1        |        课程2        |        总分          ");
        vboxmain.removeAll();
        jptitle.add(jta);
        jptitle.add(jtaa);
        vboxmain.add(jptitle);
        vboxmain.repaint();
        jf.setVisible(true);
    }
    // 展现数据
    public void showData() {
        JTextArea[] jtas = new JTextArea[20];
        vboxmain.removeAll();
        jptitle.removeAll();
        JTextArea jta = new JTextArea(1, 70);
        jta.setBackground(Color.white);
        jta.setEditable(false);
        jta.setFont(new Font("华文行楷", Font.PLAIN, 28));
        jta.setText("                               		               学 生 成 绩 管 理 系 统  ");
        JTextArea jtaa = new JTextArea(1, 70);
        jtaa.setBackground(Color.LIGHT_GRAY);
        jtaa.setFont(new Font("微软雅黑", Font.PLAIN, 22));
        jtaa.setEditable(false);
        jtaa.setText("	                 编号         |        学号         |        姓名        |       课程1        |        课程2        |        总分          ");
        jptitle.add(jta);
        jptitle.add(jtaa);
        if (now_number <= 0) {
            vboxmain.add(jptitle);
            vboxmain.repaint();
            jf.setVisible(true);
            return;
        }
        for (int i = 1; i <= now_number; i++) {
            jtas[i] = new JTextArea();
            jtas[i].setBackground(Color.white);
            if (now_sum == 0) {
                jtas[i].setText(String.format("                     %d                  %s              %s%25.1f%25.1f    " +
                        "                                              ", i, d.zhuyao[i].id, d.zhuyao[i].name, d.zhuyao[i].grade[1], d.zhuyao[i].grade[2]));
            } else if (now_sum == 1) {
                jtas[i].setText(String.format("                     %d                  %s              %s%25.1f%25.1f%24.2f                  " +
                        "    ", i, d.zhuyao[i].id, d.zhuyao[i].name, d.zhuyao[i].grade[1], d.zhuyao[i].grade[2], d.zhuyao[i].grade[3]));
            }
            jtas[i].setFont(new Font("华文行楷", Font.PLAIN, 20));
            jtas[i].setEditable(false);
            jptitle.add(jtas[i]);
        }
        if (now_avg == 1) {
            JTextArea jav = new JTextArea();
            jav.setBackground(Color.white);
            jav.setFont(new Font("华文行楷", Font.PLAIN, 20));
            jav.setEditable(false);
            if (now_sum == 1) {
                jav.setText(String.format("               平均分                           " +
                        "                             %25.2f%25.2f%23.2f    " +
                        "                ", d.avg[1], d.avg[2], d.avg[3]));
            } else {
                jav.setText(String.format("                  平均分                                                         %25.2f%25.2f    " +
                        "                                              ", d.avg[1], d.avg[2]));
            }
            jptitle.add(jav);
        }
        jptitle.add(createEmptyJTA());
        if (fenxi == 1) {
            JTextArea jfx = new JTextArea();
            jfx.setBackground(Color.white);
            jfx.setFont(new Font("华文行楷", Font.PLAIN, 20));
            jfx.setEditable(false);
            d.analysis();
            jfx.setText(String.format(" 课程1成绩分析:优秀人数(>=85)为 %d 占比 %.2f,  " +
                            "良好人数(>=70)为 %d 占比 %.2f;                " +
                            "                              
                      " +
                            "    及格人数(>=60)为 %d 占比 %.2f,  不及格人数(<60)为 %d " +
                            "占比 %.2f。", d.numYouxiu[0], d.youxiuB[0], d.numLianghao[0], d.lianghaoB[0],
                    d.numJige[0], d.jigeB[0], d.numBujige[0], d.bujigeB[0]));
            jfx.append(String.format("
 课程2成绩分析:优秀人数(>=85)为 %d 占比 %.2f,  " +
                            "良好人数(>=70)为 %d 占比 %.2f;                " +
                            "                              
                      " +
                            "    及格人数(>=60)为 %d 占比 %.2f,  不及格人数(<60)为 %d " +
                            "占比 %.2f。", d.numYouxiu[1], d.youxiuB[1], d.numLianghao[1], d.lianghaoB[1],
                    d.numJige[1], d.jigeB[1], d.numBujige[1], d.bujigeB[1]));
            jptitle.add(jfx);
            jptitle.add(createEmptyJTA());
        }
        vboxmain.add(jptitle);
        vboxmain.repaint();
        jf.setVisible(true);
    }
    // 展现视图
    public void showView(){
        JTextArea[] jtas = new JTextArea[20];
        vboxmain.removeAll();
        jptitle.removeAll();
        JTextArea jta = new JTextArea(1, 70);
        jta.setBackground(Color.white);
        jta.setEditable(false);
        jta.setFont(new Font("华文行楷", Font.PLAIN, 28));
        jta.setText("                               		               学 生 成 绩 管 理 系 统  ");
        JTextArea jtaa = new JTextArea(1, 70);
        jtaa.setBackground(Color.LIGHT_GRAY);
        jtaa.setFont(new Font("微软雅黑", Font.PLAIN, 22));
        jtaa.setEditable(false);
        jtaa.setText("	                 编号         |        学号         |        姓名        |       课程1        |        课程2        |        总分          ");
        jptitle.add(jta);
        jptitle.add(jtaa);
        if (now_number <= 0) {
            vboxmain.add(jptitle);
            vboxmain.repaint();
            jf.setVisible(true);
            return;
        }
        for (int i = 1; i <= now_number; i++) {
            jtas[i] = new JTextArea();
            jtas[i].setBackground(Color.white);
            if (now_sum == 0) {
                jtas[i].setText(String.format("                     %d                  %s              %s%25.1f%25.1f    " +
                        "                                              ", i, d.vDate[i].id, d.vDate[i].name, d.vDate[i].grade[1], d.vDate[i].grade[2]));
            } else if (now_sum == 1) {
                jtas[i].setText(String.format("                     %d                  %s              %s%25.1f%25.1f%24.2f                  " +
                        "    ", i, d.vDate[i].id, d.vDate[i].name, d.vDate[i].grade[1], d.vDate[i].grade[2], d.vDate[i].grade[3]));
            }
            jtas[i].setFont(new Font("华文行楷", Font.PLAIN, 20));
            jtas[i].setEditable(false);
            jptitle.add(jtas[i]);
        }
        if (now_avg == 1) {
            JTextArea jav = new JTextArea();
            jav.setBackground(Color.white);
            jav.setFont(new Font("华文行楷", Font.PLAIN, 20));
            jav.setEditable(false);
            if (now_sum == 1) {
                jav.setText(String.format("               平均分                           " +
                        "                             %25.2f%25.2f%23.2f    " +
                        "                ", d.avg[1], d.avg[2], d.avg[3]));
            } else {
                jav.setText(String.format("                  平均分                                                         %25.2f%25.2f    " +
                        "                                              ", d.avg[1], d.avg[2]));
            }
            jptitle.add(jav);
        }
        jptitle.add(createEmptyJTA());
        JTextArea jzhu = new JTextArea();
        jzhu.setFont(new Font("仿宋", Font.PLAIN, 18));
        jzhu.setEditable(false);
        jzhu.setText("           注:当前为视图模式,无法进行编辑,返回需要在查看按当前窗口!!!" +
                "                                                  ");
        jptitle.add(jzhu);
        vboxmain.add(jptitle);
        vboxmain.repaint();
        jf.setVisible(true);
    }
    // 展示界面
    public void showFrame() {
        Font f = new Font("微软雅黑", Font.PLAIN, 16);
        UIManager.put("Menu.font", f);
        UIManager.put("MenuItem.font", f);
        UIManager.put("CheckBoxMenuItem.font", f);
        UIManager.put("ComboBox.font", f);
        UIManager.put("Label.font", f);
        UIManager.put("Button.font", f);
        UIManager.put("FileChooser.font", f);

        jf.setSize(1000, 720);   //大小
        jf.setAlwaysOnTop(true);
        jf.setResizable(false);//不可拖动
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jf.setBackground(Color.white);
        initInterface();
        eb.init();
        m.init();

        jf.setVisible(true);
    }
    // 添加特定的空行
    public JTextArea createEmptyJTA() {
        JTextArea jkongbai = new JTextArea();
        jkongbai.setBackground(Color.LIGHT_GRAY);
        jkongbai.setEditable(false);
        jkongbai.setFont(new Font("宋体", Font.PLAIN, 4));
        jkongbai.setText("	                                                                                               " +
                "	                                                                                                        " +
                "	                                                                                                        " +
                "	                                                                                                        " +
                "	                                                                                                        ");
        return jkongbai;
    }
    // 菜单
    class Menu {
        JMenuBar bar = new JMenuBar();
        JMenu file, edit, statistic, about, sort_asc, sort_desc, view;
        JMenuItem file_new, file_open, file_exit, file_save, file_lsave, file_guanbi, st_result, zuozhe, zhuye;
        JMenuItem s_sum, s_avg, chexiao, qinglin, nowView;
        JMenuItem course11, coures21, total1, course12, coures22, total2;
        JCheckBoxMenuItem edit_show;
        public int flag = 0;// 出现编辑框的判断信号

        // 初始化
        public void init() {
            // 第一层菜单
            file = new JMenu("文件 ");
            edit = new JMenu(" 编辑 ");
            statistic = new JMenu(" 统计 ");
            about = new JMenu(" 关于 ");
            view = new JMenu(" 查看 ");
            // 添加菜单
            bar.add(file);
            bar.add(edit);
            bar.add(view);
            bar.add(statistic);
            bar.add(about);

            // 设置文件菜单
            file_new = new JMenuItem("  新建              ");
            file_open = new JMenuItem("  导入              ");
            file_exit = new JMenuItem("  退出              ");
            file_lsave = new JMenuItem("  另存为            ");
            file_save = new JMenuItem("  保存              ");
            file_guanbi = new JMenuItem("  关闭当前窗口     ");
            // 添加文佳中菜单
            file.add(file_new);
            file.add(file_open);
            file.add(file_save);
            file.add(file_lsave);
            file.addSeparator();
            file.add(file_guanbi);
            file.add(file_exit);
            // 添加监视器
            file_exit.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (e.getSource() == file_exit) {
                        if (new_file == 1) {
                            int op = JOptionPane.showConfirmDialog(jf, "  退出是否进行保存!", "提示", JOptionPane.YES_NO_CANCEL_OPTION);
                            if (op == JOptionPane.YES_OPTION) {
                                if (now_save != 1 && new_file == 1) {
                                    if (nfile == null) {
                                        showFileSaveDialog(jf, nfile);
                                    }
                                    if (nfile != null) {
                                        writeText(nfile);
                                        System.exit(0);
                                    }
                                }
                            } else if (op == JOptionPane.NO_OPTION)
                                System.exit(0);
                        }
                        else if(new_file == 0){
                            int jop = JOptionPane.showConfirmDialog(jf, "是否退出系统!", "提示", JOptionPane.YES_NO_OPTION);
                            if(jop == JOptionPane.YES_OPTION){
                                System.exit(0);
                            }else
                                return;
                        }
                    }
                }
            }); // 退出
            file_new.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (e.getSource() == file_new) {
                        if (new_file == 1) {
                            JOptionPane.showMessageDialog(jf, "已存在窗口!", "提示", JOptionPane.WARNING_MESSAGE);
                            return;
                        }
                        new_file = 1; // 表示新建窗口成功
                        newCreate();
                        edit_show.setSelected(true); // 出现编辑窗口
                    }
                }
            }); // 新建
            file_save.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (e.getSource() == file_save) {
                        if (new_file == 1) {
                            if (nfile == null)
                                showFileSaveDialog(jf, nfile);
                            if (nfile != null) {
                                d.sort(3, 2);
                                writeText(nfile);
                                showData();
                                now_save = 1;
                            }
                        }
                    }
                }
            }); // 保存
            file_lsave.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (e.getSource() == file_lsave) {
                        File old = null;
                        if(nfile != null) {
                            old = new File(nfile.getPath());
                        }
                        if (new_file == 1) {
                            showFileSaveDialog(jf, nfile);
                            if(old != null) {
                                if (nfile.getPath() != old.getPath()) {
                                    d.sort(3, 2);
                                    writeText(nfile);
                                    showData();
                                    now_save = 1;
                                }
                            }else{
                                if (nfile != null) {
                                    d.sort(3, 2);
                                    writeText(nfile);
                                    showData();
                                    now_save = 1;
                                }
                            }
                        }
                    }
                }
            }); // 另存为
            file_open.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (e.getSource() == file_open) {
                        if (new_file == 1) {
                            JOptionPane.showMessageDialog(jf, "已有打开窗口,请先关闭窗口!", "提示", JOptionPane.WARNING_MESSAGE);
                            return;
                        }
                        showFileOpenDialog(jf);
                        if(rfile != null) {
                            new_file = 1;
                            readText(rfile);
                            nfile = new File(rfile.getName());
                            d.calculate();
                            d.analysis();
                            showData();
                        }
                        return;
                    }
                }
            }); // 导入
            file_guanbi.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (e.getSource() == file_guanbi) {
                        if(now_number != 0) {
                            if (now_save == 0) {
                                if (new_file == 1) {
                                    if (nfile == null && rfile != null) {
                                        nfile = rfile;
                                    } else if (nfile == null)
                                        showFileSaveDialog(jf, nfile);
                                    if (nfile != null) {
                                        d.sort(3, 2);
                                        writeText(nfile);
                                    }
                                }
                            }
                            while (nfile == null && new_file == 1) {
                                int op = JOptionPane.showConfirmDialog(jf, "是否不进行保存?", "提示", JOptionPane.YES_NO_CANCEL_OPTION);
                                if (op == JOptionPane.YES_OPTION) {
                                    break;
                                } else if (op == JOptionPane.NO_OPTION) {
                                    showFileSaveDialog(jf, nfile);
                                    if (nfile != null) {
                                        d.sort(3, 2);
                                        writeText(nfile);
                                    }
                                } else return;
                            }
                        }
                        new_file = 0;
                        now_save = 0;
                        rfile = null;
                        nfile = null;
                        now_number = 0;
                        now_view = 0;
                        initInterface();
                        edit_show.setSelected(false);
                        return;
                    }
                }
            }); // 关闭窗口

            // 设置编辑菜单
            edit_show = new JCheckBoxMenuItem("  编辑窗口      ");
            chexiao = new JMenuItem("   撤销         ");
            // qinglin = new JMenuItem("   清零         ");
            // 添加编辑菜单
            edit.add(chexiao);
            // edit.add(qinglin);
            edit.addSeparator();
            edit.add(edit_show);
            // 添加监视器
            edit_show.addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    if (e.getSource() == edit_show) {
                        if (flag == 0) {
                            vbox1.add(jp1);
                            vbox1.add(jp2);
                            vbox1.add(Box.createVerticalStrut(5));
                            jf.add(vbox1, "South");
                        } else {
                            vbox1.removeAll();
                            vbox1.repaint();
                        }
                        flag = (flag + 1) % 2;
                        jf.setVisible(true);
                    }
                }
            }); // 编辑窗口
            chexiao.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (e.getSource() == chexiao) {
                        if (!d.revocation()) { // 撤销判断
                            JOptionPane.showMessageDialog(jf, "无撤销内容!", "提示", JOptionPane.WARNING_MESSAGE);
                            return;
                        }
                        showData();
                        now_save = 0;
                    }
                }
            });  // 撤销

            // 编辑查看菜单
            nowView = new JMenuItem("  当前窗口      ");
            // 添加查看菜单
            view.add(nowView);
            // 添加监视器
            nowView.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    now_view = 0;
                    if (new_file == 0) {
                        return;
                    }
                    if (now_number != 0) {
                        vboxmain.removeAll();
                        showData();
                        vboxmain.repaint();
                        jf.setVisible(true);
                    }
                }
            }); // 显示当前处理数据的页面

            // 编辑统计菜单
            sort_asc = new JMenu("  升序排序        ");
            sort_desc = new JMenu("  降序排序        ");
            st_result = new JCheckBoxMenuItem("  成绩分析        ");
            s_sum = new JCheckBoxMenuItem("  总分         ");
            s_avg = new JCheckBoxMenuItem("  平均分       ");

            st_result.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (e.getSource() == st_result) {
                        fenxi = (fenxi + 1) % 2;
                        if (new_file == 0) initInterface();
                        else if (now_number == 0 && new_file != 0) newCreate();
                        else if(now_view == 1) showView();
                        else showData();
                    }
                }
            }); // 成绩分析
            s_sum.addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    if (e.getSource() == s_sum) {
                        now_sum = (now_sum + 1) % 2;
                        if (new_file == 0) initInterface();
                        else if (now_number == 0) newCreate();
                        else if(now_view == 1) showView();
                        else showData();
                    }
                }
            });  // 总分
            s_avg.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (e.getSource() == s_avg) {
                        now_avg = (now_avg + 1) % 2;
                        if (new_file == 0) initInterface();
                        else if (now_number == 0) newCreate();
                        else if(now_view == 1) showView();
                        else showData();
                    }
                }
            });  // 平均分
            // 添加统计菜单
            statistic.add(s_sum);
            statistic.add(s_avg);
            statistic.add(st_result);
            statistic.addSeparator();
            statistic.add(sort_asc);
            statistic.add(sort_desc);
            course11 = new JMenuItem("  课程1         ");
            coures21 = new JMenuItem("  课程2         ");
            total1 = new JMenuItem("  总分          ");
            course12 = new JMenuItem("  课程1         ");
            coures22 = new JMenuItem("  课程2         ");
            total2 = new JMenuItem("  总分          ");
            // 添加统计菜单的子菜单
            sort_asc.add(course11);
            sort_asc.add(coures21);
            sort_asc.add(total1);
            sort_desc.add(course12);
            sort_desc.add(coures22);
            sort_desc.add(total2);
            // 添加监视器
            course11.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if(e.getSource() == course11){
                        if(new_file == 1 && now_number > 0) {
                            now_view = 1;
                            d.sort(1, 2);
                            edit_show.setSelected(false);
                            showView();
                            jf.setVisible(true);
                        }
                    }
                }
            }); // 升序,按照课程1
            coures21.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if(e.getSource() == coures21){
                        if(new_file == 1 && now_number > 0) {
                            now_view = 1;
                            edit_show.setSelected(false);
                            d.sort(2, 2);
                            showView();
                            jf.setVisible(true);
                        }
                    }
                }
            }); // 升序,按照课程2
            total1.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if(e.getSource() == total1){
                        if(new_file == 1 && now_number > 0) {
                            now_view = 1;
                            edit_show.setSelected(false);
                            d.sort(3, 2);
                            s_sum.setSelected(true);
                            showView();
                            jf.setVisible(true);
                        }
                    }
                }
            });   // 升序,按照总分
            course12.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if(e.getSource() == course12){
                        if(new_file == 1 && now_number > 0) {
                            now_view = 1;
                            edit_show.setSelected(false);
                            d.sort(1, 1);
                            showView();
                            jf.setVisible(true);
                        }
                    }
                }
            }); // 降序,按照课程1
            coures22.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if(e.getSource() == coures22){
                        if(new_file == 1 && now_number > 0) {
                            now_view = 1;
                            edit_show.setSelected(false);
                            d.sort(2, 1);
                            showView();
                            jf.setVisible(true);
                        }
                    }
                }
            }); // 降序,按照课程2
            total2.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if(e.getSource() == total2){
                        if(new_file == 1 && now_number > 0) {
                            now_view = 1;
                            edit_show.setSelected(false);
                            s_sum.setSelected(true);
                            d.sort(3, 1);
                            showView();
                            jf.setVisible(true);
                        }
                    }
                }
            });   // 降序,按照总分

            // 编辑关于菜单
            zuozhe = new JMenuItem("  作者             ");
            zhuye = new JMenuItem("  主页             ");
            about.add(zhuye);
            about.add(zuozhe);
            zhuye.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    vboxmain.removeAll();
                    initInterface();
                    vboxmain.repaint();
                    edit_show.setSelected(false);
                    jf.setVisible(true);
                }
            }); // 作者
            zuozhe.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (e.getSource() == zuozhe) {
                        vboxmain.removeAll();
                        aboutInterface();
                        vboxmain.repaint();
                        edit_show.setSelected(false);
                        jf.setVisible(true);
                    }
                }
            }); // 主页

            // 展示
            jf.setJMenuBar(bar);
        }

        // 导入界面
        public void showFileOpenDialog(Component parent) {
            // 创建一个默认的文件选取器
            JFileChooser fileChooser = new JFileChooser();

            // 设置默认显示的文件夹为当前文件夹
            fileChooser.setCurrentDirectory(new File("."));
            // 设置文件选择的模式(只选文件、只选文件夹、文件和文件均可选)
            fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
            // 设置是否允许多选
            fileChooser.setMultiSelectionEnabled(false);
            // 添加可用的文件过滤器(FileNameExtensionFilter 的第一个参数是描述, 后面是需要过滤的文件扩展名 可变参数)
            fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("zip(*.zip, *.rar)", "txt", "zip", "rar"));
            // 设置默认使用的文件过滤器
            fileChooser.setFileFilter(new FileNameExtensionFilter("text(*.txt)", "txt"));
            // 打开文件选择框(线程将被阻塞, 直到选择框被关闭)
            int result = fileChooser.showOpenDialog(parent);
            if (result == JFileChooser.APPROVE_OPTION) {
                // 如果点击了"确定", 则获取选择的文件路径
                rfile = fileChooser.getSelectedFile();
                System.out.println(rfile);
            }
        }
        // 保存界面
        public void showFileSaveDialog(Component parent, File old) {
            JFileChooser fileChooser = new JFileChooser();
            // 设置打开文件选择框后默认输入的文件名
            fileChooser.setSelectedFile(new File("sort.txt"));
            while (true) {
                // 打开文件选择框(线程将被阻塞, 直到选择框被关闭)
                int result = fileChooser.showSaveDialog(parent);
                if (result == JFileChooser.APPROVE_OPTION) {
                    // 如果点击了"保存"
                    nfile = fileChooser.getSelectedFile();
                }
                if(old != null) {
                    if (nfile.getPath() != old.getPath()) {
                        if (!validateFileName(nfile.getName())) {
                            JOptionPane.showMessageDialog(jf, "文件名不能包含下列任何字符之一:
 \ / : * ? " <《》 > |", "提示", JOptionPane.WARNING_MESSAGE);
                            if (old != null) nfile = new File(old.getName());
                            else nfile = null;
                            result = 0;
                        } else break;
                    } else break;
                }else{
                    if (nfile != old) {
                        if (!validateFileName(nfile.getName())) {
                            JOptionPane.showMessageDialog(jf, "文件名不能包含下列任何字符之一:
 \ / : * ? " <《》 > |", "提示", JOptionPane.WARNING_MESSAGE);
                            if (old != null) nfile = new File(old.getName());
                            else nfile = null;
                            result = 0;
                        } else break;
                    } else break;
                }
            }
        }
        // 写文件
        public void writeText(File writeName) {
            try {
                writeName.createNewFile(); // 创建新文件,有同名的文件的话直接覆盖
                try (FileWriter writer = new FileWriter(writeName);
                     BufferedWriter out = new BufferedWriter(writer)
                ) {
                    out.write("编号       学号           姓名         课程1成绩      课程2成绩      总分
");
                    for (int i = 1; i <= now_number; i++) {
                        out.write(String.format("%d    %s    %s%16.1f%16.1f%16.2f
",
                                i, d.vDate[i].id, d.vDate[i].name, d.vDate[i].grade[1], d.vDate[i].grade[2], d.vDate[i].grade[3]));
                    }
                    out.write(String.format("平均分                              %16.2f%16.2f%14.2f", d.avg[1], d.avg[2], d.avg[3]));
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("数据写入成功!");
        }
        // 读文件
        public void readText(File readName) {
            if (readName == null)
                return;
            int index = 0;
            try {
                InputStreamReader reader = new InputStreamReader(new FileInputStream(readName)); // 建立一个输入流对象reader
                BufferedReader br = new BufferedReader(reader); // 建立一个对象,它把文件内容转成计算机能读懂的语言
                String str = "", next = "";
                str = br.readLine(); // 去掉开头
                str = br.readLine();
                next = br.readLine();
                while (next != null) { // 不读最后一行
                    String[] buff = str.trim().split("\s+");
                    d.zhuyao[++index] = new Student(buff[1], buff[2], Double.parseDouble(buff[3]), Double.parseDouble(buff[4]));
                    now_number++;
                    str = new String(next);
                    next = br.readLine(); // 一次读入一行数据
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // 保存文件名限制
        public boolean validateFileName(String name) {
            if (name.indexOf('\') != -1 || name.indexOf('/') != -1 ||
                    name.indexOf(':') != -1 || name.indexOf('*') != -1 ||
                    name.indexOf('?') != -1 || name.indexOf('"') != -1 ||
                    name.indexOf('<') != -1 || name.indexOf('>') != -1 ||
                    name.indexOf('|') != -1 || name.indexOf('《') != -1 ||
                    name.indexOf('》') != -1 || name.indexOf('?') != -1) {
                return false;
            } else {
                return true;
            }
        }
    }
    // 底层编辑窗口
    class editBottom {
        JTextField jtf1, jtf2, jtf3, jtf4, jtf5;
        JComboBox jcb1;
        JButton jb1, jb2, jb3;

        // 初始化
        public void init() {
            // 生成文本框
            jtf1 = new JTextField(8);
            jtf2 = new JTextField(8);
            jtf3 = new JTextField(6);
            jtf4 = new JTextField(6);
            jtf5 = new JTextField(6);
            // 生成下拉框
            String s[] = {"     修改      ", "     增加      ", "     删除      "};
            jcb1 = new JComboBox(s);
            // 添加
            jp1.add(jcb1);
            jp1.add(new JLabel("  编号  "));
            jp1.add(jtf5);
            jp1.add(new JLabel("  学号: "));
            jp1.add(jtf1);
            jp1.add(new JLabel(" 姓名: "));
            jp1.add(jtf2);
            jp1.add(new JLabel("   课程1成绩: "));
            jp1.add(jtf3);
            jp1.add(new JLabel("   课程2成绩: "));
            jp1.add(jtf4);
            // 生成按钮
            jb1 = new JButton("   确定   ");
            jb2 = new JButton("   清除   ");
            jb3 = new JButton("   例子   ");
            jp2.add(jb3);
            jp2.add(new JLabel("            "));
            jp2.add(jb2);
            jp2.add(new JLabel("            "));
            jp2.add(jb1);

            // 监听器
            jb1.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (e.getSource() == jb1) {
                        if (now_view == 0) {
                            if (jcb1.getSelectedItem() == "     修改      ") {
                                try {
                                    int p = Integer.parseInt(jtf5.getText());
                                    if (p > now_number) {
                                        JOptionPane.showMessageDialog(jf, "不存在该编号!", "提示", JOptionPane.WARNING_MESSAGE);
                                        jtf5.setText("");
                                        return;
                                    }
                                    if (p >= 10) {
                                        JOptionPane.showMessageDialog(jf, "暂时不支持编号10以上的数据!", "提示", JOptionPane.WARNING_MESSAGE);
                                        jtf5.setText("");
                                        return;
                                    }
                                    if (!jtf3.getText().equals("")) {
                                        if (Double.parseDouble(jtf3.getText()) < 0 || Double.parseDouble(jtf3.getText()) > 100) {
                                            JOptionPane.showMessageDialog(jf, "课程1输入的成绩大于100(小于0)!", "提示", JOptionPane.WARNING_MESSAGE);
                                            jtf3.setText("");
                                            return;
                                        }
                                    }
                                    if (!jtf4.getText().equals("")) {
                                        if (Double.parseDouble(jtf4.getText()) < 0 || Double.parseDouble(jtf4.getText()) > 100) {
                                            JOptionPane.showMessageDialog(jf, "课程2输入的成绩大于100(小于0)!", "提示", JOptionPane.WARNING_MESSAGE);
                                            jtf4.setText("");
                                            return;
                                        }
                                    }
                                    if(jtf4.getText().equals("") && jtf1.getText().equals("") && jtf2.getText().equals("") && jtf3.getText().equals("")){
                                        JOptionPane.showMessageDialog(jf, "请输入修改数据!", "提示", JOptionPane.WARNING_MESSAGE);
                                        return;
                                    }
                                    d.record(1, p);
                                    if (!jtf3.getText().equals("")) d.zhuyao[p].grade[1] = Double.parseDouble(jtf3.getText());
                                    if (!jtf4.getText().equals("")) d.zhuyao[p].grade[2] = Double.parseDouble(jtf4.getText());
                                    if (!jtf2.getText().equals("")) d.zhuyao[p].name = new StringBuffer(jtf2.getText());
                                    if (!jtf1.getText().equals("")) d.zhuyao[p].id = new StringBuffer(jtf1.getText());
                                    d.calculate();
                                    d.analysis();
                                    now_save = 0;
                                    showData();
                                    jtf1.setText("");
                                    jtf2.setText("");
                                    jtf3.setText("");
                                    jtf4.setText("");
                                    jtf5.setText("");
                                } catch (Exception d) {
                                    JOptionPane.showMessageDialog(jf, "输入有误!请重新输入!", "提示", JOptionPane.WARNING_MESSAGE);
                                    jtf3.setText("");
                                    jtf4.setText("");
                                    jtf5.setText("");
                                    return;
                                }
                            } else if (jcb1.getSelectedItem() == "     增加      ") {
                                try {
                                    if (now_number + 1 >= 10) {
                                        JOptionPane.showMessageDialog(jf, "暂时不支持编号10以上的数据!", "提示", JOptionPane.WARNING_MESSAGE);
                                        return;
                                    }
                                    if (jtf1.getText().equals("")) {
                                        JOptionPane.showMessageDialog(jf, "请输入学生学号!", "提示", JOptionPane.WARNING_MESSAGE);
                                        return;
                                    }
                                    if (jtf2.getText().equals("")) {
                                        JOptionPane.showMessageDialog(jf, "请输入学生姓名!", "提示", JOptionPane.WARNING_MESSAGE);
                                        return;
                                    }
                                    if (jtf3.getText().equals("")) {
                                        JOptionPane.showMessageDialog(jf, "请输入课程1的成绩!", "提示", JOptionPane.WARNING_MESSAGE);
                                        return;
                                    } else if (!jtf3.getText().equals("")) {
                                        if (Double.parseDouble(jtf3.getText()) < 0 || Double.parseDouble(jtf3.getText()) > 100) {
                                            JOptionPane.showMessageDialog(jf, "课程1输入的成绩大于100(小于0)!", "提示", JOptionPane.WARNING_MESSAGE);
                                            jtf3.setText("");
                                            return;
                                        }
                                    }
                                    if (jtf4.getText().equals("")) {
                                        JOptionPane.showMessageDialog(jf, "请输入课程2的成绩!", "提示", JOptionPane.WARNING_MESSAGE);
                                        return;
                                    } else if (!jtf4.getText().equals("")) {
                                        if (Double.parseDouble(jtf4.getText()) < 0 || Double.parseDouble(jtf4.getText()) > 100) {
                                            JOptionPane.showMessageDialog(jf, "课程2输入的成绩大于100(小于0)!", "提示", JOptionPane.WARNING_MESSAGE);
                                            jtf4.setText("");
                                            return;
                                        }
                                    }
                                    now_number++;
                                    d.record(2, now_number);
                                    if (!jtf3.getText().equals(""))
                                        d.zhuyao[now_number].grade[1] = Double.parseDouble(jtf3.getText());
                                    else {
                                        JOptionPane.showMessageDialog(jf, "请输入课程1的成绩", "提示", JOptionPane.WARNING_MESSAGE);
                                        return;
                                    }
                                    if (!jtf4.getText().equals(""))
                                        d.zhuyao[now_number].grade[2] = Double.parseDouble(jtf4.getText());
                                    else {
                                        JOptionPane.showMessageDialog(jf, "请输入课程2的成绩", "提示", JOptionPane.WARNING_MESSAGE);
                                        return;
                                    }
                                    if (!jtf2.getText().equals(""))
                                        d.zhuyao[now_number].name = new StringBuffer(jtf2.getText());
                                    else {
                                        JOptionPane.showMessageDialog(jf, "请输入学生姓名", "提示", JOptionPane.WARNING_MESSAGE);
                                        return;
                                    }
                                    if (!jtf1.getText().equals(""))
                                        d.zhuyao[now_number].id = new StringBuffer(jtf1.getText());
                                    else {
                                        JOptionPane.showMessageDialog(jf, "请输入学生学号", "提示", JOptionPane.WARNING_MESSAGE);
                                        return;
                                    }
                                    d.calculate();
                                    d.analysis();
                                    now_save = 0;
                                    showData();
                                    jtf1.setText("");
                                    jtf2.setText("");
                                    jtf3.setText("");
                                    jtf4.setText("");
                                    jtf5.setText("");
                                }catch (Exception d){
                                    JOptionPane.showMessageDialog(jf, "输入有误!请重新输入!", "提示", JOptionPane.WARNING_MESSAGE);
                                    jtf3.setText("");
                                    jtf4.setText("");
                                    jtf5.setText("");
                                    return;
                                }
                            } else if (jcb1.getSelectedItem() == "     删除      ") {
                                try {
                                    int p = Integer.parseInt(jtf5.getText());
                                    if (p > now_number || p <= 0) {
                                        JOptionPane.showMessageDialog(jf, "不存在该编号!", "提示", JOptionPane.WARNING_MESSAGE);
                                        jtf5.setText("");
                                        return;
                                    }
                                    d.record(3, p);
                                    d.delete(p);
                                    now_save = 0;
                                    if (now_number == 0) newCreate();
                                    else showData();
                                } catch (Exception d) {
                                    JOptionPane.showMessageDialog(jf, "输入有误!请重新输入!", "提示", JOptionPane.WARNING_MESSAGE);
                                    jtf3.setText("");
                                    jtf4.setText("");
                                    jtf5.setText("");
                                    return;
                                }
                            }
                        } else if (now_view == 1) {
                            JOptionPane.showMessageDialog(jf, "视图模式下无法编辑数据!", "提示", JOptionPane.WARNING_MESSAGE);
                            return;
                        }
                    }
                }
            });// 确定
            jb2.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (e.getSource() == jb2) {
                        jtf1.setText("");
                        jtf2.setText("");
                        jtf3.setText("");
                        jtf4.setText("");
                    }
                }
            });// 清除
            jb3.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (e.getSource() == jb3) {
                        int op = JOptionPane.showConfirmDialog(jf, "是否使用例子覆盖原有数据?", "提示", JOptionPane.YES_NO_OPTION);
                        if (op == JOptionPane.YES_OPTION) {
                            d.oneExample();
                            now_save = 0;
                            showData();
                        }
                    }
                }
            });// 例子
        }
    }
    // 数据类
    class Student {
        public StringBuffer id;
        public StringBuffer name;
        public double[] grade = new double[4];

        Student() {
        }

        Student(String id, String name, double grade1, double grade2) {
            this.id = new StringBuffer(id);
            this.name = new StringBuffer(name);
            this.grade[1] = grade1;
            this.grade[2] = grade2;
            this.grade[3] = grade1 + grade2;
        }

        Student(Student s) {
            this.id = new StringBuffer(s.id.toString());
            this.name = new StringBuffer(s.name.toString());
            this.grade[1] = s.grade[1];
            this.grade[2] = s.grade[2];
            this.grade[3] = s.grade[1] + s.grade[2];
        }

        public String toString(){
            return id + " " + name + " " + grade[1] + " " + grade[2]+ " " + grade[3];
        }

    }
    // 数据处理
    class Data {
        // 主要数据
        Student[] zhuyao = new Student[20];
        public double avg[] = new double[4];
        public int[] numYouxiu, numLianghao, numJige, numBujige;
        public double[] youxiuB, lianghaoB, jigeB, bujigeB;
        // 建立视图的数据
        Student[] vDate = new Student[20];
        // 撤销记录数据
        Student[] rData = new Student[100];
        public int now_r = 0; // 记录数
        public int[] rcaozuo = new int[100];
        public int[] bianhao = new int[100];

        // 例子
        public void oneExample() {
            now_number = 7;
            zhuyao[1] = new Student("2018211001", "张铁三", 67, 78);
            zhuyao[2] = new Student("2018211002", "李搞四", 99, 98);
            zhuyao[3] = new Student("2018211003", "王老五", 52, 88);
            zhuyao[4] = new Student("2018211004", "兔歪六", 82, 74);
            zhuyao[5] = new Student("2018211005", "蛇数七", 66, 55);
            zhuyao[6] = new Student("2018211006", "马爸八", 44, 59);
            zhuyao[7] = new Student("2018211007", "羊法九", 84, 85);
            zhuyao[8] = new Student("2018211008", "猴老十", 64, 91);
            zhuyao[9] = new Student("2018211009", "鸡十一", 78, 77);
            calculate();
            analysis();
        }
        // 分析模块
        public void analysis() {
            numYouxiu = new int[2];
            numLianghao = new int[2];
            numJige = new int[2];
            numBujige = new int[2];
            youxiuB = new double[2];
            lianghaoB = new double[2];
            jigeB = new double[2];
            bujigeB = new double[2];
            for (int i = 1; i <= now_number; i++) {
                if (zhuyao[i].grade[1] >= 85) numYouxiu[0]++;
                else if (zhuyao[i].grade[1] >= 70) numLianghao[0]++;
                else if (zhuyao[i].grade[1] >= 60) numJige[0]++;
                else if (zhuyao[i].grade[1] < 60) numBujige[0]++;
                if (zhuyao[i].grade[2] >= 85) numYouxiu[1]++;
                else if (zhuyao[i].grade[2] >= 70) numLianghao[1]++;
                else if (zhuyao[i].grade[2] >= 60) numJige[1]++;
                else if (zhuyao[i].grade[2] < 60) numBujige[1]++;
            }
            for (int i = 0; i < 2; i++) {
                youxiuB[i] = (double) numYouxiu[i] / now_number;
                lianghaoB[i] = (double) numLianghao[i] / now_number;
                jigeB[i] = (double) numJige[i] / now_number;
                bujigeB[i] = (double) numBujige[i] / now_number;
            }
        }
        // 计算总分和平均分
        public void calculate() {
            double sum1 = 0, sum2 = 0, sum3 = 0;
            for (int i = 1; i <= now_number; i++) {
                zhuyao[i].grade[3] = zhuyao[i].grade[1] + zhuyao[i].grade[2];
                sum1 += zhuyao[i].grade[1];
                sum2 += zhuyao[i].grade[2];
                sum3 += zhuyao[i].grade[3];
            }
            avg[1] = sum1 / now_number;
            avg[2] = sum2 / now_number;
            avg[3] = sum3 / now_number;
        }
        // 记录步骤
        public void record(int x, int pos) {
            rcaozuo[++now_r] = x;
            bianhao[now_r] = pos;
            rData[now_r] = new Student(zhuyao[pos].id.toString(), zhuyao[pos].name.toString(), zhuyao[pos].grade[1], zhuyao[pos].grade[2]);
        }
        // 删除
        public void delete(int pos) {
            for (int i = pos; i <= now_number; i++) {
                zhuyao[i] = new Student(zhuyao[i + 1]);
            }
            now_number--;
            calculate();
            analysis();
        }
        // 撤销模块
        public boolean revocation() {
            if (now_r <= 0)
                return false;
            // if(bianhao[now_r] > now_number){ for (; bianhao[now_r] > now_number ; now_r--) { } }
            if (rcaozuo[now_r] == 1) { // 撤销修改
                zhuyao[bianhao[now_r]] = new Student(rData[now_r]);
            } else if (rcaozuo[now_r] == 2) { // 撤销增加
                now_number--;
            } else if (rcaozuo[now_r] == 3) { // 撤销删除
                now_number++;
                for (int i = now_number; i > bianhao[now_r]; i--) {
                    zhuyao[i] = new Student(zhuyao[i - 1]);
                }
                zhuyao[bianhao[now_r]] = new Student(rData[now_r]);
            }
            calculate();
            analysis();
            now_r--;
            return true;
        }
        // 排序
        public void sort(int flag, int order){
            // flag = 1,按照课程1成绩排序
            // flag = 2,按照课程2成绩排序
            // flag = 3,按照总分排序
            // order = 1, 升序,order = 2, 降序
            Student temp;
            for (int i = 1; i <= now_number ; i++) {
                vDate[i] = new Student(zhuyao[i]);
            }
            for (int i = 1; i < now_number; i++) {
                for (int j = i+1; j <= now_number; j++) {
                    if(flag == 1){
                        if(judge(vDate[i].grade[1], vDate[j].grade[1], order)){
                            temp = new Student(vDate[i]);
                            vDate[i] = new Student(vDate[j]);
                            vDate[j] = new Student(temp);
                        }
                    } else if(flag == 2){
                        if(judge(vDate[i].grade[2], vDate[j].grade[2], order)){
                            temp = new Student(vDate[i]);
                            vDate[i] = new Student(vDate[j]);
                            vDate[j] = new Student(temp);
                        }
                    } else if(flag == 3){
                        if(judge(vDate[i].grade[3], vDate[j].grade[3], order)){
                            temp = new Student(vDate[i]);
                            vDate[i] = new Student(vDate[j]);
                            vDate[j] = new Student(temp);
                        }
                    }
                }
            }
            for (int i = 1; i <= now_number ; i++) {
                System.out.println(vDate[i]);
            }

        }
        // 判断大小
        public boolean judge(double a, double b, int order) {
            if (order == 1)  return a > b;
            else  return a < b;
        }
    }
}

public class SGC {
    public static void main(String[] args) {
        Interface itf = new Interface();
        itf.showFrame();
    }
}
原文地址:https://www.cnblogs.com/shish/p/12819438.html