GUI编程实现黑马人事管理系统

结合AI 使用 GUI编程实现一个黑马人事管理系统

第一步:创建一个模块做这个项目。itheima-employee-sys

第二步:分析项目的业务需求。

  • 提供一个登录和注册用户的界面。

  • 提供一个人事信息的管理界面:展示全部员工信息,提供一个根据名称查询某个员工信息展示,添加员工信息,删除员工信息,修改员工信息。

  • 分析项目的角色:
    ​ – 登录用户: 登录名称, 密码。
    ​ – 员工信息: ID, 姓名,性别,年龄,电话,职位,入职时间,薪水,部门信息。

  • 分析系统的界面:
    ​ – 登录界面类:创建登录界面。
    ​ – 信息管理界面类:创建管理界面。

第三步:结合AI开始开发: 通义千问

  • AI帮我们生成一个登录界面。
  • AI帮我们生成一个信息管理界面。

正式开发

1、拿到登录界面的程序。

package com.itheima.ui;

import javax.swing.*;
import java.awt.*;
// 自定义登录界面
public class LoginUI extends JFrame{
    private JTextField usernameField; // 用户名输入框
    private JPasswordField passwordField; // 密码输入框
    private JButton loginButton; // 登录按钮
    private  JButton registerButton; // 注册按钮

    public LoginUI(){
        super("登录界面");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(400, 400);
        this.setLocationRelativeTo(null); // 居中显示

        createAndShowGUI();
    }

    private  void createAndShowGUI() {
        // 创建主窗口
        // 创建面板
        JPanel panel = new JPanel();
        panel.setLayout(null);
        panel.setBackground(new Color(240, 240, 240));

        // 设置字体和颜色
        Font customFont = new Font("楷体", Font.BOLD, 18);
        Color primaryColor = new Color(66, 135, 245);
        Color secondaryColor = new Color(204, 204, 204); // 更浅的颜色用于注册按钮
        
        // 标题
        JLabel titleLabel = new JLabel("黑马程序员人事管理系统");
        titleLabel.setBounds(50, 30, 300, 30);
        titleLabel.setFont(new Font("楷体", Font.BOLD, 24));
        panel.add(titleLabel);

        // 用户名标签
        JLabel usernameLabel = new JLabel("用户名:");
        usernameLabel.setBounds(50, 100, 150, 30);
        usernameLabel.setFont(customFont);
        panel.add(usernameLabel);

        // 用户名输入框
        usernameField = new JTextField();
        usernameField.setBounds(160, 100, 190, 30);
        usernameField.setFont(customFont);
        panel.add(usernameField);

        // 密码标签
        JLabel passwordLabel = new JLabel("密   码:");
        passwordLabel.setBounds(50, 150, 150, 30);
        passwordLabel.setFont(customFont);
        panel.add(passwordLabel);

        // 密码输入框
        passwordField = new JPasswordField();
        passwordField.setBounds(160, 150, 190, 30);
        passwordField.setFont(customFont);
        panel.add(passwordField);

        // 登录按钮
        loginButton = new JButton("登   录");
        loginButton.setBounds(50, 200, 150, 30);
        loginButton.setFont(customFont);
        loginButton.setBackground(primaryColor);
        loginButton.setForeground(Color.WHITE);
        panel.add(loginButton);

        // 注册按钮
        registerButton = new JButton("注   册");
        registerButton.setBounds(200, 200, 150, 30);
        registerButton.setFont(customFont);
        registerButton.setBackground(secondaryColor);
        registerButton.setForeground(Color.BLACK);
        panel.add(registerButton);

        // 添加面板到窗口
        this.add(panel);
        this.setVisible(true);
    }
}

定义了一个APP的启动类:

public class App {
  public static void main(String[] args) {
      new LoginUI();
  }
}

2、拿到管理信息的界面
提供一个人事信息的管理界面:展示全部员工信息,提供一个根据名称查询某个员工信息展示,添加员工信息,删除员工信息,修改员工信息。

AI生成的原版代码:

public class EmployeeManagerUI {
  private JFrame frame;
  private JTable table;
  private DefaultTableModel model;
  private JTextField textFieldSearch;

  public static void main(String[] args) {
      EmployeeManagerUI window = new EmployeeManagerUI();
      window.frame.setVisible(true);
  }

public EmployeeManagerUI() {
    initialize();
}

private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 800, 600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(new BorderLayout());

