推荐阅读
Java 实现简易学生成绩管理
Java 实现学生学籍管理
Java 图形化界面编程(Swing)入门实例

文件版管理系统

要求
  • 实现学生多门成绩的增删改查
  • 学生需要按成绩平均值排序学生信息使用文件存储
  • 可以选用文本文件、序列化、CSV、 XML或其它文件格式
实现的功能
  • 这里使用json文件存储学生信息
  • 显示学生信息(json文件读取)
  • 增加学生信息(写入json文件)
  • 修改选中行学生信息(学号不能修改)
  • 删除选中行学生信息
  • 学生信息的显示默认按照平均分排序
  • 实时刷新学生信息(按照平均分排序)
  • 非空验证
    • 添加时学生信息不能为空
    • 修改或删除时得先选中一行
    • 学号不能修改
主界面截图

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

功能实现思路
  • 添加:将前段获取到的学生信息,封装成对象,格式化为json对象,写入文件
  • 显示:按行读取学生信息,解析成Student对象数组,按照平均分排序(冒泡排序)后,放入Vector,传到前端
  • 删除:遍历Student对象数组(设置最大值100),删除原json文件,将要删除的置为null,重新创建json文件,将对象数组中非null的写入文件
  • 修改:先删除在添加
  • 实时刷新学生信息(按照平均分排序):添加学生信息后,清除表格内容,重新读取json文件
具体代码实现
启动类
public class Main {
    public static void main(String[] args) throws Exception {
        new MainMenu().setVisible(true);
    }
}
学生类
public class Student {
	private String id;
	private String name;
	private String math;
	private String eng;
	private int avg;

// 省略get 、set 方法
}
前端界面

public class MainMenu extends JFrame{
    private DefaultTableModel tableModel;   //表格模型对象
    private JTable table;
    private JTextField text1;
    private JTextField text2;
    private JTextField text3;
    private JTextField text4;

