Swing小项目
无需任何额外设置,直接可以在eclipse用
非常简单的文件结构

简单的登录界面

进去后就大概是这么个样子

很久从前写的了,我就不一一打开展示了。内容和无UI版本差不多,只是用简单的Swing实现了界面化操作
数据是可以保存在根目次下的data.bat文件中,退出重新登录,之前录入的数据也是存在的。
Main.java
- package swing;
- import javax.swing.*;
- import java.io.*;
- import java.util.ArrayList;
- import java.util.List;
- public class Main {
- private static final String FILE_PATH = "data.dat";//static修饰符表示变量FILE_PATH是类级别的,而不是实例(对象)级别的。即不需要创建Main类的对象就可以访问FILE_PATH,否则需要通过Main类的对象来访问,final修饰符表示变量初始化后就无法更改
- private static List<Course> courseList = new ArrayList<>();
- private static List<Teacher> teacherList = new ArrayList<>();
- private static List<Student> studentList = new ArrayList<>();
- public static void main(String[] args) {
- loadData();
- SwingUtilities.invokeLater(() -> {
- new LoginFrame();
- });
- }
- public static void loadData() {
- try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.dat"))) {
- courseList = (List<Course>) ois.readObject();//读取是反序列化的过程,将文件存储的字节流提取出来还原到对象中
- teacherList = (List<Teacher>) ois.readObject();
- studentList = (List<Student>) ois.readObject();
- JOptionPane.showMessageDialog(null, "Data loaded successfully.");
- } catch (EOFException e) {
- JOptionPane.showMessageDialog(null, "Data file not found, initializing default data.");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static void saveData() {
- try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data.dat"))) {
- oos.writeObject(courseList);//写入是序列化的过程,将数据转化为字节流的形式存储起来
- oos.writeObject(teacherList);
- oos.writeObject(studentList);
- JOptionPane.showMessageDialog(null, "Data saved successfully.");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static List<Course> getCourseList() {
- return courseList;
- }
- public static List<Teacher> getTeacherList() {
- return teacherList;
- }
- public static List<Student> getStudentList() {
- return studentList;
- }
- }
复制代码 AdminMenu.java
- package swing;
- import javax.swing.*;
- import java.awt.*;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.util.Comparator;
- public class AdminMenu extends JFrame {
- public AdminMenu() {
- setTitle("管理员菜单");
- setSize(600, 400); // 调整窗口大小
- setLayout(new GridLayout(8, 1));
- JButton addCourseButton = new JButton("添加课程");
- JButton deleteCourseButton = new JButton("删除课程");
- JButton sortCoursesButton = new JButton("按照选课人数排序");
- JButton modifyTeacherButton = new JButton("修改授课教师");
- JButton restorePasswordsButton = new JButton("恢复密码");
- JButton viewListsButton = new JButton("查看课程、教师和学生列表");
- JButton addTeacherButton = new JButton("添加教师");
- JButton addStudentButton = new JButton("添加学生");
- JButton deleteTeacherButton = new JButton("删除教师");
- JButton deleteStudentButton = new JButton("删除学生");
- add(addCourseButton);
- add(deleteCourseButton);
- add(sortCoursesButton);
- add(modifyTeacherButton);
- add(restorePasswordsButton);
- add(viewListsButton);
- add(addTeacherButton);
- add(addStudentButton);
- add(deleteTeacherButton);
- add(deleteStudentButton);
- addCourseButton.addActionListener(e -> addCourse());
- deleteCourseButton.addActionListener(e -> deleteCourse());
- sortCoursesButton.addActionListener(e -> sortCourses());
- modifyTeacherButton.addActionListener(e -> modifyTeacher());
- restorePasswordsButton.addActionListener(e -> restorePasswords());
- viewListsButton.addActionListener(e -> viewLists());
- addTeacherButton.addActionListener(e -> addTeacher());
- addStudentButton.addActionListener(e -> addStudent());
- deleteTeacherButton.addActionListener(e -> deleteTeacher());
- deleteStudentButton.addActionListener(e -> deleteStudent());
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- setVisible(true);
- }
- private void addCourse() {
- String courseName = JOptionPane.showInputDialog("输入课程名称:");
- String isMandatoryInput = JOptionPane.showInputDialog("输入是否为必修课 (yes/no):");
- boolean isMandatory = isMandatoryInput.equalsIgnoreCase("yes");
- Teacher selectedTeacher = (Teacher) JOptionPane.showInputDialog(null,
- "选择任课教师:", "添加课程",
- JOptionPane.QUESTION_MESSAGE, null,
- Main.getTeacherList().toArray(),
- Main.getTeacherList().get(0));
- Course newCourse = new Course(courseName, isMandatory, selectedTeacher);
- if (!isMandatory) {
- String maxEnrollmentInput = JOptionPane.showInputDialog("输入最大选课人数:");
- newCourse.maxEnrollment = Integer.parseInt(maxEnrollmentInput); // 仅对选修课设置最大人数
- }
- Main.getCourseList().add(newCourse);
- Main.saveData();
- JOptionPane.showMessageDialog(this, "课程添加成功");
- }
- private void deleteCourse() {
- String courseName = JOptionPane.showInputDialog("输入要删除的课程名称:");
- Main.getCourseList().removeIf(course -> course.getName().equals(courseName));
- Main.saveData();
- JOptionPane.showMessageDialog(this, "课程删除成功");
- }
- private void sortCourses() {
- Main.getCourseList().sort(Comparator.comparingInt(Course::getCurrentEnrollment).reversed());
- JOptionPane.showMessageDialog(this, "课程已按选课人数排序");
- }
- private void modifyTeacher() {
- String teacherName = JOptionPane.showInputDialog("输入教师用户名:");
- String newCourseName = JOptionPane.showInputDialog("输入新的课程名称:");
-
- // 修改授课教师的逻辑
- // 这里可以扩展,以便选择具体的课程和教师进行修改
- JOptionPane.showMessageDialog(this, "授课教师修改成功");
- }
- private void restorePasswords() {
- for (Teacher teacher : Main.getTeacherList()) {
- teacher.changePassword("123456");
- }
- for (Student student : Main.getStudentList()) {
- student.changePassword("123456");
- }
- Main.saveData();
- JOptionPane.showMessageDialog(this, "所有密码已恢复为初始密码");
- }
- private void viewLists() {
- StringBuilder list = new StringBuilder("课程列表:\n");
- for (Course course : Main.getCourseList()) {
- String courseType = course.getCourseType(); // 获取课程类型
- String teacherName = course.getTeacher().getUsername(); // 获取任课教师
- String enrollmentInfo = course.isMandatory() ? "" : ", 选课人数: " + course.getCurrentEnrollment() + "/" + course.getMaxEnrollment();
-
- list.append(String.format("课程名称: %s, 类型: %s, 任课教师: %s%s\n",
- course.getName(), courseType, teacherName, enrollmentInfo));
- }
- list.append("教师列表:\n");
- for (Teacher teacher : Main.getTeacherList()) {
- list.append(teacher.getUsername()).append("\n");
- }
-
- list.append("学生列表:\n");
- for (Student student : Main.getStudentList()) {
- list.append(student.getUsername()).append("\n");
- }
-
- JOptionPane.showMessageDialog(this, list.toString());
- }
- private void addTeacher() {
- String teacherName = JOptionPane.showInputDialog("输入教师用户名:");
- String teacherPassword = "123456"; // 默认密码
- Teacher newTeacher = new Teacher(teacherName, teacherPassword);
- Main.getTeacherList().add(newTeacher);
- Main.saveData();
- JOptionPane.showMessageDialog(this, "教师添加成功");
- }
- private void addStudent() {
- String studentName = JOptionPane.showInputDialog("输入学生用户名:");
- String studentPassword = "123456"; // 默认密码
- Student newStudent = new Student(studentName, studentPassword);
- Main.getStudentList().add(newStudent);
- Main.saveData();
- JOptionPane.showMessageDialog(this, "学生添加成功");
- }
- private void deleteTeacher() {
- String teacherName = JOptionPane.showInputDialog("输入要删除的教师用户名:");
- Main.getTeacherList().removeIf(teacher -> teacher.getUsername().equals(teacherName));
- Main.saveData();
- JOptionPane.showMessageDialog(this, "教师删除成功");
- }
- private void deleteStudent() {
- String studentName = JOptionPane.showInputDialog("输入要删除的学生用户名:");
- Main.getStudentList().removeIf(student -> student.getUsername().equals(studentName));
- Main.saveData();
- JOptionPane.showMessageDialog(this, "学生删除成功");
- }
- }
复制代码 Course.java
- package swing;
- import java.io.Serializable;
- import java.util.ArrayList;
- import java.util.List;
- public class Course implements Serializable {
- private static final long serialVersionUID = 1L;
- private String name;
- private boolean isMandatory; // true表示必修课
- protected int maxEnrollment; // 最大选课人数,选修课时有效
- private List<Student> enrolledStudents;
- private Teacher teacher;
- public Course(String name, boolean isMandatory, Teacher teacher) {
- this.name = name;
- this.isMandatory = isMandatory;
- this.enrolledStudents = new ArrayList<>();
- this.teacher = teacher;
- this.maxEnrollment = isMandatory ? Integer.MAX_VALUE : 30; // 选修课默认最大人数
- }
- public String getName() {
- return name;
- }
- public boolean isMandatory() {
- return isMandatory;
- }
- public int getCurrentEnrollment() {
- return enrolledStudents.size();
- }
- public List<Student> getEnrolledStudents() {
- return enrolledStudents;
- }
- public Teacher getTeacher() {
- return teacher;
- }
- public void enrollStudent(Student student) {
- if (isMandatory || enrolledStudents.size() < maxEnrollment) {
- enrolledStudents.add(student);
- }
- }
-
-
- public String getCourseType() {
- return isMandatory ? "必修课" : "选修课";
- }
- public int getMaxEnrollment() {
- return maxEnrollment;
- }
- }
复制代码 LoginFrame.java
- package swing;
- import javax.swing.*;
- import java.awt.*;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- public class LoginFrame extends JFrame {
- private static final long serialVersionUID = 1L; // 添加serialVersionUID
- private JTextField usernameField;
- private JPasswordField passwordField;
- private JButton togglePasswordButton;
- public LoginFrame() {
- setTitle("登录");
- setSize(300, 150);
- setLayout(new GridLayout(3, 2));
- add(new JLabel("用户名:"));
- usernameField = new JTextField();
- add(usernameField);
- add(new JLabel("密码:"));
- passwordField = new JPasswordField();
- add(passwordField);
-
- togglePasswordButton = new JButton("显示密码");
- add(togglePasswordButton);
- JButton loginButton = new JButton("登录");
- add(loginButton);
- loginButton.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- login();
- }
- });
-
- // Add action listener for the button
- togglePasswordButton.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- togglePasswordVisibility();
- }
- });
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- setVisible(true);
- }
-
- private void togglePasswordVisibility() {
- // 检查密码框当前的回显字符模式
- if (passwordField.getEchoChar() == '\u0000') { // '\u0000' 表示没有字符被回显(密码可见)
- passwordField.setEchoChar('*'); // 重置回显字符为 '*',隐藏密码
- togglePasswordButton.setText("显示密码");
- } else {
- passwordField.setEchoChar((char) 0); // 设置回显字符为 0,使密码明文显示
- togglePasswordButton.setText("隐藏密码");
- }
- }
- private void login() {
- String username = usernameField.getText();
- String password = new String(passwordField.getPassword());
- if (username.equals("admin") && password.equals("admin123")) {
- new AdminMenu();
- dispose();
- } else {
- // Check other user types
- for (Teacher teacher : Main.getTeacherList()) {
- if (teacher.getUsername().equals(username) && teacher.getPassword().equals(password)) {
- new TeacherMenu(teacher);
- dispose();
- return;
- }
- }
- for (Student student : Main.getStudentList()) {
- if (student.getUsername().equals(username) && student.getPassword().equals(password)) {
- new StudentMenu(student);
- dispose();
- return;
- }
- }
- JOptionPane.showMessageDialog(this, "用户名或密码错误");
- }
- }
- }
复制代码 Student.java
- package swing;
- import java.io.Serializable;
- import java.util.ArrayList;
- import java.util.List;
- public class Student implements Serializable {
- private String username;
- private String password;
- private List<Course> selectedCourses; // 存储所选课程的列表
- public Student(String username, String password) {
- this.username = username;
- this.password = password;
- this.selectedCourses = new ArrayList<>(); // 初始化课程列表
- }
- // Getter方法
- public String getUsername() {
- return username;
- }
- public String getPassword() {
- return password;
- }
- public List<Course> getSelectedCourses() {
- return selectedCourses;
- }
- public void addCourse(Course course) {
- if (!selectedCourses.contains(course)) {
- selectedCourses.add(course);
- }
- }
- // 修改密码的方法
- public void changePassword(String newPassword) {
- this.password = newPassword;
- }
- // 重写 toString() 方法
- @Override
- public String toString() {
- return username; // 返回学生的用户名
- }
- }
复制代码 StudentMenu.java
- package swing;
- import javax.swing.*;
- import java.awt.*;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- public class StudentMenu extends JFrame {
- private static final long serialVersionUID = 1L;
- private Student student;
- public StudentMenu(Student student) {
- this.student = student;
- setTitle("学生菜单");
- setSize(400, 300);
- setLayout(new GridLayout(4, 1));
- JButton changePasswordButton = new JButton("修改密码");
- JButton viewCoursesButton = new JButton("查看所上课程");
- JButton enrollButton = new JButton("选修课程");
- add(changePasswordButton);
- add(viewCoursesButton);
- add(enrollButton);
- changePasswordButton.addActionListener(e -> changePassword());
- viewCoursesButton.addActionListener(e -> viewCourses());
- enrollButton.addActionListener(e -> enrollCourse());
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- setVisible(true);
- }
- private void changePassword() {
- String newPassword = JOptionPane.showInputDialog("输入新密码:");
- student.changePassword(newPassword);
- Main.saveData();
- JOptionPane.showMessageDialog(this, "密码已修改");
- }
- private void viewCourses() {
- StringBuilder courseList = new StringBuilder("所上课程:\n");
- // 添加必修课程
- for (Course course : Main.getCourseList()) {
- if (course.isMandatory()) {
- courseList.append(course.getName()).append(" - 任课教师: ").append(course.getTeacher().getUsername()).append("\n");
- }
- }
- // 添加选修课程
- for (Course course : student.getSelectedCourses()) {
- courseList.append(course.getName()).append(" - 任课教师: ").append(course.getTeacher().getUsername()).append("\n");
- }
- JOptionPane.showMessageDialog(this, courseList.toString());
- }
- private void enrollCourse() {
- String courseName = JOptionPane.showInputDialog("输入要选修的课程名称:");
- for (Course course : Main.getCourseList()) {
- if (course.getName().equals(courseName)) {
- // 验证选课人数
- if (course.isMandatory() || course.getCurrentEnrollment() < course.getMaxEnrollment()) {
- selectElectiveCourse(course);
- return;
- } else {
- JOptionPane.showMessageDialog(this, "课程已满");
- }
- }
- }
- JOptionPane.showMessageDialog(this, "课程不存在");
- }
- // 选修课程的方法
- private void selectElectiveCourse(Course course) {
- if (!course.isMandatory()) {
- student.addCourse(course); // 将选修课程添加到学生的课程列表中
- JOptionPane.showMessageDialog(this, "选修课程成功!");
- Main.saveData(); // 保存数据
- }
- }
- }
复制代码 Teacher.java
- package swing;
- import java.io.Serializable;
- public class Teacher implements Serializable {
- private String username;
- private String password;
- public Teacher(String username, String password) {
- this.username = username;
- this.password = password;
- }
- // Getter方法
- public String getUsername() {
- return username;
- }
- public String getPassword() {
- return password;
- }
- // 修改密码的方法
- public void changePassword(String newPassword) {
- this.password = newPassword;
- }
- // 重写 toString() 方法
- @Override
- public String toString() {
- return username; // 返回教师的用户名
- }
- }
复制代码 TeacherMenu.java
- package swing;
- import javax.swing.*;
- import java.awt.*;
- public class TeacherMenu extends JFrame {
- private static final long serialVersionUID = 1L;
- private Teacher teacher;
- public TeacherMenu(Teacher teacher) {
- this.teacher = teacher;
- setTitle("教师菜单");
- setSize(400, 300);
- setLayout(new GridLayout(5, 1)); // 增加一行
- JButton changePasswordButton = new JButton("修改密码");
- JButton viewCoursesButton = new JButton("查看所授课程");
- JButton viewStudentsButton = new JButton("查看上课学生");
- JButton viewCourseStudentsButton = new JButton("查看某门课程的学生");
- add(changePasswordButton);
- add(viewCoursesButton);
- add(viewStudentsButton);
- add(viewCourseStudentsButton);
- changePasswordButton.addActionListener(e -> changePassword());
- viewCoursesButton.addActionListener(e -> viewCourses());
- viewStudentsButton.addActionListener(e -> viewStudentsInCourses());
- viewCourseStudentsButton.addActionListener(e -> viewStudentsInSpecificCourse());
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- setVisible(true);
- }
- private void changePassword() {
- String newPassword = JOptionPane.showInputDialog("输入新密码:");
- teacher.changePassword(newPassword);
- Main.saveData();
- JOptionPane.showMessageDialog(this, "密码已修改");
- }
- private void viewCourses() {
- StringBuilder mandatoryCourses = new StringBuilder("必修课:\n");
- StringBuilder electiveCourses = new StringBuilder("选修课:\n");
-
- for (Course course : Main.getCourseList()) {
- if (course.isMandatory()) {
- mandatoryCourses.append(String.format("课程名称: %s, 任课教师: %s\n",
- course.getName(), course.getTeacher().getUsername()));
- } else {
- electiveCourses.append(String.format("课程名称: %s, 任课教师: %s, 选课人数: %d/%d\n",
- course.getName(), course.getTeacher().getUsername(),
- course.getCurrentEnrollment(), course.getMaxEnrollment()));
- }
- }
-
- StringBuilder courseListDisplay = new StringBuilder();
- courseListDisplay.append(mandatoryCourses).append("\n").append(electiveCourses);
-
- JOptionPane.showMessageDialog(this, courseListDisplay.toString());
- }
- private void viewStudentsInCourses() {
- StringBuilder studentList = new StringBuilder("上课学生名单:\n");
- boolean hasCourses = false;
-
- for (Course course : Main.getCourseList()) {
- if (course.getTeacher().equals(teacher)) {
- hasCourses = true;
- studentList.append("课程: ").append(course.getName()).append("\n");
- for (Student student : course.getEnrolledStudents()) {
- studentList.append(" - ").append(student.getUsername()).append("\n");
- }
- }
- }
-
- if (!hasCourses) {
- studentList.append("该教师没有教授任何课程。");
- }
-
- JOptionPane.showMessageDialog(this, studentList.toString());
- }
- private void viewStudentsInSpecificCourse() {
- String courseName = JOptionPane.showInputDialog("输入课程名称:");
- StringBuilder studentList = new StringBuilder("学生名单:\n");
- boolean foundCourse = false;
- for (Course course : Main.getCourseList()) {
- if (course.getName().equals(courseName) && course.getTeacher().equals(teacher)) {
- foundCourse = true;
- for (Student student : course.getEnrolledStudents()) {
- studentList.append(student.getUsername()).append("\n");
- }
- break;
- }
- }
-
- if (!foundCourse) {
- studentList.append("没有找到该课程或该课程不属于您。");
- }
-
- JOptionPane.showMessageDialog(this, studentList.toString());
- }
- }
复制代码 module-info.java
- module experiment_2 {
- requires java.desktop;
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |