要求

为你的商城购物车系统、学生管理系统添加GUI(图形用户界面)。也可自己选择编写一些实用的GUI小程序。

如果完成的好,答辩通过。可以有1次特别加分

请在留言提交博客链接。

要求:

1.建议数据展示使用JTable或更好的展示方式。

2.尽量使用MVC模式。或者能在报告中说明,你如何使用了MVC模式。

3.系统的业务逻辑代码应既可用于控制台界面、也可用于图形用户界面。需配验证运行界面截图。

4.提交后,需联系助教或者老师演示运行才能加分。

5.对AI生成的代码,要能看懂大部分,并能进行局部修改。

参考文章:

使用AI帮你写程序:结构化提示词

提示词

根据要求,我所撰写的提示词如下:

同时,把我已有的功能基本完善的学生管理系统的几个java文件上传。

需要上传的 Java 文件有:
1. 实体类文件:Student.java(包含学生的属性,如学号、姓名、专业等)。
2. 数据访问层的接口文件 StudentDAO.java 和各实现类文件 ListStudentDAO.java、TextFileStudentDAO.java、ExcelStudentDAO.java 。
3. 服务层文件 StudentService.java 。
4.控制台版本的主程序 Main.java 最好也上传,这样可利于大模型确认业务逻辑的完整性。

代码展示

MainFrame.java(主界面)

package gui;

import dao.StudentDAO;
import dao.impl.ExcelStudentDAO;
import dao.impl.ListStudentDAO;
import dao.impl.TextFileStudentDAO;
import entity.Student;
import service.StudentService;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

public class MainFrame extends JFrame {
    private StudentService service;
    private DefaultTableModel tableModel;
    private JTable studentTable;
    private JComboBox<String> storageTypeCombo;

    // 初始化界面
    public MainFrame() {
        setTitle("学生信息管理系统");
        setSize(800, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null); // 居中显示
        
        // 初始化数据访问层
        initDAO();
        
        // 创建界面组件
        createComponents();
        
        // 加载学生数据
        refreshStudentTable();
    }

    // 初始化数据访问对象
    private void initDAO() {
        // 默认使用List存储
        StudentDAO dao = new ListStudentDAO();
        service = new StudentService(dao);
    }

    // 创建界面组件
    private void createComponents() {
        // 主面板使用边界布局
        JPanel mainPanel = new JPanel(new BorderLayout());
        
        // 顶部面板:存储类型选择和操作按钮
        JPanel topPanel = createTopPanel();
        mainPanel.add(topPanel, BorderLayout.NORTH);
        
        // 中间面板:学生表格
        JPanel centerPanel = createCenterPanel();
        mainPanel.add(centerPanel, BorderLayout.CENTER);
        
        // 底部面板:状态信息
        JPanel bottomPanel = new JPanel();
        bottomPanel.add(new JLabel("状态:就绪"));
        mainPanel.add(bottomPanel, BorderLayout.SOUTH);
        
        add(mainPanel);
    }

    // 创建顶部面板
    private JPanel createTopPanel() {
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        
        // 存储类型选择
        panel.add(new JLabel("存储类型:"));
        storageTypeCombo = new JComboBox<>(new String[]{"List存储", "文本文件存储", "Excel存储"});
        storageTypeCombo.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                changeStorageType();
            }
        });
        panel.add(storageTypeCombo);
        
        // 操作按钮
        JButton addBtn = new JButton("添加学生");
        addBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                openAddStudentDialog();
            }
        });
        
        JButton deleteBtn = new JButton("删除学生");
        deleteBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                deleteSelectedStudent();
            }
        });
        
        JButton searchBtn = new JButton("搜索学生");
        searchBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                openSearchDialog();
            }
        });
        
        panel.add(addBtn);
        panel.add(deleteBtn);
        panel.add(searchBtn);
        
        return panel;
    }

    // 创建中间表格面板
    private JPanel createCenterPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        
        // 表格列名
        String[] columnNames = {"学号", "姓名", "专业", "GPA", "年龄", "性别"};
        tableModel = new DefaultTableModel(columnNames, 0);
        studentTable = new JTable(tableModel);
        
        // 添加滚动面板
        JScrollPane scrollPane = new JScrollPane(studentTable);
        panel.add(scrollPane, BorderLayout.CENTER);
        
        return panel;
    }

    // 切换存储类型
    private void changeStorageType() {
        int selected = storageTypeCombo.getSelectedIndex();
        StudentDAO dao = null;
        
        switch (selected) {
            case 0:
                dao = new ListStudentDAO();
                break;
            case 1:
                dao = new TextFileStudentDAO();
                break;
            case 2:
                dao = new ExcelStudentDAO();
                break;
        }
        
        if (dao != null) {
            service = new StudentService(dao);
            refreshStudentTable();
            JOptionPane.showMessageDialog(this, "已切换到" + storageTypeCombo.getSelectedItem());
        }
    }

    // 刷新学生表格
    public void refreshStudentTable() {
        // 清空表格
        tableModel.setRowCount(0);
        
        // 重新加载数据
        List<Student> students = service.getStudents();
        for (Student student : students) {
            Object[] rowData = {
                student.getId(),
                student.getName(),
                student.getMajor(),
                student.getGpa(),
                student.getAge(),
                student.getGender()
            };
            tableModel.addRow(rowData);
        }
    }

    // 打开添加学生对话框
    private void openAddStudentDialog() {
        AddStudentDialog dialog = new AddStudentDialog(this, service);
        dialog.setVisible(true);
    }

    // 删除选中的学生
    private void deleteSelectedStudent() {
        int selectedRow = studentTable.getSelectedRow();
        if (selectedRow == -1) {
            JOptionPane.showMessageDialog(this, "请先选择要删除的学生");
            return;
        }
        
        String id = (String) tableModel.getValueAt(selectedRow, 0);
        int confirm = JOptionPane.showConfirmDialog(this, "确定要删除学号为" + id + "的学生吗?",
                "确认删除", JOptionPane.YES_NO_OPTION);
        
        if (confirm == JOptionPane.YES_OPTION) {
            boolean success = service.removeStudent(id);
            if (success) {
                JOptionPane.showMessageDialog(this, "删除成功");
                refreshStudentTable();
            } else {
                JOptionPane.showMessageDialog(this, "删除失败");
            }
        }
    }

    // 打开搜索对话框
    private void openSearchDialog() {
        SearchDialog dialog = new SearchDialog(this, service);
        dialog.setVisible(true);
    }

    // 主方法,启动程序
    public static void main(String[] args) {
        // 在事件调度线程中运行GUI
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MainFrame().setVisible(true);
            }
        });
    }
}

AddStudentDialog.java(添加学生对话框)

package gui;

import entity.Student;
import service.StudentService;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class AddStudentDialog extends JDialog {
    private StudentService service;
    private MainFrame parentFrame;
    
    // 输入字段
    private JTextField idField;
    private JTextField nameField;
    private JTextField majorField;
    private JTextField gpaField;
    private JTextField ageField;
    private JTextField genderField;

    public AddStudentDialog(MainFrame parent, StudentService service) {
        super(parent, "添加学生", true);
        this.parentFrame = parent;
        this.service = service;
        setSize(300, 300);
        setLocationRelativeTo(parent);
        initComponents();
    }

    private void initComponents() {
        JPanel panel = new JPanel(new GridLayout(7, 2, 10, 10));
        panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        
        // 添加输入字段
        panel.add(new JLabel("学号:"));
        idField = new JTextField();
        panel.add(idField);
        
        panel.add(new JLabel("姓名:"));
        nameField = new JTextField();
        panel.add(nameField);
        
        panel.add(new JLabel("专业:"));
        majorField = new JTextField();
        panel.add(majorField);
        
        panel.add(new JLabel("GPA:"));
        gpaField = new JTextField();
        panel.add(gpaField);
        
        panel.add(new JLabel("年龄:"));
        ageField = new JTextField();
        panel.add(ageField);
        
        panel.add(new JLabel("性别:"));
        genderField = new JTextField();
        panel.add(genderField);
        
        // 按钮
        JButton confirmBtn = new JButton("确认");
        confirmBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                saveStudent();
            }
        });
        
        JButton cancelBtn = new JButton("取消");
        cancelBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
        
        panel.add(confirmBtn);
        panel.add(cancelBtn);
        
        add(panel);
    }

    // 保存学生信息
    private void saveStudent() {
        try {
            // 获取输入值
            String id = idField.getText().trim();
            String name = nameField.getText().trim();
            String major = majorField.getText().trim();
            double gpa = Double.parseDouble(gpaField.getText().trim());
            int age = Integer.parseInt(ageField.getText().trim());
            String gender = genderField.getText().trim();
            
            // 简单验证
            if (id.isEmpty() || name.isEmpty() || major.isEmpty()) {
                JOptionPane.showMessageDialog(this, "学号、姓名和专业不能为空");
                return;
            }
            
            // 创建学生对象并保存
            Student student = new Student(id, name, major, gpa, age, gender);
            service.addStudent(student);
            
            JOptionPane.showMessageDialog(this, "添加成功");
            parentFrame.refreshStudentTable(); // 刷新主界面表格
            dispose(); // 关闭对话框
            
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "GPA或年龄格式错误");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "添加失败: " + e.getMessage());
        }
    }
}

SearchDialog.java(搜索对话框)

package gui;

import entity.Student;
import service.StudentService;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

public class SearchDialog extends JDialog {
    private StudentService service;
    private JComboBox<String> searchTypeCombo;
    private JTextField searchField;
    private DefaultTableModel resultTableModel;

    public SearchDialog(MainFrame parent, StudentService service) {
        super(parent, "搜索学生", true);
        this.service = service;
        setSize(600, 400);
        setLocationRelativeTo(parent);
        initComponents();
    }

    private void initComponents() {
        JPanel mainPanel = new JPanel(new BorderLayout());
        
        // 顶部搜索面板
        JPanel searchPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        
        searchPanel.add(new JLabel("搜索类型:"));
        searchTypeCombo = new JComboBox<>(new String[]{"按姓名", "按专业", "按GPA"});
        searchPanel.add(searchTypeCombo);
        
        searchField = new JTextField(20);
        searchPanel.add(searchField);
        
        JButton searchBtn = new JButton("搜索");
        searchBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                performSearch();
            }
        });
        searchPanel.add(searchBtn);
        
        mainPanel.add(searchPanel, BorderLayout.NORTH);
        
        // 中间结果表格
        String[] columnNames = {"学号", "姓名", "专业", "GPA", "年龄", "性别"};
        resultTableModel = new DefaultTableModel(columnNames, 0);
        JTable resultTable = new JTable(resultTableModel);
        JScrollPane scrollPane = new JScrollPane(resultTable);
        mainPanel.add(scrollPane, BorderLayout.CENTER);
        
        add(mainPanel);
    }

    // 执行搜索
    private void performSearch() {
        // 清空之前的结果
        resultTableModel.setRowCount(0);
        
        String searchText = searchField.getText().trim();
        if (searchText.isEmpty()) {
            JOptionPane.showMessageDialog(this, "请输入搜索内容");
            return;
        }
        
        List<Student> results = null;
        int searchType = searchTypeCombo.getSelectedIndex();
        
        try {
            switch (searchType) {
                case 0: // 按姓名
                    results = service.searchByName(searchText);
                    break;
                case 1: // 按专业
                    results = service.searchByMajor(searchText);
                    break;
                case 2: // 按GPA
                    double gpa = Double.parseDouble(searchText);
                    results = service.searchByGpa(gpa);
                    break;
            }
            
            // 显示结果
            if (results == null || results.isEmpty()) {
                JOptionPane.showMessageDialog(this, "没有找到匹配的学生");
                return;
            }
            
            for (Student student : results) {
                Object[] rowData = {
                    student.getId(),
                    student.getName(),
                    student.getMajor(),
                    student.getGpa(),
                    student.getAge(),
                    student.getGender()
                };
                resultTableModel.addRow(rowData);
            }
            
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "GPA格式错误");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "搜索失败: " + e.getMessage());
        }
    }
}

代码运行结果

1、运行 MainFrame 类的 main 方法启动程序,通过下拉框切换存储方式。

2、点击 "添加学生" 按钮打开添加对话框,依次输入学生信息。

3、选择表格中的学生行,点击 "删除学生" 可删除选中学生。

删除完也是立马就更新了学生名单。

4、点击 "搜索学生" 按钮打开搜索对话框,可按姓名、专业或 GPA 搜索。

按姓名搜索:

按专业搜索:

按 GPA 搜索:

总结

1、界面设计

1)使用的 Swing 基本组件有 JFrame, JPanel, JTable 等。
2)采用边界布局 (BorderLayout) 和网格布局 (GridLayout) 组织界面。
3)界面分为主窗口、添加对话框和搜索对话框三个主要部分。

2、代码组织

1)每个界面元素都有专门的方法创建,提高可读性。
2)业务逻辑通过调用 StudentService 实现,与界面代码完全分离。
3)使用面向对象的设计,将不同功能封装到不同类中。

3、功能实现

1)保留了原有的三种存储方式(List、文本文件、Excel)。
2)实现了添加、删除、查询、显示所有学生的功能。
3)提供了友好的用户提示和错误处理。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