    // 输入框和搜索按钮
    JPanel topPanel = new JPanel();
    topPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
    textFieldSearch = new JTextField(20);
    JButton btnSearch = new JButton("搜索");
    JButton btnAdd = new JButton("添加");
    topPanel.add(textFieldSearch);
    topPanel.add(btnSearch);
    topPanel.add(btnAdd);

    // 创建表格模型
    model = new DefaultTableModel(
            new Object[][]{},
            new String[]{"ID", "姓名", "职位", "部门"}
    ) {
        @Override
        public boolean isCellEditable(int row, int column) {
            return false; // 设置所有单元格为不可编辑
        }
    };

    table = new JTable(model);
    JScrollPane scrollPane = new JScrollPane(table);
    table.setRowHeight(30);

    // 添加数据到表格
    for (int i = 0; i < 20; i++) {
        model.addRow(new Object[]{i + 1, "员工" + (i + 1), "职位" + (i + 1), "部门" + (i + 1)});
    }

    // 右键菜单
    JPopupMenu popupMenu = new JPopupMenu();
    JMenuItem editItem = new JMenuItem("编辑");
    JMenuItem deleteItem = new JMenuItem("删除");
    popupMenu.add(editItem);
    popupMenu.add(deleteItem);
    table.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            if (e.getButton() == MouseEvent.BUTTON3) { // 明确检查是否为鼠标右键
                int row = table.rowAtPoint(e.getPoint());
                if (row >= 0) {
                    table.setRowSelectionInterval(row, row);
                    popupMenu.show(table, e.getX(), e.getY());
                }
            }
        }
    });

    // 绑定事件到菜单项
    editItem.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            int selectedRow = table.getSelectedRow();
            if (selectedRow >= 0) {
                int id = (Integer) model.getValueAt(selectedRow, 0); // 假设ID在第一列
                JOptionPane.showMessageDialog(frame, "删除 ID: " + id);
                // 这里可以添加编辑逻辑,比如打开一个新的对话框让用户修改数据
            }
        }
    });

    deleteItem.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            int selectedRow = table.getSelectedRow();
            if (selectedRow >= 0) {
                int id = (Integer) model.getValueAt(selectedRow, 0); // 假设ID在第一列
                JOptionPane.showMessageDialog(frame, "删除 ID: " + id);
                // 这里可以添加删除逻辑,比如从模型中移除该行
            }
        }
    });

    // 搜索按钮监听器
    btnSearch.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            String searchValue = textFieldSearch.getText();
            // 这里可以添加搜索逻辑
        }
    });

    // 添加按钮监听器
    btnAdd.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            // 这里可以添加添加新员工的逻辑
        }
    });

    frame.getContentPane().add(topPanel, BorderLayout.NORTH);
    frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
  }
}

改造成自定义的信息管理界面。

package com.itheima.ui;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Date;

