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