学生成绩管理系统一、实验目的1、复习、巩固Java语言的基础知识,进一步加深对Java语言的理解和掌握;2、课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。
提高学生适应实际,实践编程的能力;3、培养学生在项目开发中创新意识及能力。
二、实验任务1、理解并掌握图形界面的设计。
2、理解整体算法的思路,即actionPerformed()的算法。
3、输入学生姓名、成绩,完成信息的录入,并将数据存储到文件中。
4、输入学生姓名,从文件中查询该姓名的学生的成绩,找到一个成绩后可以选择是否继续查询。
5、输入学生姓名和新的成绩,修改文件中该姓名的学生的所有成绩为新的成绩。
6、输入学生姓名,删除文件中该姓名的学生的所有成绩。
7、输入学生姓名和成绩,删除文件中该姓名的学生的单次成绩。
8、进一步学习JAVA的编程思想。
9、理解并掌握文件的操作。
三、实验要求1、理解并掌握图形界面的设计。
2、理解整体算法的思路,即actionPerformed()的算法。
3、进一步学习JAVA的编程思想。
4、理解并掌握文件的操作。
四、思路分析1、为使程序美观,使用了多个JPanel和不同的LayoutManager(比如FlowLayout、BorderLayout)进行布局设计,同时限定了窗体的大小;2、为避免数据错误,每次操作前检查姓名和成绩是否为空、成绩是否为整数;3、增删改操作时,使用布尔型变量标记操作是否完成,并弹出相应提示;4、修改和删除操作,先将文件中的内容暂存到内存中,再重新写入符合条件的信息;5、查询操作,每次查询到结果时更新成绩,并询问是否需要继续查询;6、删除操作,分为删除指定姓名所有成绩和删除指定姓名单次成绩两种状况。
五、程序代码【studentmanager.java】import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.*;public class studentmanager extends JFrame {/*** 当前容器*/Container currentContainer = this;/*** 存储的文件名*/String fileName = new String("data.txt");/*** 显示标题文本*/JLabel titleLabel = new JLabel("学生成绩管理系统");/*** 标题面板*/JPanel titlePanel = new JPanel();/*** 显示姓名文本*/JLabel nameLabel = new JLabel("姓名");/*** 显示成绩文本*/JLabel scoreLabel = new JLabel("成绩");/*** 姓名文本框*/JTextField nameTextField = new JTextField(15);/*** 成绩文本框*/JTextField scoreTextField = new JTextField(15);/*** 输入面板*/JPanel inputPanel = new JPanel();/*** 添加按钮*/JButton insertBtn = new JButton("录入");/*** 查询按钮*/JButton searchBtn = new JButton("查询");/*** 修改按钮*/JButton modifyBtn = new JButton("修改");/*** 删除按钮*/JButton deleteBtn = new JButton("删除");/*** 管理面板*/JPanel managePanel = new JPanel();/*** 按钮监听器*/ButtonActionListener btnAction = new ButtonActionListener();/*** 构造器:初始化窗体*/public studentmanager(){this.setSize(280,200);this.setLocation(300, 300);this.setResizable(false);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("学生成绩管理系统");/** 将窗体划分为上中下三个块*/this.setLayout(new BorderLayout()); this.add(titlePanel, "North");this.add(inputPanel,"Center");this.add(managePanel,"South");/** 第一块用来放标题面板 = =*/titlePanel.setLayout(newFlowLayout(FlowLayout.CENTER,0,10));titlePanel.add(titleLabel);titleLabel.setFont(new Font("黑体",Font.PLAIN,16));/** 第二块放输入面板*/inputPanel.setLayout(newFlowLayout(FlowLayout.CENTER,20,10));inputPanel.add(nameLabel);inputPanel.add(nameTextField);inputPanel.add(scoreLabel);inputPanel.add(scoreTextField);/** 第三块是管理面板*/managePanel.setLayout(newFlowLayout(FlowLayout.CENTER,5,10));managePanel.add(insertBtn);managePanel.add(searchBtn);managePanel.add(modifyBtn);managePanel.add(deleteBtn);/** 为按钮注册按钮监听器*/insertBtn.addActionListener(btnAction); searchBtn.addActionListener(btnAction); modifyBtn.addActionListener(btnAction);deleteBtn.addActionListener(btnAction);/** 显示窗体*/this.setVisible(true);}/*** 按钮监听类*/class ButtonActionListener implements ActionListener{public void actionPerformed(ActionEvent e) {/** 检查是否输入了姓名*/String name =nameTextField.getText().trim();if(name.length()==0){JOptionPane.showMessageDialog(currentContainer, "输入的姓名为空!","操作失败",JOptionPane.ERROR_MESSAGE);return;}/** 是否要求查询*/if(e.getSource()==searchBtn){search(name); // 执行查询方法,进行查询操作return;}int score = 0;/** 是否要求删除*/if(e.getSource()==deleteBtn){try{score =Integer.parseInt(scoreTextField.getText().trim());int choose = JOptionPane.showConfirmDialog(currentContainer, "确定要删除该同学的这次成绩吗?","确认删除",JOptionPane.YES_NO_CANCEL_OPTION);if(choose == JOptionPane.YES_OPTION){boolean flag = delete(name,score); // 当确定时删除名字为name的同学成绩为score的成绩一次if(flag){ nameTextField.setText(""); // 清空姓名框scoreTextField.setText(""); // 清空成绩框JOptionPane.showMessageDialog(currentContainer, "已删除该同学的这次成绩!","删除成功!",JOptionPane.PLAIN_MESSAGE);}else{JOptionPane.showMessageDialog(currentContainer, "该同学并没有这个成绩!","删除失败!",JOptionPane.PLAIN_MESSAGE);}}}catch(NumberFormatExceptione1){// 当catch到NumberFormatException时说明parseInt失败:没有输入成绩,此时应删除所有成绩int choose = JOptionPane.showConfirmDialog(currentContainer, "确定要删除该同学的所有成绩吗?","确认删除",JOptionPane.YES_NO_CANCEL_OPTION);if(choose == JOptionPane.YES_OPTION){boolean flag = delete(name); // 当确定时删除名字为name的同学的所有成绩if(flag){ nameTextField.setText(""); // 清空姓名框scoreTextField.setText(""); // 清空成绩框JOptionPane.showMessageDialog(currentContainer, "已删除该同学的所有成绩!","删除成功!",JOptionPane.PLAIN_MESSAGE);}else{JOptionPane.showMessageDialog(currentContainer, "该同学没有成绩!","删除失败!",JOptionPane.PLAIN_MESSAGE);}}}return;}/** 检查是否输入了成绩*/try{score =Integer.parseInt(scoreTextField.getText().trim());}catch(Exception e1){JOptionPane.showMessageDialog(currentContainer, "输入的成绩不是数字!","操作失败",JOptionPane.ERROR_MESSAGE);return;}/** 是否要求录入*/if(e.getSource()==insertBtn){boolean flag = insert(name,score); // 执行方法,进行录入操作if(flag){JOptionPane.showMessageDialog(currentContainer,"录入成功!"); scoreTextField.setText(""); // 清空成绩框}else{JOptionPane.showMessageDialog(currentContainer,"录入过程中出现了异常,请联络技术人员!","录入失败",JOptionPane.ERROR_MESSAGE);}return;}/** 是否要求修改*/if(e.getSource()==modifyBtn){int choose =JOptionPane.showConfirmDialog(currentContainer, "确定要将该同学的所有成绩都修改为" + score+ "吗?","确认修改",JOptionPane.YES_NO_CANCEL_OPTION);if(choose ==JOptionPane.YES_OPTION){boolean flag =modify(name,score); // 当确定时修改所有名字为name的同学的成绩为scoreif(flag){JOptionPane.showMessageDialog(currentContainer, "已将该同学的所有成绩都修改为" + score+ "!","修改成功!",JOptionPane.PLAIN_MESSAGE);}else{JOptionPane.showMessageDialog(currentContainer, "没有该姓名的同学的成绩记录!","修改失败!",JOptionPane.ERROR_MESSAGE);}}return;}}}/*** 查询指定姓名的同学的成绩* @param name 要查询的姓名*/public void search(String name){try {/** 读入文件,读取每条学生信息,满足条件则显示并弹出提示确认是否继续查询*/BufferedReader in = new BufferedReader(new FileReader(fileName));String line;int choose = JOptionPane.NO_OPTION;while((line = in.readLine())!=null){String[] info = line.split(":");if(info[0].equals(name)){scoreTextField.setText(info[1]); // 更新成绩信息choose =JOptionPane.showConfirmDialog(null, "继续查询该同学的成绩?","查找完毕!",JOptionPane.YES_NO_OPTION);if(choose==JOptionPane.NO_OPTION){// 选择否则不再查询,确定则继续in.close();return;}}}in.close();if(choose==JOptionPane.YES_OPTION){// 当继续查找时找不到记录JOptionPane.showMessageDialog(currentContainer,"找不到该同学的更多成绩!","查找完毕",JOptionPane.PLAIN_MESSAGE);}else{// 第一次查询就找不到记录scoreTextField.setText("");JOptionPane.showMessageDialog(currentContainer,"找不到该同学的成绩!","查找完毕",JOptionPane.PLAIN_MESSAGE);}} catch (FileNotFoundException e) {// 文件不存在,说明没有成绩数据JOptionPane.showMessageDialog(currentContainer,"成绩数据为空!","查找失败",JOptionPane.ERROR_MESSAGE);} catch (IOException e) {JOptionPane.showMessageDialog(currentContainer,"成绩数据为空!","查找失败",JOptionPane.ERROR_MESSAGE);}}/*** 插入新记录* @param name 姓名* @param score 成绩*/public boolean insert(String name, int score){try {/** 写入文件*/Writer out = newFileWriter(fileName,true);out.write(name + ":" + score + "\r\n"); out.close();return true;} catch (IOException e) {e.printStackTrace();return false;}}/*** 修改记录内容* <ul>将姓名为name的所有成绩修改为score。