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("\n\n\n\n " + " 歡 迎 \n " + " 使 用 學 生 管 理 系 統 !\n\n\n " + " 獨學而無友┗( ▔, ▔ )┛則孤陋寡聞 " + " \n\t\t ღゝ◡╹)ノ♡\n\n\n\n\n\n\n"); 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("\n\n作者:shish " + " " + "\n博客:https://www.cnblogs.com/shish\n" + "GitHub:https://github.com/shishenhao\n" + "關於作者:超級無敵的菜雞\n" + "聲援作者:您的鼓勵是作者的最大動力!\n\n\n\n\n\n\n\n\n\n\n"); 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(" \t\t 學 生 成 績 管 理 系 統 "); JTextArea jtaa = new JTextArea(1, 70); jtaa.setBackground(Color.LIGHT_GRAY); jtaa.setFont(new Font("微軟雅黑", Font.PLAIN, 22)); jtaa.setEditable(false); jtaa.setText("\t 編號 | 學號 | 姓名 | 課程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(" \t\t 學 生 成 績 管 理 系 統 "); JTextArea jtaa = new JTextArea(1, 70); jtaa.setBackground(Color.LIGHT_GRAY); jtaa.setFont(new Font("微軟雅黑", Font.PLAIN, 22)); jtaa.setEditable(false); jtaa.setText("\t 編號 | 學號 | 姓名 | 課程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; " + " \n " + " 及格人數(>=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("\n 課程2成績分析:優秀人數(>=85)為 %d 占比 %.2f, " + "良好人數(>=70)為 %d 占比 %.2f; " + " \n " + " 及格人數(>=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(" \t\t 學 生 成 績 管 理 系 統 "); JTextArea jtaa = new JTextArea(1, 70); jtaa.setBackground(Color.LIGHT_GRAY); jtaa.setFont(new Font("微軟雅黑", Font.PLAIN, 22)); jtaa.setEditable(false); jtaa.setText("\t 編號 | 學號 | 姓名 | 課程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("\t " + "\t " + "\t " + "\t " + "\t "); 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, "文件名不能包含下列任何字符之一:\n \\ / : * ? \" <《》 > |", "提示", 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, "文件名不能包含下列任何字符之一:\n \\ / : * ? \" <《》 > |", "提示", 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成績 總分\n"); for (int i = 1; i <= now_number; i++) { out.write(String.format("%d %s %s%16.1f%16.1f%16.2f\n", 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(); } }