uacs2024

导航

Java GUI人事管理系统

com_itheima

----bean

--------Employee.java

--------User.java

----ui

--------EmployeeManagementSystem.java

--------ModernLoginForm.java

----App.java

 

Employee.java

package com_itheima.bean;

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

//"ID", "姓名", "部门", "职位", "薪资", "入职日期"
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {
    private int id;
    private String name;
    private String department;
    private String position;
    private double salary;
    private String hireDate;
}

User.java

package com_itheima.bean;

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

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String userName;//用户名
    private String password;//密码
    private String loginName;//登录名
}

ModernLoginForm.java

package com_itheima.ui;// 导入Swing界面组件库

import com_itheima.bean.User;

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

/**
 * ModernLoginForm类 - 创建一个现代风格的登录表单界面
 * 继承自JFrame,作为应用程序的主窗口
 */
public class ModernLoginForm extends JFrame implements ActionListener{
    // 声明成员变量
    private JPanel usernamePanel;
    private JPanel passwordPanel;
    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 ModernLoginForm() {
        // 初始化成员变量
        usernamePanel = createInputPanel("用户名", "请输入用户名");
        passwordPanel = createInputPanel("密码", "请输入密码");

        // 设置窗口标题为"系统登录"
        setTitle("系统登录");
        // 设置点击关闭按钮时的默认行为为退出程序
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 设置窗口大小为400x500像素
        setSize(400, 500);
        // 设置窗口在屏幕中居中显示
        setLocationRelativeTo(null);
        // 去掉默认的窗口边框,以便实现自定义外观
        setUndecorated(true);
        // 设置窗口形状为圆角矩形,半径为20像素
        setShape(new RoundRectangle2D.Double(0, 0, getWidth(), getHeight(), 20, 20));

        // 创建主面板 - 使用匿名内部类重写paintComponent方法来实现渐变背景
        JPanel mainPanel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                // 调用父类的paintComponent方法完成基本绘制
                super.paintComponent(g);
                // 将Graphics对象转换为Graphics2D以使用更高级的绘图功能
                Graphics2D g2d = (Graphics2D) g;
                // 设置抗锯齿渲染提示,使绘制的图形边缘更平滑
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                // 创建渐变画笔,从顶部的深蓝色(70,130,180)到底部的暗蓝色(25,25,112)
                GradientPaint gp = new GradientPaint(0, 0, new Color(70, 130, 180), 0, getHeight(), new Color(25, 25, 112));
                // 设置绘图工具使用渐变画笔
                g2d.setPaint(gp);
                // 填充圆角矩形作为面板背景,半径为20像素
                g2d.fillRoundRect(0, 0, getWidth(), getHeight(), 20, 20);
            }
        };
        // 设置主面板使用边界布局管理器
        mainPanel.setLayout(new BorderLayout());
        // 设置主面板四周有30像素的内边距
        mainPanel.setBorder(BorderFactory.createEmptyBorder(30, 30, 30, 30));

        // 创建标题标签,文本居中对齐
        JLabel titleLabel = new JLabel("欢迎登录", SwingConstants.CENTER);
        // 设置标题字体为微软雅黑,粗体,28号
        titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 28));
        // 设置标题文字颜色为白色
        titleLabel.setForeground(Color.WHITE);
        // 设置标题下方有30像素的内边距
        titleLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 30, 0));

        // 创建表单面板用于放置输入控件
        JPanel formPanel = new JPanel();
        // 设置表单面板为透明,不绘制背景
        formPanel.setOpaque(false);
        // 设置表单面板使用网格布局,4行1列,组件间垂直间距为15像素
        formPanel.setLayout(new GridLayout(4, 1, 0, 15));

        // 创建用户名输入面板,调用自定义方法
        usernamePanel = createInputPanel("用户名", "请输入用户名");
        // 创建密码输入面板,调用自定义方法
        passwordPanel = createInputPanel("密码", "请输入密码");
        // 设置密码输入框的背景为半透明白色
        passwordPanel.getComponent(1).setBackground(new Color(255, 255, 255, 200));
        // 设置密码输入框的显示字符为黑点
        ((JPasswordField) ((JPanel) passwordPanel.getComponent(1)).getComponent(0)).setEchoChar('•');

        // 创建"记住登录状态"复选框
        JCheckBox rememberCheck = new JCheckBox("记住登录状态");
        // 设置复选框为透明,不绘制背景
        rememberCheck.setOpaque(false);
        // 设置复选框文字颜色为白色
        rememberCheck.setForeground(Color.WHITE);
        // 设置复选框字体为微软雅黑,普通,12号
        rememberCheck.setFont(new Font("微软雅黑", Font.PLAIN, 12));

        // 创建按钮面板,使用网格布局,1行2列,组件间水平间距为10像素
        JPanel buttonPanel = new JPanel(new GridLayout(1, 2, 10, 0));
        // 设置按钮面板为透明,不绘制背景
        buttonPanel.setOpaque(false);

        // 创建登录按钮
        JButton loginButton = new JButton("登 录");
        // 调用自定义方法设置按钮样式,正常颜色为森林绿,悬停颜色为绿色
        styleButton(loginButton, new Color(46, 139, 87), new Color(34, 139, 34));
        loginButton.addActionListener(this);

        // 创建注册按钮
        JButton registerButton = new JButton("注 册");
        // 调用自定义方法设置按钮样式,正常颜色为钢蓝色,悬停颜色为宝蓝色
        styleButton(registerButton, new Color(70, 130, 180), new Color(65, 105, 225));
        registerButton.addActionListener(this);

        // 将登录按钮添加到按钮面板
        buttonPanel.add(loginButton);
        // 将注册按钮添加到按钮面板
        buttonPanel.add(registerButton);

        // 将用户名面板添加到表单面板
        formPanel.add(usernamePanel);
        // 将密码面板添加到表单面板
        formPanel.add(passwordPanel);
        // 将记住登录复选框添加到表单面板
        formPanel.add(rememberCheck);
        // 将按钮面板添加到表单面板
        formPanel.add(buttonPanel);

        // 创建关闭按钮,显示为"×"符号
        JButton closeButton = new JButton("×");
        // 设置关闭按钮字体为Arial,粗体,18号
        closeButton.setFont(new Font("Arial", Font.BOLD, 18));
        // 设置关闭按钮文字颜色为白色
        closeButton.setForeground(Color.WHITE);
        // 设置关闭按钮不填充内容区域,使其透明
        closeButton.setContentAreaFilled(false);
        // 设置关闭按钮的边框为空,只有内边距
        closeButton.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
        // 为关闭按钮添加点击事件,点击时退出程序
        closeButton.addActionListener(e -> System.exit(0));

        // 创建顶部面板,使用流布局,组件右对齐
        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        // 设置顶部面板为透明,不绘制背景
        topPanel.setOpaque(false);
        // 将关闭按钮添加到顶部面板
        topPanel.add(closeButton);

        // 将顶部面板添加到主面板的北部(顶部)
        mainPanel.add(topPanel, BorderLayout.NORTH);
        // 将标题标签添加到主面板的中部
        mainPanel.add(titleLabel, BorderLayout.CENTER);
        // 将表单面板添加到主面板的南部(底部)
        mainPanel.add(formPanel, BorderLayout.SOUTH);

        // 将主面板添加到窗口
        add(mainPanel);

        // 调用自定义方法为窗口添加阴影效果
        setShadow(this);

        // 为注册按钮添加点击事件,点击时显示注册表单
        registerButton.addActionListener(e -> {
            showRegisterForm();
        });

        // 为登录按钮添加点击事件
        loginButton.addActionListener(e -> {
            // 获取用户名输入框中的文本
            String username = ((JTextField) ((JPanel) usernamePanel.getComponent(1)).getComponent(0)).getText();
            // 获取密码输入框中的密码字符数组
            char[] password = ((JPasswordField) ((JPanel) passwordPanel.getComponent(1)).getComponent(0)).getPassword();

            // 简单验证:检查用户名和密码是否为空
            if (username.isEmpty() || password.length == 0) {
                // 如果为空,显示警告消息对话框
                JOptionPane.showMessageDialog(this, "用户名和密码不能为空", "提示", JOptionPane.WARNING_MESSAGE);
            } else {
                // 如果不为空,显示登录成功的信息对话框
                //JOptionPane.showMessageDialog(this, "登录成功", "提示", JOptionPane.INFORMATION_MESSAGE);
            }
        });
    }

    /**
     * 显示注册表单的方法
     * 创建一个新窗口用于用户注册
     */
    private void showRegisterForm() {
        // 创建注册窗口,设置标题为"用户注册"
        JFrame registerFrame = new JFrame("用户注册");
        // 设置窗口大小为400x550像素
        registerFrame.setSize(400, 550);
        // 设置窗口相对于当前窗口居中
        registerFrame.setLocationRelativeTo(this);
        // 去掉默认的窗口边框,以便实现自定义外观
        registerFrame.setUndecorated(true);
        // 设置窗口形状为圆角矩形,半径为20像素
        registerFrame.setShape(new RoundRectangle2D.Double(0, 0, 400, 550, 20, 20));

        // 创建主面板 - 使用匿名内部类重写paintComponent方法来实现渐变背景
        JPanel mainPanel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                // 调用父类的paintComponent方法完成基本绘制
                super.paintComponent(g);
                // 将Graphics对象转换为Graphics2D以使用更高级的绘图功能
                Graphics2D g2d = (Graphics2D) g;
                // 设置抗锯齿渲染提示,使绘制的图形边缘更平滑
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                // 创建渐变画笔,从顶部的深蓝色(70,130,180)到底部的暗蓝色(25,25,112)
                GradientPaint gp = new GradientPaint(0, 0, new Color(70, 130, 180), 0, getHeight(), new Color(25, 25, 112));
                // 设置绘图工具使用渐变画笔
                g2d.setPaint(gp);
                // 填充圆角矩形作为面板背景,半径为20像素
                g2d.fillRoundRect(0, 0, getWidth(), getHeight(), 20, 20);
            }
        };
        // 设置主面板使用边界布局管理器
        mainPanel.setLayout(new BorderLayout());
        // 设置主面板四周有30像素的内边距
        mainPanel.setBorder(BorderFactory.createEmptyBorder(30, 30, 30, 30));

        // 创建标题标签,文本居中对齐
        JLabel titleLabel = new JLabel("用户注册", SwingConstants.CENTER);
        // 设置标题字体为微软雅黑,粗体,28号
        titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 28));
        // 设置标题文字颜色为白色
        titleLabel.setForeground(Color.WHITE);
        // 设置标题下方有30像素的内边距
        titleLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 30, 0));

        // 创建表单面板用于放置输入控件
        JPanel formPanel = new JPanel();
        // 设置表单面板为透明,不绘制背景
        formPanel.setOpaque(false);
        // 设置表单面板使用网格布局,6行1列,组件间垂直间距为15像素
        formPanel.setLayout(new GridLayout(6, 1, 0, 15));

        // 创建用户名输入面板,调用自定义方法
        JPanel usernamePanel = createInputPanel("用户名", "请输入用户名");
        // 创建密码输入面板,调用自定义方法
        JPanel passwordPanel = createInputPanel("密码", "请输入密码");
        // 设置密码输入框的背景为半透明白色
        passwordPanel.getComponent(1).setBackground(new Color(255, 255, 255, 200));
        // 设置密码输入框的显示字符为黑点
        ((JPasswordField) ((JPanel) passwordPanel.getComponent(1)).getComponent(0)).setEchoChar('•');

        // 创建确认密码输入面板,调用自定义方法
        JPanel confirmPasswordPanel = createInputPanel("确认密码", "请再次输入密码");
        // 设置确认密码输入框的背景为半透明白色
        confirmPasswordPanel.getComponent(1).setBackground(new Color(255, 255, 255, 200));
        // 设置确认密码输入框的显示字符为黑点
        ((JPasswordField) ((JPanel) confirmPasswordPanel.getComponent(1)).getComponent(0)).setEchoChar('•');

        // 创建邮箱输入面板,调用自定义方法
        JPanel emailPanel = createInputPanel("电子邮箱", "请输入邮箱");

        // 创建按钮面板,使用网格布局,1行2列,组件间水平间距为10像素
        JPanel buttonPanel = new JPanel(new GridLayout(1, 2, 10, 0));
        // 设置按钮面板为透明,不绘制背景
        buttonPanel.setOpaque(false);

        // 创建注册按钮
        JButton registerButton = new JButton("立即注册");
        // 调用自定义方法设置按钮样式,正常颜色为森林绿,悬停颜色为绿色
        styleButton(registerButton, new Color(46, 139, 87), new Color(34, 139, 34));

        // 创建返回按钮
        JButton backButton = new JButton("返回登录");
        // 调用自定义方法设置按钮样式,正常颜色为钢蓝色,悬停颜色为宝蓝色
        styleButton(backButton, new Color(70, 130, 180), new Color(65, 105, 225));

        // 将注册按钮添加到按钮面板
        buttonPanel.add(registerButton);
        // 将返回按钮添加到按钮面板
        buttonPanel.add(backButton);

        // 将用户名面板添加到表单面板
        formPanel.add(usernamePanel);
        // 将密码面板添加到表单面板
        formPanel.add(passwordPanel);
        // 将确认密码面板添加到表单面板
        formPanel.add(confirmPasswordPanel);
        // 将邮箱面板添加到表单面板
        formPanel.add(emailPanel);
        // 添加一个空标签作为占位符,用于布局美观
        formPanel.add(new JLabel());
        // 将按钮面板添加到表单面板
        formPanel.add(buttonPanel);

        // 创建关闭按钮,显示为"×"符号
        JButton closeButton = new JButton("×");
        // 设置关闭按钮字体为Arial,粗体,18号
        closeButton.setFont(new Font("Arial", Font.BOLD, 18));
        // 设置关闭按钮文字颜色为白色
        closeButton.setForeground(Color.WHITE);
        // 设置关闭按钮不填充内容区域,使其透明
        closeButton.setContentAreaFilled(false);
        // 设置关闭按钮的边框为空,只有内边距
        closeButton.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
        // 为关闭按钮添加点击事件,点击时关闭注册窗口
        closeButton.addActionListener(e -> registerFrame.dispose());

        // 创建顶部面板,使用流布局,组件右对齐
        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        // 设置顶部面板为透明,不绘制背景
        topPanel.setOpaque(false);
        // 将关闭按钮添加到顶部面板
        topPanel.add(closeButton);

        // 将顶部面板添加到主面板的北部(顶部)
        mainPanel.add(topPanel, BorderLayout.NORTH);
        // 将标题标签添加到主面板的中部
        mainPanel.add(titleLabel, BorderLayout.CENTER);
        // 将表单面板添加到主面板的南部(底部)
        mainPanel.add(formPanel, BorderLayout.SOUTH);

        // 将主面板添加到注册窗口
        registerFrame.add(mainPanel);
        // 显示注册窗口
        registerFrame.setVisible(true);

        // 为返回按钮添加点击事件,点击时关闭注册窗口
        backButton.addActionListener(e -> {
            registerFrame.dispose();
        });

        // 为注册按钮添加点击事件
        registerButton.addActionListener(e -> {
            // 获取用户名输入框中的文本
            String username = ((JTextField) ((JPanel) usernamePanel.getComponent(1)).getComponent(0)).getText();
            // 获取密码输入框中的密码字符数组
            char[] password = ((JPasswordField) ((JPanel) passwordPanel.getComponent(1)).getComponent(0)).getPassword();
            // 获取确认密码输入框中的密码字符数组
            char[] confirmPassword = ((JPasswordField) ((JPanel) confirmPasswordPanel.getComponent(1)).getComponent(0)).getPassword();
            // 获取邮箱输入框中的文本
            String email = ((JTextField) ((JPanel) emailPanel.getComponent(1)).getComponent(0)).getText();

            // 简单验证:检查所有字段是否填写
            if (username.isEmpty() || password.length == 0 || confirmPassword.length == 0 || email.isEmpty()) {
                // 如果有字段为空,显示警告消息对话框
                JOptionPane.showMessageDialog(registerFrame, "所有字段都必须填写", "提示", JOptionPane.WARNING_MESSAGE);
            } else if (!new String(password).equals(new String(confirmPassword))) {
                // 如果两次输入的密码不一致,显示警告消息对话框
                JOptionPane.showMessageDialog(registerFrame, "两次输入的密码不一致", "提示", JOptionPane.WARNING_MESSAGE);
            } else if (!email.contains("@")) {
                // 如果邮箱格式不正确(简单判断是否包含@符号),显示警告消息对话框
                JOptionPane.showMessageDialog(registerFrame, "请输入有效的邮箱地址", "提示", JOptionPane.WARNING_MESSAGE);
            } else {
                // 如果所有验证通过,显示注册成功的信息对话框,并关闭注册窗口
                JOptionPane.showMessageDialog(registerFrame, "注册成功", "提示", JOptionPane.INFORMATION_MESSAGE);
                registerFrame.dispose();
            }
        });
    }

    /**
     * 创建输入面板的方法
     *
     * @param labelText   标签文本,显示在输入框上方
     * @param placeholder 占位符文本,提示用户输入的内容
     * @return 返回一个包含标签和输入框的面板
     */
    private JPanel createInputPanel(String labelText, String placeholder) {
        // 创建面板,使用边界布局
        JPanel panel = new JPanel(new BorderLayout());
        // 设置面板为透明,不绘制背景
        panel.setOpaque(false);

        // 创建标签,显示字段名称
        JLabel label = new JLabel(labelText);
        // 设置标签字体为微软雅黑,普通,14号
        label.setFont(new Font("微软雅黑", Font.PLAIN, 14));
        // 设置标签文字颜色为白色
        label.setForeground(Color.WHITE);
        // 设置标签下方有5像素的内边距
        label.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0));

        // 创建输入面板,用于放置输入框
        JPanel inputPanel = new JPanel();
        // 设置输入面板使用边界布局
        inputPanel.setLayout(new BorderLayout());
        // 设置输入面板背景为半透明白色
        inputPanel.setBackground(new Color(255, 255, 255, 180));
        // 设置输入面板四周有内边距,左右各10像素,上下各5像素
        inputPanel.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));

        // 根据标签文本判断是创建密码输入框还是普通文本输入框
        if (labelText.contains("密码")) {
            // 如果是密码字段,创建密码输入框
            JPasswordField field = new JPasswordField();
            // 设置密码输入框无边框
            field.setBorder(BorderFactory.createEmptyBorder());
            // 设置密码输入框为透明,不绘制背景
            field.setOpaque(false);
            // 设置密码输入框字体为微软雅黑,普通,14号
            field.setFont(new Font("微软雅黑", Font.PLAIN, 14));
            // 设置密码输入框文字颜色为深灰色
            field.setForeground(new Color(50, 50, 50));
            // 将密码输入框添加到输入面板
            inputPanel.add(field);
        } else {
            // 如果不是密码字段,创建普通文本输入框
            JTextField field = new JTextField();
            // 设置文本输入框无边框
            field.setBorder(BorderFactory.createEmptyBorder());
            // 设置文本输入框为透明,不绘制背景
            field.setOpaque(false);
            // 设置文本输入框字体为微软雅黑,普通,14号
            field.setFont(new Font("微软雅黑", Font.PLAIN, 14));
            // 设置文本输入框文字颜色为深灰色
            field.setForeground(new Color(50, 50, 50));
            // 将文本输入框添加到输入面板
            inputPanel.add(field);
        }

        // 将标签添加到面板的北部(顶部)
        panel.add(label, BorderLayout.NORTH);
        // 将输入面板添加到面板的中部
        panel.add(inputPanel, BorderLayout.CENTER);

        // 返回创建好的面板
        return panel;
    }

    /**
     * 设置按钮样式的方法
     *
     * @param button      要设置样式的按钮
     * @param normalColor 按钮正常状态的颜色
     * @param hoverColor  鼠标悬停在按钮上时的颜色
     */
    private void styleButton(JButton button, Color normalColor, Color hoverColor) {
        // 设置按钮字体为微软雅黑,粗体,16号
        button.setFont(new Font("微软雅黑", Font.BOLD, 16));
        // 设置按钮文字颜色为白色
        button.setForeground(Color.WHITE);
        // 设置按钮背景颜色为传入的正常颜色
        button.setBackground(normalColor);
        // 设置按钮的边框为空,上下有10像素的内边距
        button.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
        // 设置不绘制按钮获得焦点时的边框
        button.setFocusPainted(false);
        // 设置鼠标悬停在按钮上时显示手形光标
        button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

        // 为按钮添加鼠标事件监听器
        button.addMouseListener(new java.awt.event.MouseAdapter() {
            // 重写鼠标进入方法
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                // 当鼠标进入按钮区域时,将按钮背景颜色改为传入的悬停颜色
                button.setBackground(hoverColor);
            }

            // 重写鼠标退出方法
            public void mouseExited(java.awt.event.MouseEvent evt) {
                // 当鼠标离开按钮区域时,将按钮背景颜色恢复为传入的正常颜色
                button.setBackground(normalColor);
            }
        });
    }

    /**
     * 设置窗口阴影效果的方法
     *
     * @param frame 要添加阴影效果的窗口
     */
    private void setShadow(JFrame frame) {
        // 设置窗口不透明度为0.9,实现轻微的透明效果
        frame.setOpacity(0.9f);
        // 设置窗口根面板为不透明
        frame.getRootPane().setOpaque(false);
        // 设置窗口根面板的背景为透明
        frame.getRootPane().setBackground(new Color(0, 0, 0, 0));
        // 设置窗口根面板四周有5像素的内边距,形成阴影区域
        frame.getRootPane().setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    }

    /**
     * 程序入口方法
     *
     * @param args 命令行参数,本程序未使用
     */
    public static void main(String[] args) {
        try {
            // 尝试设置UI样式为系统默认样式,使界面与操作系统风格一致
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            // 如果设置UI样式失败,打印异常堆栈信息
            e.printStackTrace();
        }

        // 使用SwingUtilities.invokeLater确保在事件调度线程中创建和显示GUI
        SwingUtilities.invokeLater(() -> {
            // 创建登录表单实例
            ModernLoginForm loginForm = new ModernLoginForm();
            // 显示登录表单窗口
            loginForm.setVisible(true);
        });
    }

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

    }

    private void login(){
        // 获取用户名输入框中的文本
        JTextField usernameField = (JTextField) ((JPanel) usernamePanel.getComponent(1)).getComponent(0);
        String username = usernameField.getText();

        // 获取密码输入框中的密码字符数组
        JPasswordField passwordField = (JPasswordField) ((JPanel) passwordPanel.getComponent(1)).getComponent(0);
        char[] passwordChars = passwordField.getPassword();
        String password = new String(passwordChars);

        //System.out.println("用户名:" + username + ", 密码:" + password);
        User user = getUserByLoginName(username);
        if(user != null && user.getPassword().equals(password)){
            //登录成功
            //System.out.println("登录成功");
            //关闭当前登录窗口
            this.dispose();

            // 创建 EmployeeManagementSystem 实例,并传入用户名
            SwingUtilities.invokeLater(() -> {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());  // 设置系统外观
                } catch (Exception e) {
                    e.printStackTrace();                  // 打印异常堆栈
                }

                EmployeeManagementSystem ems = new EmployeeManagementSystem(username);
                ems.setVisible(true); // 显示员工管理系统窗口
            });
        }else{
            //登录失败
            //System.out.println("登录失败");
            JOptionPane.showMessageDialog(this, "用户名或密码错误", "登录失败", JOptionPane.ERROR_MESSAGE);
       }

    }

    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;
    }
}