public class EmployeeManagerUI extends JFrame{
    private JFrame frame; // 窗口
    private JTable table;  // 表格
    private DefaultTableModel model; // 表格模型: 封装表格数据的对象
    private JTextField nameTextFieldSearch; // 搜索输入框

public EmployeeManagerUI() {
    frame = this;
    initialize();
    this.setVisible(true); // 显示窗口
}

private void initialize() {
    this.setBounds(100, 100, 800, 600);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.getContentPane().setLayout(new BorderLayout());

    // 输入框和搜索按钮
    JPanel topPanel = new JPanel();
    topPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
    nameTextFieldSearch = new JTextField(20);
    JButton btnSearch = new JButton("搜索");
    JButton btnAdd = new JButton("添加");
    topPanel.add(nameTextFieldSearch);
    topPanel.add(btnSearch);
    topPanel.add(btnAdd);

    // 创建表格模型
    model = new DefaultTableModel(
            new Object[][]{},
            new String[]{"ID", "姓名", "性别", "年龄", "电话" ,"职位", "入职日期", "薪水", "部门"}
    ){
        @Override
        public boolean isCellEditable(int row, int column) {
            return false; // 设置所有单元格为不可编辑
        }
    };

    table = new JTable(model);
    JScrollPane scrollPane = new JScrollPane(table);
    table.setRowHeight(30);

    // 添加数据到表格
    for (int i = 0; i < 20; i++) {
        model.addRow(new Object[]{i + 1, "员工" + (i + 1),  "男",  21, "18667656520", "java工程师", new Date().toLocaleString(), 30000, "部门" + (i + 1)});
    }

    // 右键菜单
    JPopupMenu popupMenu = new JPopupMenu();
    JMenuItem editItem = new JMenuItem("编辑");
    JMenuItem deleteItem = new JMenuItem("删除");
    popupMenu.add(editItem);
    popupMenu.add(deleteItem);
    table.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            if (e.getButton() == MouseEvent.BUTTON3) { // 明确检查是否为鼠标右键
                int row = table.rowAtPoint(e.getPoint());
                if (row >= 0) {
                    table.setRowSelectionInterval(row, row);
                    popupMenu.show(table, e.getX(), e.getY());
                }
            }
        }
    });

    // 绑定事件到菜单项
    editItem.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            int selectedRow = table.getSelectedRow();
            if (selectedRow >= 0) {
                int id = (Integer) model.getValueAt(selectedRow, 0); // 假设ID在第一列
                JOptionPane.showMessageDialog(frame, "删除 ID: " + id);
                // 这里可以添加编辑逻辑,比如打开一个新的对话框让用户修改数据
            }
        }
    });

    deleteItem.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            int selectedRow = table.getSelectedRow();
            if (selectedRow >= 0) {
                int id = (Integer) model.getValueAt(selectedRow, 0); // 假设ID在第一列
                JOptionPane.showMessageDialog(frame, "删除 ID: " + id);
                // 这里可以添加删除逻辑,比如从模型中移除该行
            }
        }
    });

    // 搜索按钮监听器
    btnSearch.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            String searchValue = nameTextFieldSearch.getText();
            // 这里可以添加搜索逻辑
        }
    });

    // 添加按钮监听器
    btnAdd.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            // 这里可以添加添加新员工的逻辑
        }
    });

    frame.getContentPane().add(topPanel, BorderLayout.NORTH);
    frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
  }
}

3、准备系统的角色类
用户类,员工信息类。

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

// 用户信息包含用户名,密码,登录名。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String username; // 用户名 
    private String password; // 密码
    private String loginName; // 登录名
}
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

// 员工信息:"ID", "姓名", "性别", "年龄", "电话" ,"职位", "入职日期", "薪水", "部门"
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {
    private int id;
    private String name;
    private String sex;
    private int age;
    private String phone;
    private String position;
    private String entryDate;
    private double salary;
    private String department;
}  

4、开发登录功能
系统中需要存在用户信息,大家可以先开发注册,注册一些用户信息(这个交给大家自己做)

可以在系统直接准备一些用户对象,作为正确的用户信息。

准备一个集合容器,存储系统中全部的用户信息。这个集合只需要一个。

// 定义一个静态的集合,存储系统中全部的用户对象信息。
private static ArrayList<User> allUsers = new ArrayList<>();

// 初始化几个测试的用户对象信息,作为登录用。
static {
    allUsers.add(new User("超级管理员", "123456", "admin"));
    allUsers.add(new User("赵敏", "wuji520", "minmin"));
    allUsers.add(new User("周杰伦", "jaychou", "jay"));
}

开发步骤:

1、给登录按钮绑定一个点击事件监听器

2、一旦点击登录按钮,拿到输入框输入的用户名和密码

3、去集合中看是否存在这个用户对象,如果认证通过,跳转到信息管理界面。登录失败,弹出提示。

package com.itheima.ui;

import com.itheima.bean.User;

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

// 自定义登录界面
public class LoginUI extends JFrame implements ActionListener {
    private JTextField loginNameField; // 用户名输入框
    private JPasswordField passwordField; // 密码输入框
    private JButton loginButton; // 登录按钮
    private JButton registerButton; // 注册按钮
    // 定义一个静态的集合,存储系统中全部的用户对象信息。
    private static ArrayList<User> allUsers = new ArrayList<>();

    // 初始化几个测试的用户对象信息,作为登录用。
    static {
        allUsers.add(new User("超级管理员", "123456", "admin"));
        allUsers.add(new User("赵敏", "wuji520", "minmin"));
        allUsers.add(new User("周杰伦", "jaychou", "jay"));
    }

    public LoginUI(){
        super("登录界面");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(400, 400);
        this.setLocationRelativeTo(null); // 居中显示

        createAndShowGUI();
    }

