课设要求:
1.带有图形界面(20%);
2.系统至少能够管理100名学生,每一个学生姓名、学号、班级等个人信息;还有高等数学、大学英语、计算机导论、体育等四项成绩(20%);
3.能够录入、修改、查询、删除任意学生信息(20%);
4.可以查询某课程所有不及格学生名单(20%);
5.能够将学生信息保存到硬盘,下次打开程序时还能够从硬盘读取(20%)。
package edu;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Administrator implements Serializable {
//接入接口序列化
// 定义 serialVersionUID 以确保序列化的兼容性
private static final long serialVersionUID = 1L;
/*管理员类,有私有变量账号和密码,
有个list集合存管理员信息,
能存储/加载信息*/
public static List<Administrator> Administrators=new ArrayList<>();
private String account;//管理员用户名
private String password;
public String getAccount() {
return account;
}
public String getPassword(){
return password;
}
public Administrator(String account, String password){
this.account=account;
this.password=password;
}//构造函数
public static void addAdministrator(Administrator administrator){
Administrators.add(administrator);
}//往List集合加成员
public static Administrator findAdministrator(String account){
for(Administrator administrator:Administrators){
if(administrator.getAccount().equals(account)){
return administrator;
}
}
return null;
}
public static boolean isRegistered(String account){
return findAdministrator(account)!=null;
}//找管理员是否注册过
public static boolean verifyPassword(String account,String password){
Administrator administrator = findAdministrator(account);
return administrator!=null&&administrator.getPassword().equals(password);
}
public static void saveAdministratorsToFile(String filename) throws IOException{
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename))) {
oos.writeObject(Administrators);// 将静态的管理员列表序列化并写入到指定文件
}
}//把集合序列化到文件
public static void loadAdministratorsFromFile(String filename) throws IOException, ClassNotFoundException {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filename))) {
Administrators = (List<Administrator>) ois.readObject();//反序列化到新集合
}
}//把文件信息反序列化到集合
}
package edu;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class GenerateStudents {
public static void main(String[] args) {
List<IStudent> students = new ArrayList<>();
Random random = new Random();
String[] names = {"张三", "李四", "王五", "赵六", "孙七", "周八", "吴九", "郑十"};
String[] sexes = {"男", "女"};
String[] classnames = {"一班", "二班", "三班", "四班"};
for (int i = 0; i < 100; i++) {
String name = names[random.nextInt(names.length)] + (i + 1);
String sex = sexes[random.nextInt(sexes.length)];
int age = 18 + random.nextInt(5);
String id = "S" + (1000 + i);
String classname = classnames[random.nextInt(classnames.length)];
double math = 50 + random.nextDouble() * 50;
double english = 50 + random.nextDouble() * 50;
double computer = 50 + random.nextDouble() * 50;
double pe = 50 + random.nextDouble() * 50;
students.add(new Student(name, sex, age, id, classname, math, english, computer, pe));
}
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("students.dat"))) {
oos.writeObject(students);
System.out.println("100个学生信息已生成并保存到 students.dat 文件中");
} catch (Exception e) {
e.printStackTrace();
}
}
}
package edu;
public interface IStudent {
//这里抽象/接口都可以,主要是为了写一个接口
//主要有学生信息的方法
String getName();
String getSex();
int getAge();
String getId();
String getClassName();
double getMath();
double getEnglish();
double getComputer();
double getPe();
void setName(String name);
void setSex(String sex);
void setAge(int age);
void setId(String studentId);
void setClassName(String className);
void setMath(double math);
void setEnglish(double english);
void setComputer(double computer);
void setPe(double pe);
}
package edu;
import java.io.IOException;
import java.util.List;
public interface IStudentManager {
//添加删除等等管理学生的接口
void addStudent(IStudent student);//传接口,松耦合
void removeStudent(String studentId);
IStudent findStudent(String studentId);
List<IStudent> getAllStudents();
List<IStudent> getFailingStudents(String subject);
void saveToFile(String filename) throws IOException;
void loadFromFile(String filename) throws IOException, ClassNotFoundException;
}
package edu;
import javax.swing.*;
import java.awt.*;
import java.io.IOException;
public class LoginJframe extends JFrame{
/* 登陆界面
管理员可以凭借特殊密码登录
密码为“账号+xnxx”
如果没有注册过就自动注册记录 */
private static final String FILENAME = "administrator.dat";//管理员信息保存文件
public LoginJframe(){
// 获取内容面板
Container container = this.getContentPane();
// 设置内容面板的布局管理器为 FlowLayout,让组件自动排列
container.setLayout(new FlowLayout());
//建立文本字段,输入账号密码
JTextField accountField = new JTextField(16);
JTextField passwordField = new JTextField(16);
//加载管理员信息
loadAdministrators();
while(true){
Object[] message= {
"账号:",accountField,
"密码",passwordField,
};
//显示确认对话框,用户可以选择确定或取消
int option = JOptionPane.showConfirmDialog(null, message, "西南小学学生成绩管理系统", JOptionPane.OK_CANCEL_OPTION);
//对话框居中,加载message输入框,标题,显示确定和取消选项
if(option==JOptionPane.OK_OPTION){
//确认,然后读取输入信息
String account = accountField.getText();
String password = passwordField.getText();
String expectedpassword = account + "xnxx";
if(Administrator.isRegistered(account)){
if(Administrator.verifyPassword(account,password)){
JOptionPane.showMessageDialog(null,"欢迎管理员"+account,"西南小学学生成绩管理系统",JOptionPane.INFORMATION_MESSAGE);
new MainJframe();
this.dispose();//关闭当前窗口
break;//退出循环
}else{
// 密码错误,显示错误消息并清空输入框
JOptionPane.showMessageDialog(null, "密码错误,请重新输入", "错误警告!!!", JOptionPane.ERROR_MESSAGE);
accountField.setText("");
passwordField.setText("");
}
}else{
//还没注册,自动注册
if(expectedpassword.equals(password)){
//用户输入密码符合规定密码格式,认为是新管理员,自动注册账号
Administrator.addAdministrator(new Administrator(account,password));
JOptionPane.showMessageDialog(null, "注册成功,欢迎管理员 " + account ,"西南小学学生成绩管理系统",JOptionPane.INFORMATION_MESSAGE);
saveAdministrators();//保存新用户信息
new MainJframe();
this.dispose();//关闭当前窗口
break;//退出循环
}else{
//密码不符合预期
JOptionPane.showMessageDialog(null, "非法注册信息", "注册失败", JOptionPane.ERROR_MESSAGE);
accountField.setText("");
passwordField.setText("");
}
}
}else{
break;//用户点击取消
}
}
}
private void loadAdministrators(){
try{
Administrator.loadAdministratorsFromFile(FILENAME);
//对Administrator类进行调用
} catch (IOException | ClassNotFoundException e) {
System.out.println("Warning:加载管理员信息失败,请尝试重新进入系统");
}
}//加载管理员信息
private void saveAdministrators(){
try{
Administrator.saveAdministratorsToFile(FILENAME);
}catch (IOException e) {
System.out.println("Warning:保存管理员数据失败:" + e.getMessage());
}
}
}
package edu;
import javax.swing.*;
public class Main {
public static void main(String[] args) {
new LoginJframe();
}
}
package edu;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
public class MainJframe extends JFrame {
private static IStudentManager studentManager;
private static JTable jTable;
private static DefaultTableModel tableModel;
public MainJframe(){
studentManager = new StudentManager();
this.setTitle("西南中学学生成绩管理系统");
//直接退出
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(800,600);
this.setLocationRelativeTo(null);
//表格表头
String[] headers = {"姓名","性别","年龄", "学号", "班级", "高等数学", "大学英语", "计算机导论", "体育"};
tableModel = new DefaultTableModel(headers,0);//只有个表头没有行
jTable = new JTable(tableModel);//实例化表格
JScrollPane jScrollPane = new JScrollPane(jTable);
jScrollPane.setPreferredSize(new Dimension(700,500));
// jScrollPane.setVisible(true);//添加滚动轮
JPanel jPanel=new JPanel();
jPanel.setLayout(new BorderLayout());//五分界面
JButton addButton = new JButton("添加学生");
JButton deleteButton = new JButton("删除学生");
JButton updateButton = new JButton("更新学生");
JButton searchButton = new JButton("查询学生");
JButton failingButton = new JButton("查询不及格学生");
JButton saveButton = new JButton("保存到文件");
JButton loadButton = new JButton("从文件加载");
//操作按钮
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout());
buttonPanel.add(addButton);
buttonPanel.add(deleteButton);
buttonPanel.add(updateButton);
buttonPanel.add(searchButton);
buttonPanel.add(failingButton);
buttonPanel.add(saveButton);
buttonPanel.add(loadButton);
// 将表格和按钮面板添加到主面板
//jPanel.add(new JScrollPane(jTable),BorderLayout.CENTER);//表格放中间
jPanel.add(jScrollPane, BorderLayout.CENTER);
jPanel.add(buttonPanel,BorderLayout.SOUTH);//底部按钮
addButton.addActionListener(e -> addStudent());
deleteButton.addActionListener(e -> deleteStudent());
updateButton.addActionListener(e -> updateStudent());
searchButton.addActionListener(e -> searchStudent());
failingButton.addActionListener(e -> searchFailingStudents());
saveButton.addActionListener(e -> saveToFile());
loadButton.addActionListener(e -> loadFromFile());
this.add(jPanel);
this.setVisible(true);
Container container = this.getContentPane();
container.setLayout(new BorderLayout());
JLabel welcomeLabel = new JLabel("欢迎进入管理员主界面", JLabel.CENTER);
container.add(welcomeLabel, BorderLayout.CENTER);
this.setVisible(true);
}
//添加操作
private static void addStudent(){
JTextField nameField = new JTextField();
JTextField sexField = new JTextField();
JTextField ageField = new JTextField();
JTextField idField = new JTextField();
JTextField classnameField = new JTextField();
JTextField mathField = new JTextField();
JTextField englishField = new JTextField();
JTextField computerField = new JTextField();
JTextField peField = new JTextField();
Object[] message = {
"姓名:", nameField,
"性别 (男/女):", sexField,
"年龄:", ageField,
"学号:", idField,
"班级:", classnameField,
"高等数学 (0-100):", mathField,
"大学英语 (0-100):", englishField,
"计算机导论 (0-100):", computerField,
"体育 (0-100):", peField,
};
while(true){
int option = JOptionPane.showConfirmDialog(null, message, "添加学生", JOptionPane.OK_CANCEL_OPTION);
if(option==JOptionPane.OK_OPTION){
try{
String sex = sexField.getText();
if (!sex.equals("男") && !sex.equals("女")) {
throw new IllegalArgumentException("性别必须为男或女");
}
double math = Double.parseDouble(mathField.getText());
double english = Double.parseDouble(englishField.getText());
double computer = Double.parseDouble(computerField.getText());
double pe = Double.parseDouble(peField.getText());
if (math < 0 || math > 100 || english < 0 || english > 100 || computer < 0 || computer > 100 || pe < 0 || pe > 100) {
throw new IllegalArgumentException("学生成绩必须在0到100之间");
}
IStudent student = new Student(
nameField.getText(),
sexField.getText(),
Integer.parseInt(ageField.getText()),
idField.getText(),
classnameField.getText(),
math,
english,
computer,
pe
);
studentManager.addStudent(student);
updateTable();
break; // 添加成功,跳出循环
}catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "请输入正确的数字格式", "错误", JOptionPane.ERROR_MESSAGE);
} catch(IllegalArgumentException e){
JOptionPane.showMessageDialog(null, e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
}
}else{
break;//取消操作,退出程序
}
}
}
//删除学生
private static void deleteStudent(){
String studentId = JOptionPane.showInputDialog("输入要删除的学生学号:");
studentManager.removeStudent(studentId);
updateTable();//更新硬盘信息
saveToFile();
}
//更新学生
private static void updateStudent(){
String studentId = JOptionPane.showInputDialog("输入要更新的学生学号:");
IStudent student = studentManager.findStudent(studentId);
if(student!=null){
JTextField nameField = new JTextField(student.getName());
JTextField sexField = new JTextField(student.getSex());
JTextField ageField = new JTextField(String.valueOf(student.getAge()));
JTextField idField = new JTextField(student.getId());
JTextField roomField = new JTextField(student.getClassName());
JTextField mathField = new JTextField(String.valueOf(student.getMath()));
JTextField englishField = new JTextField(String.valueOf(student.getEnglish()));
JTextField computerField = new JTextField(String.valueOf(student.getComputer()));
JTextField peField = new JTextField(String.valueOf(student.getPe()));
//把需要修改人员的信息加载到文本框
Object[] message = {
"姓名:", nameField,
"性别 (男/女):", sexField,
"年龄:", ageField,
"学号:", idField,
"班级:", roomField,
"高等数学 (0-100):", mathField,
"大学英语 (0-100):", englishField,
"计算机导论 (0-100):", computerField,
"体育 (0-100):", peField,
};
while (true) {
int option = JOptionPane.showConfirmDialog(null, message, "更新学生", JOptionPane.OK_CANCEL_OPTION);
if (option == JOptionPane.OK_OPTION) {
try {
String sex = sexField.getText();
if (!sex.equals("男") && !sex.equals("女")) {
throw new IllegalArgumentException("性别必须为男或女");
}
double math = Double.parseDouble(mathField.getText());
double english = Double.parseDouble(englishField.getText());
double computer = Double.parseDouble(computerField.getText());
double pe = Double.parseDouble(peField.getText());
if (math < 0 || math > 100 || english < 0 || english > 100 || computer < 0 || computer > 100 || pe < 0 || pe > 100) {
throw new IllegalArgumentException("成绩必须在0到100之间");
}
student.setName(nameField.getText());
student.setSex(sex);
student.setAge(Integer.parseInt(ageField.getText()));
student.setId(idField.getText());
student.setClassName(roomField.getText());
student.setMath(math);
student.setEnglish(english);
student.setComputer(computer);
student.setPe(pe);
updateTable();
break; // 更新成功,跳出循环
}catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "请输入正确的数字格式", "错误", JOptionPane.ERROR_MESSAGE);
} catch (IllegalArgumentException e) {
JOptionPane.showMessageDialog(null, e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
}
} else {
break; // 用户取消操作,退出循环
}
}
} else {
JOptionPane.showMessageDialog(null, "未找到学生!");
}
}
//查找学生
private static void searchStudent(){
String studentId = JOptionPane.showInputDialog("输入要查询的学生学号:");
IStudent student = studentManager.findStudent(studentId);
if(student!=null){
//有这个人
JOptionPane.showMessageDialog(null,String.format("姓名: %s\n性别:%s\n年龄:%d\n学号: %s\n班级: %s\n高等数学: %.2f\n大学英语: %.2f\n计算机导论: %.2f\n体育: %.2f",
student.getName(), student.getSex(),student.getAge(),student.getId(), student.getClassName(), student.getMath(),
student.getEnglish(), student.getComputer(), student.getPe()));
}else{
JOptionPane.showMessageDialog(null,"未查询到学生");
}
}
//查询不及格人数
private static void searchFailingStudents(){
String subject = JOptionPane.showInputDialog("输入课程名称(高等数学、大学英语、计算机导论、体育):");
List<IStudent> failingStudents = studentManager.getFailingStudents(subject);
if(failingStudents.isEmpty()){
JOptionPane.showMessageDialog(null,subject+"没有不及格学生。");
}else{
StringBuilder message = new StringBuilder();
for(IStudent student:failingStudents){
message.append(String.format("姓名: %s 学号: %s 班级: %s %s: %.2f\n", student.getName(), student.getId(), student.getClassName(), subject, getScoreBySubject(student, subject)));
}
JTextArea textArea = new JTextArea(message.toString());
textArea.setEditable(false);//文本区域只显示,不编辑
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setPreferredSize(new Dimension(500, 200)); // 设置滚动窗口的大小
JOptionPane.showMessageDialog(null, scrollPane, subject + "不及格学生", JOptionPane.INFORMATION_MESSAGE);
//JOptionPane.showMessageDialog(null, message.toString());
}
}
private static double getScoreBySubject(IStudent student, String subject){
switch (subject.toLowerCase()) {
case "高等数学":
return student.getMath();
case "大学英语":
return student.getEnglish();
case "计算机导论":
return student.getComputer();
case "体育":
return student.getPe();
default:
return 0;
}
}
//保存
private static void saveToFile() {
try {
studentManager.saveToFile("students.dat");
JOptionPane.showMessageDialog(null, "保存成功!");
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "请输入正确的数字格式", "错误", JOptionPane.ERROR_MESSAGE);
} catch (IOException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "保存失败!");
}
}
//加载
private static void loadFromFile() {
try {
studentManager.loadFromFile("students.dat");
updateTable();
JOptionPane.showMessageDialog(null, "加载成功!");
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "加载失败!");
}
}
//更新硬盘信息
private static void updateTable(){
tableModel.setRowCount(0);
for (IStudent student : studentManager.getAllStudents()) {
tableModel.addRow(new Object[]{
student.getName(),
student.getSex(),
student.getAge(),
student.getId(),
student.getClassName(),
student.getMath(),
student.getEnglish(),
student.getComputer(),
student.getPe()
});
}
}
}
package edu;
import java.io.Serializable;
public class Student implements IStudent, Serializable {
private String name;
private String sex;
private int age;
private String id;
private String classname;
private double math;
private double english;
private double computer;
private double pe;
public Student() {
}
public Student(String name, String sex, int age, String id, String classname, double math, double english, double computer, double pe) {
this.name = name;
this.setSex(sex);
this.age = age;
this.id = id;
this.classname = classname;
this.setMath(math);
this.setEnglish(english);
this.setComputer(computer);
this.setPe(pe);
}
@Override
public String getName() {
return name;
}
@Override
public String getSex() {
return sex;
}
@Override
public int getAge() {
return age;
}
@Override
public String getId() {
return id;
}
@Override
public String getClassName() {
return classname;
}
@Override
public double getMath() {
return math;
}
@Override
public double getEnglish() {
return english;
}
@Override
public double getComputer() {
return computer;
}
@Override
public double getPe() {
return pe;
}
@Override
public void setName(String name) {
this.name=name;
}
@Override
public void setSex(String sex) {
this.sex=sex;
}
@Override
public void setAge(int age) {
this.age=age;
}
@Override
public void setId(String studentId) {
this.id=id;
}
@Override
public void setClassName(String className) {
this.classname=className;
}
@Override
public void setMath(double math) {
this.math=math;
}
@Override
public void setEnglish(double english) {
this.english=english;
}
@Override
public void setComputer(double computer) {
this.computer=computer;
}
@Override
public void setPe(double pe) {
this.pe=pe;
}
}
package edu;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class StudentManager implements IStudentManager{
//实现接口
//学生集合
private List<IStudent> students = new ArrayList<>();
@Override
public void addStudent(IStudent student) {
students.add(student);
}//添加
@Override
public void removeStudent(String studentId) {
students.removeIf(student->student.getId().equals(studentId));
}//删除
@Override
public IStudent findStudent(String studentId) {
for(IStudent student:students){//面向抽象
if(student.getId().equals(studentId)){
return student;
}
}
return null;
}//查找
@Override
public List<IStudent> getAllStudents() {
return students;
}
@Override
public List<IStudent> getFailingStudents(String subject) {
List<IStudent>failingStudents = new ArrayList<>();
for(IStudent student:students){
switch (subject.toLowerCase()){
case "高等数学":
if (student.getMath() < 60) {
failingStudents.add(student);
}
break;
case "大学英语":
if (student.getEnglish() < 60) {
failingStudents.add(student);
}
break;
case "计算机导论":
if (student.getComputer() < 60) {
failingStudents.add(student);
}
break;
case "体育":
if (student.getPe() < 60) {
failingStudents.add(student);
}
break;
}
}
return failingStudents;
}
@Override
public void saveToFile(String filename) throws IOException {
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename))) {
out.writeObject(students);
}
}
@Override
public void loadFromFile(String filename) throws IOException, ClassNotFoundException {
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename))) {
students = (List<IStudent>) in.readObject();
}
}
}
PS: 此处非JAVA代码,为PlantUml语法,在idea内置PlantUml图绘制插件可以使用(需要配置环境)
@startuml
'https://plantuml.com/class-diagram
class Administrator
interface Serializable<<interface>>
interface IStudent<<interface>>
interface IStudentManager<<interface>>
class GenerateStudents
class LoginJframe
class Main
class MainJframe
class Student
class StudentManager
Serializable<|..Administrator
JFrame<|-- LoginJframe
LoginJframe-->Administrator
LoginJframe<..Main
LoginJframe..>MainJframe
JFrame<|-- MainJframe
MainJframe-->IStudentManager
IStudentManager-->IStudent
Student..|>IStudent
Student..|>Serializable
StudentManager..|>IStudentManager
class Administrator{
+{static}Administrators:List<Administrator>
-account:String
-password:String
+(Strng,String):Administrator
+getAccount():String
+getPasswoed():String
+{static}addAdministraror(Administor):void
+{static}findAdministraror(String):Administrator
+{static}isRegistered(String)):boolean
+{static}verifyPassword(String):boolean
+{static}saveAdministrarorToFile(String):void
+{static}loadAdministrarorToFile(String):void
}
interface IStudent<<interface>>{
+getName():String
+setName():void
+getSex():String
+setSex():void
+getAge():int
+setAge():void
+getId():String
+setId()():void
+getClassName():String
+setClassName():void
+getMath():double
+setMath():void
+getEnglish():double
+setEnglish():void
+getComputer():double
+setComputer():void
+getPe():double
+setPe():void
}
interface IStudentManager<<interface>>{
+addStudent(IStudent):void
+removeStudent(IStudent):void
+findStudent(String):IStudent
+getAllStudents():List<IStudent>
+getFailingStudents():List<IStudent>
+saveToFile(String):void
+loadFromFile(String):void
}
class GenerateStudents{
}
class LoginJframe{
+():LoginJframe
-{static}FILENAME:String
-loadAdministraror():void
-saveAdministraror():void
}
note left of LoginJframe:FILENAME = "administrator.dat";\n//管理员信息保存文件名
class Main{
}
class MainJframe{
-{static}studentManager:IStudentManager
-{static}jTable:jTable
-{static}tableModel:DefaultTableModel
+():MainJframe
+addStudent():void
+deleteStudent():void
+updateStudent():void
+searchStudent(String):IStudent
+searchFailingStudents():List<IStudent>
+getScoreBySubject(IStudent,String):double
+saveToFile():void
+loadFromFile():void
}
note bottom of MainJframe://通过方法里面的判断\n选择是否通过实现的\nstudengManager调用\nStudengManager方法
class Student{
-name:String
-sex:String
-age:int
-id:String
-classname:String
-math:double
-english:double
-computer:double
-pe:double
+(String,String,int,String,
double,doule,double,doule) :Student
}
class StudentManager{
-students:List<IStudent>
}
@enduml
效果图:
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo6.cn 版权所有 赣ICP备2024042791号-9
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务