EmployeeManagementSystem.java

package com_itheima.ui;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

/**
 * 员工信息管理系统
 * 这是一个基于Java Swing的员工信息管理系统,实现了员工信息的增删改查功能
 */
public class EmployeeManagementSystem extends JFrame {  // 定义主类,继承自JFrame窗口类

    private JTable employeeTable;                     // 声明员工表格组件
    private DefaultTableModel tableModel;             // 声明表格数据模型
    private JTextField searchField;                   // 声明搜索文本框
    private List<Employee> employees = new ArrayList<>();  // 创建员工数据列表,用于存储所有员工信息
    private JPopupMenu popupMenu;                     // 声明右键弹出菜单

    public EmployeeManagementSystem(){}

    /**
     * 构造函数 - 初始化员工管理系统界面
     */
    public EmployeeManagementSystem(String userName) {
        //super("欢迎" + userName + "进入人事管理系统");
        setTitle("欢迎" + userName + "进入员工信息管理系统");                   // 设置窗口标题
        setSize(800, 600);                           // 设置窗口大小,宽800像素,高600像素
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  // 设置关闭窗口时退出程序
        setLocationRelativeTo(null);                 // 设置窗口居中显示

        // 初始化一些测试数据
        initializeSampleData();                      // 调用方法初始化示例员工数据

        // 创建顶部面板
        JPanel topPanel = createTopPanel();          // 调用方法创建顶部面板,包含搜索和添加功能

        // 创建表格
        JScrollPane tableScrollPane = createEmployeeTable();  // 调用方法创建员工表格,带滚动条

        // 布局
        setLayout(new BorderLayout());               // 设置窗口布局为边界布局
        add(topPanel, BorderLayout.NORTH);           // 将顶部面板添加到窗口北部
        add(tableScrollPane, BorderLayout.CENTER);   // 将表格添加到窗口中央

        // 创建右键菜单
        createPopupMenu();                           // 调用方法创建右键弹出菜单
    }