    private void createAndShowGUI() {
        // 创建主窗口
        // 创建面板
        JPanel panel = new JPanel();
        panel.setLayout(null);
        panel.setBackground(new Color(240, 240, 240));

        // 设置字体和颜色
        Font customFont = new Font("楷体", Font.BOLD, 18);
        Color primaryColor = new Color(66, 135, 245);
        Color secondaryColor = new Color(204, 204, 204); // 更浅的颜色用于注册按钮
    
        // 标题
        JLabel titleLabel = new JLabel("黑马程序员人事管理系统");
        titleLabel.setBounds(50, 30, 300, 30);
        titleLabel.setFont(new Font("楷体", Font.BOLD, 24));
        panel.add(titleLabel);

        // 用户名标签
        JLabel usernameLabel = new JLabel("用户名:");
        usernameLabel.setBounds(50, 100, 150, 30);
        usernameLabel.setFont(customFont);
        panel.add(usernameLabel);

        // 用户名输入框
        loginNameField = new JTextField();
        loginNameField.setBounds(160, 100, 190, 30);
        loginNameField.setFont(customFont);
        panel.add(loginNameField);

        // 密码标签
        JLabel passwordLabel = new JLabel("密   码:");
        passwordLabel.setBounds(50, 150, 150, 30);
        passwordLabel.setFont(customFont);
        panel.add(passwordLabel);

    // 密码输入框
        passwordField = new JPasswordField();
        passwordField.setBounds(160, 150, 190, 30);
        passwordField.setFont(customFont);
        panel.add(passwordField);

        // 登录按钮
        loginButton = new JButton("登   录");
        loginButton.setBounds(50, 200, 150, 30);
        loginButton.setFont(customFont);
        loginButton.setBackground(primaryColor);
        loginButton.setForeground(Color.WHITE);
        panel.add(loginButton);
        loginButton.addActionListener(this);


        // 注册按钮
        registerButton = new JButton("注   册");
        registerButton.setBounds(200, 200, 150, 30);
        registerButton.setFont(customFont);
        registerButton.setBackground(secondaryColor);
        registerButton.setForeground(Color.BLACK);
        panel.add(registerButton);
        registerButton.addActionListener(this);

        // 添加面板到窗口
        this.add(panel);
        this.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // 这里可能是登录按钮点击过来的,也可能是注册按钮点击过来的。
        // 判断到底是登录还是注册按钮点击的。
        JButton btn = (JButton) e.getSource();
        if (btn == loginButton) {
             // 独立功能独立成方法;
             login();
        }else {
            System.out.println("注册过来的");
        }
    }

    private void login() {
        // 1、获取用户输入的用户名和密码
        String loginName = loginNameField.getText();
        String password = new String(passwordField.getPassword());
        // 2、遍历集合,判断用户输入的用户名和密码是否和集合中的对象匹配。 匹配成功,则登录成功。
        // 3、根据登录名称去查询用户对象返回。查询到用户对象,说明登录名称正确了。
    User user = getUserByLoginName(loginName);
    if (user != null) {
            // 4、判断密码是否正确。
            if (user.getPassword().equals(password)) {
                // 登录成功
                System.out.println("登录成功!");
                // 跳转到员工管理界面
                new EmployeeManagerUI();
                this.dispose(); // 关闭当前登录界面
            }else {
                // 密码错误
                JOptionPane.showMessageDialog(this, "密码错误!");
            }
        }else {
            JOptionPane.showMessageDialog(this, "登录名称不存在!");
        }
    }

    // 根据登录名称去查询用户对象返回。查询到用户对象,说明登录名称正确了。 使用for循环根据索引遍历、
    private User getUserByLoginName(String loginName) {
        for (int i = 0; i < allUsers.size(); i++) {
            User user = allUsers.get(i);
            if (user.getLoginName().equals(loginName)) {
                return user;
            }
        }    
        return null; // 没有查询到用户对象,说明登录名称不正确。
    }
}

5、完成信息管理界面的功能开发(核心功能)
1、登录成功后,把登录成功的用户名传给信息管理界面。

2、添加员工信息的功能。

​ – 准备一个静态的集合,用于存储系统中全部的员工信息。

​ – 给添加按钮绑定点击事件。

// 添加按钮监听器
btnAdd.addActionListener(e -> {
    // 弹出一个添加员工信息的界面出来。
    new AddEmployeeUI();
});

​ – 点击添加按钮后,弹出一个添加员工信息的输入框。

package com.itheima.ui;

import javax.swing.*;
import java.awt.*;
import java.text.SimpleDateFormat;