    public MainMenu() throws Exception {
        super();
        setTitle("学生成绩表");
        setBounds(100,100,700,400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        final JFrame f = new JFrame("LoL");
        f.setSize(400, 300);
        f.setLocation(200, 200);
        f.setLayout(new BorderLayout());

        Vector col = new Vector();   //列名
        col.addElement("学号");
        col.addElement("姓名");
        col.addElement("数学");
        col.addElement("英语");

        Vector rowData = Admin.readJsonFile();
        Vector columnNames = col;

        // 新建表格
        tableModel = new DefaultTableModel(rowData, columnNames);
        table = new JTable(tableModel);

        JScrollPane scrollPane = new JScrollPane(table);   //支持滚动
        getContentPane().add(scrollPane, BorderLayout.CENTER);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  //单选

        table.addMouseListener(new MouseAdapter(){    //鼠标事件
            public void mouseClicked(MouseEvent e){
                int selectedRow = table.getSelectedRow(); //获得选中行索引
                Object o0 = tableModel.getValueAt(selectedRow, 0);
                Object o1 = tableModel.getValueAt(selectedRow, 1);
                Object o2 = tableModel.getValueAt(selectedRow, 2);
                Object o3 = tableModel.getValueAt(selectedRow, 3);
                text1.setText(o0.toString());  //给文本框赋值
                text2.setText(o1.toString());
                text3.setText(o2.toString());
                text4.setText(o3.toString());
            }
        });

        scrollPane.setViewportView(table);
        final JPanel panel = new JPanel();
        getContentPane().add(panel,BorderLayout.SOUTH);
        panel.add(new JLabel("学号: "));
        text1 = new JTextField(10);
        panel.add(text1);
        panel.add(new JLabel("姓名: "));
        text2 = new JTextField(10);
        panel.add(text2);
        panel.add(new JLabel("数学: "));
        text3 = new JTextField(10);
        panel.add(text3);
        panel.add(new JLabel("英语: "));
        text4 = new JTextField(10);
        panel.add(text4);

        final JButton addButton = new JButton("添加");   //添加按钮
        addButton.addActionListener(new ActionListener(){//添加事件
            public void actionPerformed(ActionEvent e){
                if (text1.getText().equals("")||text1.getText().equals("")||text2.getText().equals("")||text3.getText().equals("")||text4.getText().equals("")) {
                    // 弹出对话框提示用户
                    JOptionPane.showMessageDialog(f,"请输入完整学生信息!");
                    return;
                }
                try {
                    if (!new Admin().isExist(text1.getText())) {
                        // 弹出对话框提示用户
                        JOptionPane.showMessageDialog(f,"该学号已存在!");
                        return;
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                String []rowValues = {text1.getText(),text2.getText(),text3.getText(),text4.getText()};
                Student stu = new Student();
                stu.setId(text1.getText());
                stu.setName(text2.getText());
                stu.setMath(text3.getText());
                stu.setEng(text4.getText());
                int a = Integer.parseInt(text3.getText());
                int b = Integer.parseInt(text4.getText());
                stu.setAvg((a+b)/2);
                try {
                    new Admin().writeJsonFile(stu);
                    System.out.println("学生信息写入成功!");
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                tableModel.addRow(rowValues);  //添加一行
                int rowCount = table.getRowCount() +1;   //行数加上1
                text1.setText("");
                text2.setText("");
                text3.setText("");
                text4.setText("");

                //  清除表格数据数据,重新获取,刷新数据
                tableModel.getDataVector().clear();
                Vector rData = null;
                try {
                    rData = Admin.readJsonFile();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                tableModel.setDataVector(rData, columnNames);
            }
        });
        panel.add(addButton);

        final JButton updateButton = new JButton("修改");   //修改按钮
        updateButton.addActionListener(new ActionListener(){//添加事件
            public void actionPerformed(ActionEvent e){
                int selectedRow = table.getSelectedRow();//获得选中行的索引
                if (selectedRow==-1) {
                    // 弹出对话框提示用户
                    JOptionPane.showMessageDialog(f,"请选中修改行!");
                    return;
                }else {
                    String a = table.getValueAt(selectedRow,0).toString();
                    System.out.println(a);
                    System.out.println(text1.getText());
                    if (!text1.getText().equals(a)) {
                        // 弹出对话框提示用户
                        JOptionPane.showMessageDialog(f,"学号不能修改!");
                        return;
                    }
                    //修改指定的值:
//                    tableModel.setValueAt(text1.getText(), selectedRow, 0);
                    tableModel.setValueAt(text2.getText(), selectedRow, 1);
                    tableModel.setValueAt(text3.getText(), selectedRow, 2);
                    tableModel.setValueAt(text4.getText(), selectedRow, 3);

                    try {
                        new Admin().del(a);
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }

                    Student stu = new Student();
                    stu.setId(a);
                    stu.setName(text2.getText());
                    stu.setMath(text3.getText());
                    stu.setEng(text4.getText());
                    stu.setAvg(Integer.parseInt((text3.getText())+Integer.parseInt(text4.getText())/2));
                    try {
                        new Admin().writeJsonFile(stu);
                        System.out.println("学生修改写入成功!");
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
        });
        panel.add(updateButton);

        final JButton delButton = new JButton("删除");
        delButton.addActionListener(new ActionListener(){//添加事件
            public void actionPerformed(ActionEvent e){
                int selectedRow= table.getSelectedRow();//获得选中行的索引
                if (selectedRow==-1) {
                    // 弹出对话框提示用户
                    JOptionPane.showMessageDialog(f,"请选中删除行!");
                    return;
                }else {
                    String a = table.getValueAt(selectedRow,0).toString();
                    System.out.println(a==null);
                    try {
                        new Admin().del(a);
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                    tableModel.removeRow(selectedRow);  //删除行
                }
            }
        });
        panel.add(delButton);
    }
}
后端
public class Admin {
	public void writeJsonFile(Student stu) throws Exception {
		//构造JSONObject对象
		JSONObject obj = new JSONObject(stu);
		System.out.println("sss"+stu.getAvg());
		File file = new File("jsonTest.json");
		if (!file.exists()) {
			file.createNewFile();
		}
		FileWriter fw = new FileWriter(file.getAbsoluteFile(), true);
		BufferedWriter bw = new BufferedWriter(fw);
		obj.write(bw);
		// 加入换行符,读取数据时,按行读取
		bw.write("\r\n");
		bw.flush();
		bw.close();
		System.out.println(obj);
	}

	public Student[] allData() throws Exception {
		File file = new File("jsonTest.json");
		if (!file.exists()) {
			file.createNewFile();
		}
		StringBuffer str = new StringBuffer();
		BufferedReader reader = null;
		Student[] arr = new Student[100];
		Vector students = new Vector();
		reader = new BufferedReader(new FileReader(file));
		String tempString = null;
		int i = 0;
		while ((tempString = reader.readLine()) != null) {
			JSONObject json = new JSONObject(tempString);
			Student s = new Student();
			s.setId(json.getString("id"));
			s.setName(json.getString("name"));
			s.setMath(json.getString("math"));
			s.setEng(json.getString("eng"));
			arr[i] = s;
			i++;
		}
		reader.close();
		return arr;
	}

	// 判断学号是否存在
	public Boolean isExist(String id) throws Exception {
		Student[] arr = allData();
		Boolean f = true;
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] == null) {
				break;
			}
			if (arr[i].getId().equals(id)) {
				f = false;
				break;
			}
		}
		return f;
	}

	public static Vector readJsonFile() throws Exception {
		File file = new File("jsonTest.json");
		if (!file.exists()) {
			file.createNewFile();
		}
		StringBuffer str = new StringBuffer();
		BufferedReader reader = null;
		reader = new BufferedReader(new FileReader(file));
		String tempString = null;
		Student[] arr = new Student[100];
		int l = 0;
		while ((tempString = reader.readLine()) != null) {
			JSONObject json = new JSONObject(tempString);
//			Vector stu = new Vector();
//			stu.addElement(json.getString("id"));
//			stu.addElement(json.getString("name"));
//			stu.addElement(json.getString("math"));
//			stu.addElement(json.getString("eng"));
//
//			students.addElement(stu);

			Student s = new Student();
			s.setId(json.getString("id"));
			s.setName(json.getString("name"));
			s.setMath(json.getString("math"));
			s.setEng(json.getString("eng"));
			s.setAvg(json.getInt("avg"));
			arr[l] = s;
			l++;
		}
		reader.close();

		// 按照平均分进行排序
		Student temp = null; // 临时变量
		boolean flag = false; // 标识变量,表示是否进行过交换
		for (int i = 0; i < arr.length - 1; i++) {
			if (arr[i] == null) {
				break;
			}
			for (int j = 0; j < arr.length - 1 - i; j++) {
				if (arr[j+1] == null) {
					break;
				}
				if (arr[j].getAvg() > arr[j + 1].getAvg()) {
					flag = true;
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
			if (!flag) { // 在一趟排序中,一次交换都没有发生过
				break;
			} else {
				flag = false; // 重置flag!!!, 进行下次判断
			}
		}
		Vector students = new Vector();
		for (Student stud:arr){
			if (stud == null) {
				break;
			}
			Vector st = new Vector();
			st.addElement(stud.getId());
			st.addElement(stud.getName());
			st.addElement(stud.getMath());
			st.addElement(stud.getEng());
			students.addElement(st);
		}
		System.out.println(students);
		return students;
	}

	// 获取所有数据,将要删除的对象置为null,然后将其他数据再依次写入json文件
	public void del(String id) throws Exception {
		Student[] arr = allData();
		System.out.println("del:" + id);
		File file = new File("jsonTest.json");
		file.delete();

		for (int i = 0; i < arr.length; i++) {
			if (arr[i] == null) {
				break;
			}
			if (arr[i].getId().equals(id)) {
				arr[i] = null;
			}
			if (arr[i] != null) {
				writeJsonFile(arr[i]);
			}
		}
		System.out.println("学生信息删除成功!");
	}
}

备注

  • 用到 org.Json,得将它添加到类路径
    在这里插入图片描述
  • 参考:
    https://www.cnblogs.com/zhangdiIT/p/7590472.html
    https://www.cnblogs.com/gongchenglion/p/5892967.html

推荐阅读
Java 实现简易学生成绩管理
Java 实现学生学籍管理
Java 图形化界面编程(Swing)入门实例

一道Java实验题目
这个实现思路真的,,,

在这里插入图片描述

Logo

快速构建 Web 应用程序

更多推荐