    /**
     * 创建顶部面板,包含搜索框、搜索按钮和添加员工按钮
     * @return JPanel 配置好的顶部面板
     */
    private JPanel createTopPanel() {
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));  // 创建使用流式布局的面板,居中对齐,组件间水平和垂直间距为10像素

        // 搜索框
        searchField = new JTextField(20);            // 创建文本框,初始宽度为20列
        searchField.setPreferredSize(new Dimension(200, 30));  // 设置搜索框的首选大小为宽200高30像素

        // 搜索按钮
        JButton searchButton = new JButton("搜索");   // 创建搜索按钮
        styleButton(searchButton, new Color(70, 130, 180), new Color(65, 105, 225));  // 调用方法设置按钮样式,正常颜色为钢蓝色,悬停颜色为皇家蓝
        searchButton.addActionListener(e -> searchEmployees());  // 添加按钮点击事件,调用搜索员工方法

        // 添加按钮
        JButton addButton = new JButton("添加员工");   // 创建添加员工按钮
        styleButton(addButton, new Color(46, 139, 87), new Color(34, 139, 34));  // 设置按钮样式,正常颜色为海绿色,悬停颜色为森林绿
        addButton.addActionListener(e -> showAddEmployeeDialog());  // 添加按钮点击事件,调用显示添加员工对话框方法

        panel.add(searchField);                      // 将搜索框添加到面板
        panel.add(searchButton);                     // 将搜索按钮添加到面板
        panel.add(addButton);                        // 将添加按钮添加到面板

        return panel;                                // 返回配置好的面板
    }

    /**
     * 创建员工表格,用于显示员工信息
     * @return JScrollPane 带滚动条的表格面板
     */
    private JScrollPane createEmployeeTable() {
        // 表头
        String[] columnNames = {"ID", "姓名", "部门", "职位", "薪资", "入职日期"};  // 定义表格列名数组

        // 表格模型
        tableModel = new DefaultTableModel(columnNames, 0) {  // 创建表格模型,使用列名数组和0行初始数据
            @Override
            public boolean isCellEditable(int row, int column) {
                return false;                        // 重写方法,使表格不可编辑
            }
        };

        // 创建表格
        employeeTable = new JTable(tableModel);      // 使用表格模型创建表格
        employeeTable.setRowHeight(30);              // 设置行高为30像素
        employeeTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  // 设置表格选择模式为单行选择

        // 右键菜单事件
        employeeTable.addMouseListener(new MouseAdapter() {  // 添加鼠标事件监听器
            @Override
            public void mouseClicked(MouseEvent e) {  // 重写鼠标点击方法
                if (SwingUtilities.isRightMouseButton(e)) {  // 判断是否为右键点击
                    int row = employeeTable.rowAtPoint(e.getPoint());  // 获取点击位置所在行
                    if (row >= 0 && row < employeeTable.getRowCount()) {  // 检查行索引是否有效
                        employeeTable.setRowSelectionInterval(row, row);  // 选中该行
                        popupMenu.show(employeeTable, e.getX(), e.getY());  // 在点击位置显示右键菜单
                    }
                }
            }
        });

        // 填充表格数据
        refreshTable();                              // 调用刷新表格方法,填充数据

        return new JScrollPane(employeeTable);       // 将表格添加到滚动面板并返回
    }

    /**
     * 创建右键弹出菜单,包含修改和删除选项
     */
    private void createPopupMenu() {
        popupMenu = new JPopupMenu();                    // 创建一个新的弹出菜单组件

        JMenuItem editItem = new JMenuItem("修改");       // 创建"修改"菜单项
        editItem.addActionListener(e -> {                // 为"修改"菜单项添加动作监听器
            int selectedRow = employeeTable.getSelectedRow();  // 获取当前选中的表格行索引
            if (selectedRow != -1) {                     // 检查是否有选中的行(-1表示没有选中行)
                int id = (int) employeeTable.getValueAt(selectedRow, 0);  // 获取选中行的第一列(ID列)的值并转换为整数
                System.out.println("正在编辑ID为 " + id + " 的员工"); // 在控制台输出调试信息
                editEmployeeById(id);                    // 调用编辑方法并传入员工ID
            }
        });
        popupMenu.add(editItem);                         // 将"修改"菜单项添加到弹出菜单

        JMenuItem deleteItem = new JMenuItem("删除");     // 创建"删除"菜单项
        deleteItem.addActionListener(e -> {              // 为"删除"菜单项添加动作监听器
            int selectedRow = employeeTable.getSelectedRow();  // 获取当前选中的表格行索引
            if (selectedRow != -1) {                     // 检查是否有选中的行
                int id = (int) employeeTable.getValueAt(selectedRow, 0);  // 获取选中行的ID值
                System.out.println("正在删除ID为 " + id + " 的员工"); // 在控制台输出调试信息
                deleteEmployeeById(id);                  // 调用删除方法并传入员工ID
            }
        });
        popupMenu.add(deleteItem);                       // 将"删除"菜单项添加到弹出菜单
    }

    /**
     * 初始化示例员工数据
     */
    private void initializeSampleData() {
        employees.add(new Employee(1, "张三", "技术部", "Java开发", 15000, "2020-05-10"));  // 添加示例员工1
        employees.add(new Employee(2, "李四", "市场部", "市场经理", 18000, "2019-03-15"));  // 添加示例员工2
        employees.add(new Employee(3, "王五", "人事部", "HR专员", 12000, "2021-01-20"));    // 添加示例员工3
        // 添加更多测试数据...
        for (int i = 4; i <= 20; i++) {             // 循环添加17个测试员工数据
            employees.add(new Employee(i, "员工" + i, "部门" + (i % 3 + 1),   // 使用i来生成不同的员工信息
                    "职位" + i, 10000 + i * 500, "2022-" + (i % 12 + 1) + "-" + (i % 28 + 1)));
            // 薪资基础为10000,每人增加500*i
            // 入职日期月份为1-12之间循环,日期为1-28之间循环
        }
    }

    /**
     * 刷新表格数据,将employees列表中的数据填充到表格
     */
    private void refreshTable() {
        tableModel.setRowCount(0);                   // 清空表格所有行

        for (Employee emp : employees) {             // 遍历员工列表
            Object[] rowData = {                     // 创建行数据数组
                    emp.getId(),                         // 员工ID
                    emp.getName(),                       // 员工姓名
                    emp.getDepartment(),                 // 员工部门
                    emp.getPosition(),                   // 员工职位
                    emp.getSalary(),                     // 员工薪资
                    emp.getHireDate()                    // 员工入职日期
            };
            tableModel.addRow(rowData);              // 将行数据添加到表格
        }
    }

    /**
     * 搜索员工,根据关键字过滤表格
     */
    private void searchEmployees() {
        String keyword = searchField.getText().trim().toLowerCase();  // 获取搜索关键字并转小写

        if (keyword.isEmpty()) {                     // 如果关键字为空
            refreshTable();                          // 刷新显示所有员工
            return;                                  // 结束方法
        }

        tableModel.setRowCount(0);                   // 清空表格

        for (Employee emp : employees) {             // 遍历员工列表
            // 检查员工姓名、部门或职位是否包含关键字
            if (emp.getName().toLowerCase().contains(keyword) ||
                    emp.getDepartment().toLowerCase().contains(keyword) ||
                    emp.getPosition().toLowerCase().contains(keyword)) {

                Object[] rowData = {                 // 创建行数据数组
                        emp.getId(),                     // 员工ID
                        emp.getName(),                   // 员工姓名
                        emp.getDepartment(),             // 员工部门
                        emp.getPosition(),               // 员工职位
                        emp.getSalary(),                 // 员工薪资
                        emp.getHireDate()                // 员工入职日期
                };
                tableModel.addRow(rowData);          // 将匹配的员工添加到表格
            }
        }
    }

    /**
     * 显示添加员工对话框
     */
    private void showAddEmployeeDialog() {
        JDialog dialog = new JDialog(this, "添加员工", true);  // 创建模态对话框,标题为"添加员工"
        dialog.setSize(400, 300);                    // 设置对话框大小为400x300像素
        dialog.setLocationRelativeTo(this);          // 设置对话框相对于主窗口居中

        JPanel panel = new JPanel(new GridLayout(6, 2, 10, 10));  // 创建网格布局面板,6行2列,水平和垂直间距为10像素
        panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));  // 设置面板边距为20像素

        // 表单字段
        JTextField idField = new JTextField();       // 创建ID输入框
        JTextField nameField = new JTextField();     // 创建姓名输入框
        JTextField deptField = new JTextField();     // 创建部门输入框
        JTextField posField = new JTextField();      // 创建职位输入框
        JTextField salaryField = new JTextField();   // 创建薪资输入框
        JTextField dateField = new JTextField();     // 创建入职日期输入框

        panel.add(new JLabel("ID:"));                // 添加ID标签
        panel.add(idField);                          // 添加ID输入框
        panel.add(new JLabel("姓名:"));               // 添加姓名标签
        panel.add(nameField);                        // 添加姓名输入框
        panel.add(new JLabel("部门:"));               // 添加部门标签
        panel.add(deptField);                        // 添加部门输入框
        panel.add(new JLabel("职位:"));               // 添加职位标签
        panel.add(posField);                         // 添加职位输入框
        panel.add(new JLabel("薪资:"));               // 添加薪资标签
        panel.add(salaryField);                      // 添加薪资输入框
        panel.add(new JLabel("入职日期:"));            // 添加入职日期标签
        panel.add(dateField);                        // 添加入职日期输入框

        // 按钮面板
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));  // 创建流式布局面板,用于放置按钮
        JButton saveButton = new JButton("保存");     // 创建保存按钮
        styleButton(saveButton, new Color(46, 139, 87), new Color(34, 139, 34));  // 设置保存按钮样式

        JButton cancelButton = new JButton("取消");   // 创建取消按钮
        styleButton(cancelButton, new Color(220, 53, 69), new Color(200, 35, 51));  // 设置取消按钮样式

        saveButton.addActionListener(e -> {          // 为保存按钮添加事件监听器
            try {
                int id = Integer.parseInt(idField.getText());  // 解析ID为整数
                String name = nameField.getText();    // 获取姓名
                String dept = deptField.getText();    // 获取部门
                String pos = posField.getText();      // 获取职位
                double salary = Double.parseDouble(salaryField.getText());  // 解析薪资为浮点数
                String date = dateField.getText();    // 获取入职日期

                employees.add(new Employee(id, name, dept, pos, salary, date));  // 创建并添加新员工
                refreshTable();                      // 刷新表格
                dialog.dispose();                    // 关闭对话框
            } catch (NumberFormatException ex) {     // 捕获数字格式异常
                JOptionPane.showMessageDialog(dialog, "请输入有效的数字(ID和薪资)", "错误", JOptionPane.ERROR_MESSAGE);  // 显示错误消息
            }
        });

        cancelButton.addActionListener(e -> dialog.dispose());  // 为取消按钮添加事件,关闭对话框

        buttonPanel.add(saveButton);                 // 将保存按钮添加到按钮面板
        buttonPanel.add(cancelButton);               // 将取消按钮添加到按钮面板

        dialog.add(panel, BorderLayout.CENTER);      // 将表单面板添加到对话框中央
        dialog.add(buttonPanel, BorderLayout.SOUTH); // 将按钮面板添加到对话框南部
        dialog.setVisible(true);                     // 显示对话框
    }

    /**
     * 编辑选中的员工信息
     */
    private void editSelectedEmployee() {
        int selectedRow = employeeTable.getSelectedRow();  // 获取选中的行索引
        if (selectedRow == -1) {                     // 如果没有选中行
            JOptionPane.showMessageDialog(this, "请先选择要修改的员工", "提示", JOptionPane.WARNING_MESSAGE);  // 显示警告消息
            return;                                  // 结束方法
        }

        int id = (int) employeeTable.getValueAt(selectedRow, 0);  // 获取选中行的ID
        Employee emp = findEmployeeById(id);         // 根据ID查找员工对象

        if (emp == null) return;                     // 如果未找到员工,结束方法

        JDialog dialog = new JDialog(this, "修改员工信息", true);  // 创建模态对话框
        dialog.setSize(400, 300);                    // 设置对话框大小
        dialog.setLocationRelativeTo(this);          // 设置对话框相对于主窗口居中

        JPanel panel = new JPanel(new GridLayout(6, 2, 10, 10));  // 创建网格布局面板
        panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));  // 设置面板边距

        // 表单字段
        JTextField idField = new JTextField(String.valueOf(emp.getId()));  // 创建ID输入框并设置当前值
        idField.setEditable(false);                  // 设置ID不可编辑
        JTextField nameField = new JTextField(emp.getName());  // 创建姓名输入框并设置当前值
        JTextField deptField = new JTextField(emp.getDepartment());  // 创建部门输入框并设置当前值
        JTextField posField = new JTextField(emp.getPosition());  // 创建职位输入框并设置当前值
        JTextField salaryField = new JTextField(String.valueOf(emp.getSalary()));  // 创建薪资输入框并设置当前值
        JTextField dateField = new JTextField(emp.getHireDate());  // 创建入职日期输入框并设置当前值

        panel.add(new JLabel("ID:"));                // 添加ID标签
        panel.add(idField);                          // 添加ID输入框
        panel.add(new JLabel("姓名:"));               // 添加姓名标签
        panel.add(nameField);                        // 添加姓名输入框
        panel.add(new JLabel("部门:"));               // 添加部门标签
        panel.add(deptField);                        // 添加部门输入框
        panel.add(new JLabel("职位:"));               // 添加职位标签
        panel.add(posField);                         // 添加职位输入框
        panel.add(new JLabel("薪资:"));               // 添加薪资标签
        panel.add(salaryField);                      // 添加薪资输入框
        panel.add(new JLabel("入职日期:"));            // 添加入职日期标签
        panel.add(dateField);                        // 添加入职日期输入框

        // 按钮面板
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));  // 创建流式布局面板
        JButton saveButton = new JButton("保存");     // 创建保存按钮
        styleButton(saveButton, new Color(46, 139, 87), new Color(34, 139, 34));  // 设置保存按钮样式

        JButton cancelButton = new JButton("取消");   // 创建取消按钮
        styleButton(cancelButton, new Color(220, 53, 69), new Color(200, 35, 51));  // 设置取消按钮样式

        saveButton.addActionListener(e -> {          // 为保存按钮添加事件监听器
            try {
                emp.setName(nameField.getText());     // 更新姓名
                emp.setDepartment(deptField.getText());  // 更新部门
                emp.setPosition(posField.getText());   // 更新职位
                emp.setSalary(Double.parseDouble(salaryField.getText()));  // 更新薪资
                emp.setHireDate(dateField.getText());  // 更新入职日期

                refreshTable();                      // 刷新表格
                dialog.dispose();                    // 关闭对话框
            } catch (NumberFormatException ex) {     // 捕获数字格式异常
                JOptionPane.showMessageDialog(dialog, "请输入有效的薪资数字", "错误", JOptionPane.ERROR_MESSAGE);  // 显示错误消息
            }
        });

        cancelButton.addActionListener(e -> dialog.dispose());  // 为取消按钮添加事件,关闭对话框

        buttonPanel.add(saveButton);                 // 将保存按钮添加到按钮面板
        buttonPanel.add(cancelButton);               // 将取消按钮添加到按钮面板

        dialog.add(panel, BorderLayout.CENTER);      // 将表单面板添加到对话框中央
        dialog.add(buttonPanel, BorderLayout.SOUTH); // 将按钮面板添加到对话框南部
        dialog.setVisible(true);                     // 显示对话框
    }

    /**
     * 删除选中的员工
     */
    private void deleteSelectedEmployee() {
        int selectedRow = employeeTable.getSelectedRow();  // 获取选中的行索引
        if (selectedRow == -1) {                     // 如果没有选中行
            JOptionPane.showMessageDialog(this, "请先选择要删除的员工", "提示", JOptionPane.WARNING_MESSAGE);  // 显示警告消息
            return;                                  // 结束方法
        }

        int id = (int) employeeTable.getValueAt(selectedRow, 0);  // 获取选中行的ID
        int confirm = JOptionPane.showConfirmDialog(
                this,                                    // 父组件
                "确定要删除此员工吗?",                      // 确认消息
                "确认删除",                               // 对话框标题
                JOptionPane.YES_NO_OPTION               // 显示"是"和"否"按钮
        );

        if (confirm == JOptionPane.YES_OPTION) {     // 如果用户点击了"是"
            employees.removeIf(emp -> emp.getId() == id);  // 从列表中移除匹配ID的员工
            refreshTable();                          // 刷新表格
        }
    }

    /**
     * 根据ID查找员工
     * @param id 要查找的员工ID
     * @return 找到的员工对象,如果未找到则返回null
     */
    private Employee findEmployeeById(int id) {
        for (Employee emp : employees) {             // 遍历员工列表
            if (emp.getId() == id) {                 // 如果ID匹配
                return emp;                          // 返回找到的员工
            }
        }
        return null;                                 // 未找到则返回null
    }

    /**
     * 设置按钮样式
     * @param button 要设置样式的按钮
     * @param normalColor 正常状态的颜色
     * @param hoverColor 鼠标悬停时的颜色
     */
    private void styleButton(JButton button, Color normalColor, Color hoverColor) {
        button.setFont(new Font("微软雅黑", Font.PLAIN, 14));  // 设置按钮字体为微软雅黑,普通样式,14号大小
        button.setForeground(Color.WHITE);           // 设置文字颜色为白色
        button.setBackground(normalColor);           // 设置背景颜色为传入的正常颜色
        button.setBorder(BorderFactory.createEmptyBorder(5, 15, 5, 15));  // 设置内边距,上下5像素,左右15像素
        button.setFocusPainted(false);               // 取消焦点绘制效果
        button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));  // 设置鼠标悬停时显示手形光标

        button.addMouseListener(new MouseAdapter() {  // 添加鼠标事件监听器
            public void mouseEntered(MouseEvent evt) {  // 鼠标进入按钮时
                button.setBackground(hoverColor);     // 改变背景色为悬停颜色
            }
            public void mouseExited(MouseEvent evt) {  // 鼠标离开按钮时
                button.setBackground(normalColor);    // 恢复背景色为正常颜色
            }
        });
    }

    /**
     * 程序入口方法
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {           // 在Swing事件调度线程中执行GUI初始化
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());  // 设置系统外观
            } catch (Exception e) {
                e.printStackTrace();                  // 打印异常堆栈
            }

            EmployeeManagementSystem ems = new EmployeeManagementSystem("");  // 创建员工管理系统实例
            ems.setVisible(true);                     // 显示主窗口
        });
    }

    /**
     * 员工数据模型内部类,用于存储和管理员工信息
     */
    private static class Employee {
        private int id;                               // 员工ID
        private String name;                          // 员工姓名
        private String department;                    // 所属部门
        private String position;                      // 职位
        private double salary;                        // 薪资
        private String hireDate;                      // 入职日期

        /**
         * 员工类构造函数
         * @param id 员工ID
         * @param name 员工姓名
         * @param department 所属部门
         * @param position 职位
         * @param salary 薪资
         * @param hireDate 入职日期
         */
        public Employee(int id, String name, String department, String position, double salary, String hireDate) {
            this.id = id;                             // 初始化ID
            this.name = name;                         // 初始化姓名
            this.department = department;             // 初始化部门
            this.position = position;                 // 初始化职位
            this.salary = salary;                     // 初始化薪资
            this.hireDate = hireDate;                 // 初始化入职日期
        }

        // Getter和Setter方法,用于访问和修改员工属性
        /**
         * 获取员工ID
         * @return 员工ID
         */
        public int getId() { return id; }

        /**
         * 获取员工姓名
         * @return 员工姓名
         */
        public String getName() { return name; }

        /**
         * 设置员工姓名
         * @param name 新的员工姓名
         */
        public void setName(String name) { this.name = name; }

        /**
         * 获取员工部门
         * @return 员工部门
         */
        public String getDepartment() { return department; }

        /**
         * 设置员工部门
         * @param department 新的员工部门
         */
        public void setDepartment(String department) { this.department = department; }

        /**
         * 获取员工职位
         * @return 员工职位
         */
        public String getPosition() { return position; }

        /**
         * 设置员工职位
         * @param position 新的员工职位
         */
        public void setPosition(String position) { this.position = position; }

        /**
         * 获取员工薪资
         * @return 员工薪资
         */
        public double getSalary() { return salary; }

        /**
         * 设置员工薪资
         * @param salary 新的员工薪资
         */
        public void setSalary(double salary) { this.salary = salary; }

        /**
         * 获取员工入职日期
         * @return 员工入职日期
         */
        public String getHireDate() { return hireDate; }

        /**
         * 设置员工入职日期
         * @param hireDate 新的入职日期
         */
        public void setHireDate(String hireDate) { this.hireDate = hireDate; }
    }

    /**
     * 编辑指定ID的员工信息
     * 通过弹出对话框,允许用户编辑指定ID员工的详细信息
     *
     * @param id 要编辑的员工ID,作为员工的唯一标识符
     */
    private void editEmployeeById(int id) {
        Employee emp = findEmployeeById(id);             // 调用findEmployeeById方法根据ID查找员工对象
        if (emp == null) {                               // 如果未找到对应ID的员工
            JOptionPane.showMessageDialog(
                    this,                                    // 父组件,用于确定对话框的位置
                    "未找到ID为 " + id + " 的员工",            // 显示的错误消息文本
                    "错误",                                   // 对话框的标题
                    JOptionPane.ERROR_MESSAGE                // 消息类型,错误图标
            );
            return;                                      // 结束方法执行
        }

        // 创建编辑对话框(与之前相同的代码,只是改名为editEmployeeById)
        JDialog dialog = new JDialog(this, "修改员工信息", true);  // 创建一个模态对话框,标题为"修改员工信息"
        dialog.setSize(400, 300);                        // 设置对话框大小为宽400像素、高300像素
        dialog.setLocationRelativeTo(this);              // 设置对话框相对于主窗口居中显示

        JPanel panel = new JPanel(new GridLayout(6, 2, 10, 10));  // 创建面板,使用6行2列的网格布局,水平和垂直间距为10像素
        panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));  // 设置面板的边距为20像素

        // 表单字段
        JTextField idField = new JTextField(String.valueOf(emp.getId()));  // 创建ID文本框,设置为员工当前ID
        idField.setEditable(false);                      // 设置ID文本框为不可编辑状态,因为ID是唯一标识
        JTextField nameField = new JTextField(emp.getName());  // 创建姓名文本框,设置为员工当前姓名
        JTextField deptField = new JTextField(emp.getDepartment());  // 创建部门文本框,设置为员工当前部门
        JTextField posField = new JTextField(emp.getPosition());  // 创建职位文本框,设置为员工当前职位
        JTextField salaryField = new JTextField(String.valueOf(emp.getSalary()));  // 创建薪资文本框,设置为员工当前薪资
        JTextField dateField = new JTextField(emp.getHireDate());  // 创建入职日期文本框,设置为员工当前入职日期

        panel.add(new JLabel("ID:"));                    // 添加ID标签到面板
        panel.add(idField);                              // 添加ID文本框到面板
        panel.add(new JLabel("姓名:"));                   // 添加姓名标签到面板
        panel.add(nameField);                            // 添加姓名文本框到面板
        panel.add(new JLabel("部门:"));                   // 添加部门标签到面板
        panel.add(deptField);                            // 添加部门文本框到面板
        panel.add(new JLabel("职位:"));                   // 添加职位标签到面板
        panel.add(posField);                             // 添加职位文本框到面板
        panel.add(new JLabel("薪资:"));                   // 添加薪资标签到面板
        panel.add(salaryField);                          // 添加薪资文本框到面板
        panel.add(new JLabel("入职日期:"));                // 添加入职日期标签到面板
        panel.add(dateField);                            // 添加入职日期文本框到面板

        // 按钮面板
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));  // 创建按钮面板,使用居中的流式布局,组件间距为10像素
        JButton saveButton = new JButton("保存");         // 创建保存按钮
        styleButton(saveButton, new Color(46, 139, 87), new Color(34, 139, 34));  // 调用styleButton方法设置保存按钮样式,常规颜色为绿色,悬停颜色为深绿色

        JButton cancelButton = new JButton("取消");       // 创建取消按钮
        styleButton(cancelButton, new Color(220, 53, 69), new Color(200, 35, 51));  // 设置取消按钮样式,常规颜色为红色,悬停颜色为深红色

        saveButton.addActionListener(e -> {              // 为保存按钮添加动作监听器
            try {
                emp.setName(nameField.getText());         // 更新员工姓名为文本框中的值
                emp.setDepartment(deptField.getText());   // 更新员工部门为文本框中的值
                emp.setPosition(posField.getText());      // 更新员工职位为文本框中的值
                emp.setSalary(Double.parseDouble(salaryField.getText()));  // 将薪资文本框内容解析为Double类型并更新员工薪资
                emp.setHireDate(dateField.getText());     // 更新员工入职日期为文本框中的值

                refreshTable();                          // 刷新表格数据,显示更新后的员工信息
                dialog.dispose();                        // 关闭对话框
                JOptionPane.showMessageDialog(
                        this,                                // 父组件
                        "ID为 " + id + " 的员工信息已更新",      // 成功消息文本
                        "成功",                               // 对话框标题
                        JOptionPane.INFORMATION_MESSAGE      // 消息类型,信息图标
                );
            } catch (NumberFormatException ex) {         // 捕获数字格式异常,当薪资无法解析为数字时抛出
                JOptionPane.showMessageDialog(
                        dialog,                              // 父组件为当前对话框
                        "请输入有效的薪资数字",                  // 错误消息文本
                        "错误",                               // 对话框标题
                        JOptionPane.ERROR_MESSAGE            // 消息类型,错误图标
                );
            }
        });

        cancelButton.addActionListener(e -> dialog.dispose());  // 为取消按钮添加动作监听器,点击时关闭对话框

        buttonPanel.add(saveButton);                     // 将保存按钮添加到按钮面板
        buttonPanel.add(cancelButton);                   // 将取消按钮添加到按钮面板

        dialog.add(panel, BorderLayout.CENTER);          // 将表单面板添加到对话框的中央位置
        dialog.add(buttonPanel, BorderLayout.SOUTH);     // 将按钮面板添加到对话框的底部
        dialog.setVisible(true);                         // 显示对话框
    }

    /**
     * 删除指定ID的员工
     * 在确认后从员工列表中移除指定ID的员工
     *
     * @param id 要删除的员工ID,作为员工的唯一标识符
     */
    private void deleteEmployeeById(int id) {
        int confirm = JOptionPane.showConfirmDialog(
                this,                                        // 父组件,用于确定对话框的位置
                "确定要删除ID为 " + id + " 的员工吗?",           // 确认消息文本
                "确认删除",                                    // 对话框标题
                JOptionPane.YES_NO_OPTION                    // 对话框类型,显示"是"和"否"按钮
        );

        if (confirm == JOptionPane.YES_OPTION) {         // 如果用户点击了"是"按钮
            boolean removed = employees.removeIf(emp -> emp.getId() == id);  // 使用removeIf方法和Lambda表达式删除匹配ID的员工,并返回是否删除成功
            if (removed) {                               // 如果成功删除了员工
                refreshTable();                          // 刷新表格数据,移除已删除的员工
                JOptionPane.showMessageDialog(
                        this,                                // 父组件
                        "ID为 " + id + " 的员工已删除",          // 成功消息文本
                        "成功",                               // 对话框标题
                        JOptionPane.INFORMATION_MESSAGE      // 消息类型,信息图标
                );
            } else {                                     // 如果未找到要删除的员工
                JOptionPane.showMessageDialog(
                        this,                                // 父组件
                        "未找到ID为 " + id + " 的员工",           // 错误消息文本
                        "错误",                               // 对话框标题
                        JOptionPane.ERROR_MESSAGE            // 消息类型,错误图标
                );
            }
        }
    }
}

App.java

package com_itheima;
import com_itheima.ui.ModernLoginForm;

public class App {
    public static void main(String[] args) {
        //ModernLoginForm.main();
        ModernLoginForm.main(args);
        //EmployeeManagementSystem.main(args);
    }
}

 

posted on 2025-05-24 20:41  ᶜʸᵃⁿ  阅读(18)  评论(0)    收藏  举报