💥 该系列属于【Java基础编程500题】专栏,如您需查看Java基础的其他相关题目,请您点击左边的连接
目录
✨✨ 返回题目目录 ✨ ✨
1. 项目目标
- 设计并实现一个具有界面的学生成绩管理系统。
- 实现学生成绩的录入、查询、修改、删除和显示所有成绩等功能。
2. 功能需求
(1)用户界面需求
- 系统主界面应包含学号、成绩输入框,以及录入、删除、修改、查询和显示所有成绩等按钮。
- 操作结果在界面下方以标签形式显示。
(2)功能模块需求
- 录入成绩:用户输入学号和成绩,点击“录入”按钮,系统将成绩添加到Map中。
- 删除成绩:用户输入学号,点击“删除”按钮,系统从Map中删除对应成绩。
- 修改成绩:用户输入学号和新的成绩,点击“修改”按钮,系统更新Map中的成绩。
- 查询成绩:用户输入学号,点击“查询”按钮,系统显示对应学生的成绩。
- 显示所有成绩:点击“显示所有成绩”按钮,系统以文本区域形式显示所有学生的成绩。
3. 项目展示
4. 代码实现
(1)项目结构
(2)GradeManager
- 负责管理学生的成绩,包括添加、删除、更新和查询学生成绩的功能。
- 成绩管理是系统的核心功能,它应该独立于用户界面。将成绩管理逻辑封装在 GradeManager 类中,可以使得代码更加模块化和易于维护。
import java.util.Map; // 导入Map接口,用于存储键值对
import java.util.NoSuchElementException; // 导入NoSuchElementException类,用于处理查找元素不存在的情况
import java.util.TreeMap; // 导入TreeMap类,用于实现一个有序的Map集合
class GradeManager {
private Map<String, Integer> studentGrades; // 声明一个Map类型的私有变量,用于存储学生学号和成绩的映射关系
public GradeManager() { // 构造方法,用于初始化GradeManager对象
studentGrades = new TreeMap<>(); // 创建一个TreeMap实例,确保学号按照自然顺序排序
// 初始化HashMap,添加一些示例数据
studentGrades.put("A001", 85); // 添加学号和成绩到Map中
studentGrades.put("A002", 92); // 添加学号和成绩到Map中
studentGrades.put("A003", 78); // 添加学号和成绩到Map中
}
public void addGrade(String studentId, int grade) { // 添加成绩的方法
if (studentGrades.containsKey(studentId)) { // 检查学号是否已存在
throw new IllegalArgumentException("学号 " + studentId + " 已存在。"); // 如果存在,抛出异常
} else {
studentGrades.put(studentId, grade); // 如果不存在,添加学号和成绩到Map中
}
}
public void deleteGrade(String studentId) { // 删除成绩的方法
if (studentGrades.containsKey(studentId)) { // 检查学号是否存在于Map中
studentGrades.remove(studentId); // 如果存在,从Map中移除该学号的成绩
} else {
throw new NoSuchElementException("学号 " + studentId + " 不存在。"); // 如果不存在,抛出异常
}
}
public void updateGrade(String studentId, int grade) { // 更新成绩的方法
if (studentGrades.containsKey(studentId)) { // 检查学号是否存在于Map中
studentGrades.put(studentId, grade); // 如果存在,更新Map中对应学号的成绩
} else {
throw new NoSuchElementException("学号 " + studentId + " 不存在。"); // 如果不存在,抛出异常
}
}
public Integer queryGrade(String studentId) { // 查询成绩的方法
return studentGrades.get(studentId); // 返回Map中对应学号的成绩,如果不存在则返回null
}
public String getAllGrades() { // 获取所有成绩的方法
StringBuilder allGradesText = new StringBuilder(); // 创建一个StringBuilder对象,用于构建成绩文本
for (Map.Entry<String, Integer> entry : studentGrades.entrySet()) { // 遍历Map中的所有条目
allGradesText.append("学号: ").append(entry.getKey()) // 添加学号到StringBuilder
.append(" 的成绩是: ").append(entry.getValue()) // 添加成绩到StringBuilder
.append("\n"); // 添加换行符到StringBuilder
}
return allGradesText.toString(); // 返回构建好的成绩文本
}
}
(3)GradeQuerySystem
- 负责构建用户界面,包括文本框、按钮和标签等组件,以及处理按钮点击事件,调用类的相关方法来执行GradeManager成绩管理操作。
import javax.swing.*; // 导入Swing库,用于创建图形用户界面
import java.awt.*; // 导入AWT库,用于图形界面设计
import java.util.NoSuchElementException; // 导入NoSuchElementException类,用于处理查找元素不存在的情况
class GradeQuerySystem extends JFrame { // 创建一个名为GradeQuerySystem的类,继承自JFrame类
private JTextField studentIdField; // 声明一个文本框,用于输入学生学号
private JTextField gradeField; // 声明一个文本框,用于输入学生成绩
private JLabel resultLabel; // 声明一个标签,用于显示操作结果
private JTextArea allGradesArea; // 声明一个文本区域,用于显示所有学生成绩
private GradeManager gradeManager; // 声明一个GradeManager对象,用于管理成绩
public GradeQuerySystem() { // 构造方法,用于初始化GradeQuerySystem对象
gradeManager = new GradeManager(); // 创建GradeManager实例
createUI(); // 调用方法创建用户界面
}
private void createUI() { // 创建用户界面的方法
setTitle("成绩管理系统"); // 设置窗口标题
setSize(500, 400); // 设置窗口大小
setLocationRelativeTo(null); // 设置窗口相对于屏幕居中
setDefaultCloseOperation(EXIT_ON_CLOSE); // 设置窗口关闭操作
setLayout(new FlowLayout()); // 设置布局管理器为FlowLayout
add(new JLabel("学号:")); // 添加标签提示输入学号
studentIdField = new JTextField(15); // 创建文本框并设置大小
add(studentIdField); // 将文本框添加到窗口
add(new JLabel("成绩:")); // 添加标签提示输入成绩
gradeField = new JTextField(5); // 创建文本框并设置大小
add(gradeField); // 将文本框添加到窗口
JButton addButton = new JButton("录入"); // 创建一个录入按钮
addButton.addActionListener(e -> addGrade()); // 为按钮添加事件监听器
add(addButton); // 将按钮添加到窗口
JButton deleteButton = new JButton("删除"); // 创建一个删除按钮
deleteButton.addActionListener(e -> deleteGrade()); // 为按钮添加事件监听器
add(deleteButton); // 将按钮添加到窗口
JButton updateButton = new JButton("修改"); // 创建一个修改按钮
updateButton.addActionListener(e -> updateGrade()); // 为按钮添加事件监听器
add(updateButton); // 将按钮添加到窗口
JButton queryButton = new JButton("查询"); // 创建一个查询按钮
queryButton.addActionListener(e -> queryGrade()); // 为按钮添加事件监听器
add(queryButton); // 将按钮添加到窗口
JButton showAllButton = new JButton("显示所有成绩"); // 创建一个显示所有成绩按钮
showAllButton.addActionListener(e -> showAllGrades()); // 为按钮添加事件监听器
add(showAllButton); // 将按钮添加到窗口
allGradesArea = new JTextArea(10, 40); // 创建文本区域以显示所有成绩
allGradesArea.setEditable(false); // 设置文本区域不可编辑
add(new JScrollPane(allGradesArea)); // 将文本区域添加到滚动窗格中
resultLabel = new JLabel("操作结果将显示在这里"); // 创建一个标签用于显示操作结果
add(resultLabel); // 将标签添加到窗口
}
private void addGrade() { // 录入成绩的方法
try {
String studentId = studentIdField.getText(); // 获取输入的学号
int grade = Integer.parseInt(gradeField.getText()); // 获取输入的成绩并转换为整数
gradeManager.addGrade(studentId, grade); // 调用GradeManager的方法添加成绩
resultLabel.setText("学号 " + studentId + " 的成绩已录入。"); // 显示录入成功的消息
} catch (NumberFormatException ex) { // 捕获转换成绩时的异常
resultLabel.setText("请输入有效的成绩。"); // 显示错误消息
} catch (IllegalArgumentException ex) { // 捕获学号已存在的异常
resultLabel.setText(ex.getMessage()); // 显示异常信息
}
}
private void deleteGrade() { // 删除成绩的方法
try {
String studentId = studentIdField.getText(); // 获取输入的学号
gradeManager.deleteGrade(studentId); // 调用GradeManager的方法删除成绩
resultLabel.setText("学号 " + studentId + " 的成绩已删除。"); // 显示删除成功的消息
} catch (NoSuchElementException ex) { // 捕获学号不存在的异常
resultLabel.setText(ex.getMessage()); // 显示异常信息
}
}
private void updateGrade() { // 更新成绩的方法
try {
String studentId = studentIdField.getText(); // 获取输入的学号
int grade = Integer.parseInt(gradeField.getText()); // 获取输入的成绩并转换为整数
gradeManager.updateGrade(studentId, grade); // 调用GradeManager的方法更新成绩
resultLabel.setText("学号 " + studentId + " 的成绩已更新。"); // 显示更新成功的消息
} catch (NumberFormatException ex) { // 捕获转换成绩时的异常
resultLabel.setText("请输入有效的成绩。"); // 显示错误消息
} catch (NoSuchElementException ex) { // 捕获学号不存在的异常
resultLabel.setText(ex.getMessage()); // 显示异常信息
}
}
private void queryGrade() { // 查询成绩的方法
String studentId = studentIdField.getText(); // 获取输入的学号
Integer grade = gradeManager.queryGrade(studentId); // 调用GradeManager的方法查询成绩
if (grade != null) { // 如果成绩存在
resultLabel.setText("学号 " + studentId + " 的成绩是: " + grade); // 显示成绩
} else { // 如果成绩不存在
resultLabel.setText("未找到学号为 " + studentId + " 的学生。"); // 显示错误消息
}
}
private void showAllGrades() { // 显示所有成绩的方法
allGradesArea.setText(gradeManager.getAllGrades()); // 调用GradeManager的方法获取所有成绩文本
}
}
(4)Main
- 是程序的入口点,负责启动应用程序,创建 GradeQuerySystem 实例,并设置窗口可见。
import javax.swing.*;
public class Main {
public static void main(String[] args) { // 主方法,程序的入口点
SwingUtilities.invokeLater(() -> {// 使用SwingUtilities.invokeLater来确保GUI的创建和更新在事件调度线程中执行
GradeQuerySystem frame = new GradeQuerySystem(); // 创建GradeQuerySystem的实例
frame.setVisible(true); // 设置窗口可见
});
}
}