public class AddEmployeeUI extends JFrame {
    private JTextField txtId, txtName, txtSex, txtAge, txtPhone, txtPosition, txtSalary, txtDepartment;
    private JFormattedTextField txtHireDate;
    private JButton btnSave, btnCancel;

    public AddEmployeeUI() {
        super("添加员工信息");
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(5, 5, 5, 5);

        Font labelFont = new Font("楷体", Font.PLAIN, 14);

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.anchor = GridBagConstraints.EAST;
        JLabel idLabel = new JLabel("ID:");
        idLabel.setFont(labelFont);
        add(idLabel, gbc);

        gbc.gridx = 1;
        gbc.anchor = GridBagConstraints.WEST;
        txtId = new JTextField(10);
        add(txtId, gbc);

        gbc.gridx = 0;
        gbc.gridy = 1;
        JLabel nameLabel = new JLabel("姓名:");
        nameLabel.setFont(labelFont);
        add(nameLabel, gbc);

        gbc.gridx = 1;
        txtName = new JTextField(10);
        add(txtName, gbc);

        gbc.gridx = 0;
        gbc.gridy = 2;
        JLabel sexLabel = new JLabel("性别:");
        sexLabel.setFont(labelFont);
        add(sexLabel, gbc);

        gbc.gridx = 1;
        txtSex = new JTextField(10);
        add(txtSex, gbc);

        gbc.gridx = 0;
        gbc.gridy = 3;
        JLabel ageLabel = new JLabel("年龄:");
        ageLabel.setFont(labelFont);
        add(ageLabel, gbc);

        gbc.gridx = 1;
        txtAge = new JTextField(10);
        add(txtAge, gbc);

        gbc.gridx = 0;
        gbc.gridy = 4;
        JLabel phoneLabel = new JLabel("电话:");
        phoneLabel.setFont(labelFont);
        add(phoneLabel, gbc);

        gbc.gridx = 1;
        txtPhone = new JTextField(10);
        add(txtPhone, gbc);

        gbc.gridx = 0;
        gbc.gridy = 5;
        JLabel positionLabel = new JLabel("职位:");
        positionLabel.setFont(labelFont);
        add(positionLabel, gbc);

        gbc.gridx = 1;
        txtPosition = new JTextField(10);
        add(txtPosition, gbc);

        gbc.gridx = 0;
        gbc.gridy = 6;
        JLabel hireDateLabel = new JLabel("入职日期:");
        hireDateLabel.setFont(labelFont);
        add(hireDateLabel, gbc);

        gbc.gridx = 1;
        txtHireDate = new JFormattedTextField(new SimpleDateFormat("yyyy-MM-dd"));
        add(txtHireDate, gbc);

        gbc.gridx = 0;
        gbc.gridy = 7;
        JLabel salaryLabel = new JLabel("薪水:");
        salaryLabel.setFont(labelFont);
        add(salaryLabel, gbc);

        gbc.gridx = 1;
        txtSalary = new JTextField(10);
        add(txtSalary, gbc);

        gbc.gridx = 0;
        gbc.gridy = 8;
        JLabel departmentLabel = new JLabel("部门:");
        departmentLabel.setFont(labelFont);
        add(departmentLabel, gbc);

        gbc.gridx = 1;
        txtDepartment = new JTextField(10);
        add(txtDepartment, gbc);

        gbc.gridx = 0;
        gbc.gridy = 9;
        gbc.gridwidth = 2;
        gbc.anchor = GridBagConstraints.CENTER;
        gbc.fill = GridBagConstraints.NONE;
        btnSave = new JButton("添加");
        btnCancel = new JButton("取消");
        btnSave.setPreferredSize(new Dimension(100, 30));
        btnCancel.setPreferredSize(new Dimension(100, 30));
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(btnSave);
        buttonPanel.add(btnCancel);
        add(buttonPanel, gbc);

        pack();
        setSize(300, 400);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setVisible(true);
    }
}

​ – 把员工信息封装成一个员工对象,存入到系统集合中去,然后刷新表格,展示最新添加的数据。

6、删除某行数据的功能

第一步:拿到当前右键要删除的这一行数据的id值。 1 2

第二步:用id去集合中删除这个员工对象,把数据抹掉。

第三步:从界面上抹掉这一行数据。刷新。

posted @ 2025-09-07 23:50  山谷秋意  阅读(8)  评论(0)    收藏  举报