推荐阅读
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实验题目
这个实现思路真的,,,