Giao diện sẽ gồm các cửa sổ đăng nhập, hệ thống QLNS, bảng thông tin, các nút chức năng và các trường nhập liệu để người dùng tương tác.. - Class “Login” sử dụng hoặc phụ thuộc vào class
Mục tiêu
Xây dựng một ứng dụng có khả năng quản lý thông tin về nhân sự của một tổ chức bằng ngôn ngữ java
Hiện thực các chức năng quản lý cơ bản như thêm mới, xem danh sách, chỉnh sửa và xóa thông tin của nhân viên Ngoài ra còn có các chức năng khác như tìm kiếm nhân viên thông qua mã nhân viên, thông kê các nhân viên theo các tiêu chí giới tính, chức vụ, địa chỉ
Phát triển giao diện người dùng thân thiện, dễ sử dụng Đảm bảo rằng các chức năng được tổ chức một cách logic và dễ hiểu, giúp người dùng tương tác với hệ thống một cách hiệu quả nhất.
Phân tích yêu cầu
Giao diện cửa sổ với Swing
Ứng dụng sẽ có giao diện người dùng được thiết kế bằn Java Swing Giao diện sẽ gồm các cửa sổ (đăng nhập, hệ thống QLNS), bảng thông tin, các nút chức năng và các trường nhập liệu để người dùng tương tác.
Sơ đồ class
Ứng dụng có 4 classes Person, Employee, Login, HRManagementGUI Với:
- Class “Person” đại diện cho thông tin cơ bản của mỗi con người bình thường như tên, địa chỉ, ngày sinh, giới tính
- Class “Employee” đại diện cho thông tin cơ bản của mỗi nhân viên trong hệ thống, ngoài các thông tin cơ bản kế thừa từ class “Person” còn có mã nhân viên, chức vụ, số điện thoại, địa chỉ email, lương
- Class “Login” đại diện cho giao diện đăng nhập
- Class “HRManagementGUI” đại diện cho giao diện người dùng và quản lý hiển thị dữ liệu
- Class “Person” là base class của class “Employee”
- Class “Employee” là class con kế thừa từ class “Person”.
- Class “HRManagement” sử dụng đố tượng của class “Employee” để thao tác và hiển thị thông tin nhân viên trong giao diện người dùng Mối quan hệ này cho phép “HRManagement” truy cập và thực hiện các thao tác liên quan đến dữ liệu nhân viên thông qua các đối tượng của class
“Employee” Do đó, mối quan hệ giữa hai class là một mối quan hệ Association
- Class “Login” sử dụng hoặc phụ thuộc vào class “HRManagement” để hiển thị giao diện quản lý nhân sự sau khi người dùng đăng nhập thành công Do đó, mối quan hệ giữa hai class là một mối quan hệ Association
Các tính năng và chức năng trong hệ thống
Các chức năng quản lý thông tin như thêm, sửa, xóa các đối tượng, lưu và tải dữ liệu lên Các chức năng này sẽ được kích hoạt khi người dùng thao tác trên giao diện người dùng, thông qua các nút chức năng
Chức năng tìm kiếm đối tượng cung cấp chức năng tìm kiếm để người dùng có thể tìm kiếm nhân viên thông qua tiêu chí mã nhân viên
Chưc năng thống kê cung cấp chức năng thống kê thông tin về đối tượng để người dùng có thể thống kê nhân viên thông qua một trong 3 tiêu chí giới tính, chức vụ, địa chỉ.
Dữ liệu được lưu trữ dưới dạng Collection
Dữ liệu của ứng dụng sẽ được lưu trữ dưới dạng Collection là ArrayList để dễ dàng quản lý và truy xuất.
Lưu dữ liệu xuống file nhị phân
Khi ứng dụng khởi động, nếu file dữ liệu chưa tồn tại, ứng dụng sẽ tạo mới file để lưu trữ dữ liệu
Nếu file đã tồn tại, muốn load dữ liệu từ file lên để hiển thị trên giao diện người dùng cần sử dụng nút chức năng chuyên dụng.
Kiểm tra dữ liệu khi nhập vào
Ứng dụng sẽ có các cơ chế kiểm tra dữ liệu khi người dùng nhập vào trên giao diện Kiểm tra sẽ đảm bảo tính hợp lệ của dữ liệu trước khi thêm, sửa, hoặc xóa thông tin đối tượng.
Thiết kế và triển khai
Giao diện đăng nhập (class “Login”)
Class "Login" chứa giao diện cho phép người dùng nhập thông tin đăng nhập là tên đăng nhập và mật khẩu Giao diện này bao gồm các trường văn bản để người dùng nhập thông tin, nút để xác nhận đăng nhập “Đăng nhập”, và nút để thoát khỏi giao diện “Hủy”
Do hệ thống QLNS cũng là một trong những phần được bảo mật của mỗi công ty, cho nên giao diện đăng nhập sẽ giúp xác thực thông tin đăng nhập nhập từ người dùng, bao gồm kiểm tra xem thông tin tài khoản và mật khẩu có khớp với dữ liệu trong cơ sở dữ liệu hay không
Nếu thông tin đăng nhập không hợp lệ, class “Login” sẽ hiển thị hộp thông báo lỗi và yêu cầu nhập lại thông tin đăng nhâp
Nếu thông tin đăng nhập hợp lệ, class "Login" sẽ hiển thị hộp thông báo đăng nhập thành công sau đó chuyển hướng người dùng đến giao diện chính của ứng dụng chính là giao diện QLNS.
Giao diện hệ thống QLNS (class “HRManagementGUI”)
Class “HRManagementGUI” là thành phần chính của giao diện người dùng trong hệ thống quản lý nhân sự Nó chứa tất cả các thành phần giao diện cần thiết để hiển thị thông tin nhân sự, thực hiện các thao tác quản lý và tương tác với người dùng
3.2.1 Các tính năng a) Hiển thị thông tin nhân sự
Tính năng hiển thị thông tin nhân sự cung cấp một bảng hiển thị thông tin về các nhân viên trong hệ thống b) Tìm kiếm nhân viên
Tính năng tìm kiếm nhân viên cung cấp chức năng tìm kiếm để người dùng có thể tìm kiếm nhân viên thông qua tiêu chí mã nhân viên Người dùng nhập mã nhân viên cần tìm vào trường văn bản tìm kiếm theo mã nhân viên, sau đó chọn nút “Tìm kiếm” c) Lưu thông tin
Tính năng nhập vào file cung cấp chức năng lưu để người dùng có thể lưu trữ thông tin nhân sự vào file dưới dạng bin bằng cách chọn nút
Tính năng nhập/xuất dữ liệu từ file cung cấp chức năng lưu để người dùng có thể tải dữ liệu lên từ các file dữ liệu có sẵn lên bảng hiển thị thông tin nhân sự bằng cách chọn nút “Tải lên” Nếu không có file nào để tải lên, class sẽ hiển thị hộp thông báo lỗi e) Thoát ứng dụng
Tính năng thoát cung cấp chức năng giúp người dùng thoát khỏi ứng dụng đang sử dụng bằng cách chọn nút “Thoát” Sau đó, class sẽ hiển thị hộp thoại hỏi xem người dùng có chắc chắn muốn thoát không, và có hai lựa chọn Yes (đồng ý), No (không đồng ý) f) Tải lại giao diện
Tính năng tải lại trang cung cấp chức năng giúp người dùng tải lại giao diện về trạng thái ban đầu để không tốn công xóa dữ liệu đã nhập vào các trường văn bản Sử dụng bằng cách chọn nút “F5”, sau đó giao diện sẽ tự động tải lại
3.2.2 Các chức năng a) Thêm nhân viên
Cung cấp chức năng cho phép người dùng thêm mới nhân viên theo các trường văn bản bên trái giao diện và lựa chọn để nhập các thông tin của nhân viên Nếu dữ liệu nhập vào hợp lệ, sau khi chọn nút “Thêm” class sẽ hiển thị hộp thông báo thêm thành công
Nếu dữ liệu nhập vào không hợp lệ, sau khi chọn nút “Thêm” class sẽ hiển thị hộp thông báo lỗi b) Chỉnh sửa thông tin nhân viên
Cung cấp chức năng cho phép người dùng chỉnh sửa thông tin của những nhân viên đã thêm, bằng cách click vào hàng thông tin của nhân viên đó
Rồi các trường văn bản bên trái giao diện sẽ hiển thị thông tin của nhân viên đó theo từng tiêu chí, người dùng click vào các trường văn bản và chỉnh sửa thông tin
Nếu dữ liệu nhập vào khi chỉnh sửa hợp lệ sau khi chọn nút “Sửa” class sẽ hiển thị hộp thông báo sửa thành công
Nếu dữ liệu nhập vào khi chỉnh sửa không hợp lệ, sau khi chọn nút “Sửa” class sẽ hiển thị hộp thông báo lỗi giống lỗi ở phần thêm nhân viên c) Xóa nhân viên
Cung cấp chức năng cho phép người dùng xóa nhân viên đã thêm vào, vằng cách click vào hàng thông tin của nhân viên đó Sau khi chọn nút
“Xóa”, class sẽ hiển thị hộp thoại hỏi xem người dùng có chắc chắn muốn xóa không, và có hai lựa chọn Yes (đồng ý), No (không đồng ý) d) Thống kê danh sách nhân viên
Cung cấp chứ năng cho phép người dùng thống kê danh sách nhân viên có chung một trong 3 tiêu chí giới tính, chức vụ, địa chỉ Người dùng chọn 1 trong 3 tiêu chí ở combobox, sau đó nhập chính xác thông tin chi tiết của tiêu chí đó trong trường văn bản thống kế, cuối cùng là chọn nút
“Thống kê” Danh sách nhân viên có chung tiêu chí đó sẽ hiển thị trên bảng hiển thị thông tin.
Source Code
Class Person
package VuThiTrang_22010386; import java.io.Serializable; public class Person implements Serializable{ protected String name, address, dOB, gender; public Person() {} public Person(String name, String dOB, String gender, String address) { this.name = name; this.dOB = dOB; this.gender = gender; this.address = address;
} public String getName() { return name;
} public void setName(String name) { this.name = name;
} public String getdOB() { return dOB;
} public void setdOB(String dOB) { this.dOB = dOB;
} public String getGender() { return gender;
} public void setGender(String gender) { this.gender = gender;
} public String getAddress() { return address;
} public void setAddress(String address) { this.address = address;
4.2 Class Employee package VuThiTrang_22010386; import java.io.Serializable; public class Employee extends Person implements Serializable{ protected String employeeID, position, phoneNumber, email; protected String salary; public Employee() {
} public Employee(String employeeID, String name, String dOB, String gender, String position, String phoneNumber, String email, String salary, String address) { super(name, dOB, gender, address); this.employeeID = employeeID; this.position = position; this.phoneNumber = phoneNumber; this.email = email; this.salary = salary;
} public String getEmployeeID() { return employeeID;
} public void setEmployeeID(String employeeID) { this.employeeID = employeeID;
} public String getPosition() { return position;
} public void setPosition(String position) { this.position = position;
} public String getPhoneNumber() { return phoneNumber;
} public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber;
} public String getEmail() { return email;
} public void setEmail(String email) { this.email = email;
} public String getSalary() { return salary;
} public void setSalary(String salary) { this.salary = salary;
Class Login
package VuThiTrang_22010386; import javax.swing.JOptionPane; public class Login extends javax.swing.JFrame { private static final String CORRECT_USERNAME = "trangpii2023"; private static final String CORRECT_PASSWORD = "Tr@ngpii2023"; public Login() { initComponents();
// private void initComponents() {
SystemName = new javax.swing.JLabel();
Username = new javax.swing.JLabel();
Password = new javax.swing.JLabel(); jTextField1 = new javax.swing.JTextField(); jPasswordField1 = new javax.swing.JPasswordField();
Login = new javax.swing.JButton();
Exit = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
SystemName.setFont(new java.awt.Font("Segoe UI", 1, 17)); //
SystemName.setHorizontalAlignment(javax.swing.SwingConstants.CENTE R);
SystemName.setText("ĐĂNG NHẬP VÀO HỆ THỐNG QUẢN LÝ NHÂN SỰ");
Username.setFont(new java.awt.Font("Segoe UI", 0, 14)); // NOI18N Username.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); Username.setText("Tên đăng nhập:");
Password.setFont(new java.awt.Font("Segoe UI", 0, 14)); // NOI18N Password.setText("Mật Khẩu: "); jTextField1.setFont(new java.awt.Font("Segoe UI", 0, 13)); // NOI18N jPasswordField1.setFont(new java.awt.Font("Segoe UI", 0, 13)); // NOI18N jPasswordField1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jPasswordField1ActionPerformed(evt);
Login.setFont(new java.awt.Font("Segoe UI", 0, 14)); // NOI18N
Login.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) {
Exit.setFont(new java.awt.Font("Segoe UI", 0, 14)); // NOI18N
Exit.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ExitActionPerformed(evt);
}); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
addComponent(SystemName, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment LEADING)
addComponent(Username, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment LEADING, false)
addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 265, Short.MAX_VALUE) addComponent(jPasswordField1)))
); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING )
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment BASELINE)
addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment
addComponent(jPasswordField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment
}// private void jPasswordField1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here:
} private void LoginActionPerformed(java.awt.event.ActionEvent evt) { String username = jTextField1.getText(); char[] password = jPasswordField1.getPassword();
String enteredPassword = new String(password); if (username.equals(CORRECT_USERNAME) && enteredPassword.equals(CORRECT_PASSWORD)) {
JOptionPane.showMessageDialog(Login.this, "Đăng nhập thành công!"); setVisible(false); openHRManagementGUI();
JOptionPane.showMessageDialog(Login.this, "Sai tên đăng nhập hoặc mật khẩu, mời nhập lại.", "Đăng nhập thất bại!",
JOptionPane.ERROR_MESSAGE); jTextField1.setText(""); jPasswordField1.setText("");
} private void ExitActionPerformed(java.awt.event.ActionEvent evt) { System.exit(0);
} public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Login().setVisible(true);
HRManagementGUI hrManagement = new HRManagementGUI(); hrManagement.setVisible(true);
// Variables declaration - do not modify private javax.swing.JButton Exit; private javax.swing.JButton Login; private javax.swing.JLabel Password; private javax.swing.JLabel SystemName; private javax.swing.JLabel Username; private javax.swing.JPasswordField jPasswordField1; private javax.swing.JTextField jTextField1;
Class HRManagementGUI
package VuThiTrang_22010386; import java.awt.event.KeyEvent; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import javax.swing.JOptionPane; import javax.swing.table.DefaultTableModel; public class HRManagementGUI extends javax.swing.JFrame {
List employees = new ArrayList();
List listEmp = new ArrayList();
File file = new File("Employee.bin"); int selectedIndex;
DefaultTableModel Model; public HRManagementGUI() { initComponents();
// private void initComponents() { scrollPane1 = new java.awt.ScrollPane(); jPanel1 = new javax.swing.JPanel(); systemName = new javax.swing.JLabel(); jScrollPane1 = new javax.swing.JScrollPane();
ManageTable = new javax.swing.JTable();
ID = new javax.swing.JLabel();
Name = new javax.swing.JLabel(); dOB = new javax.swing.JLabel();
Gender = new javax.swing.JLabel();
Position = new javax.swing.JLabel();
Email = new javax.swing.JLabel(); phoneNumber = new javax.swing.JLabel();
Salary = new javax.swing.JLabel();
Address = new javax.swing.JLabel(); txtID = new javax.swing.JTextField(); txtName = new javax.swing.JTextField(); txtdOB = new javax.swing.JTextField(); txtPhoneNumber = new javax.swing.JTextField(); txtEmail = new javax.swing.JTextField(); txtSalary = new javax.swing.JTextField(); txtAddress = new javax.swing.JTextField();
Female = new javax.swing.JRadioButton();
Male = new javax.swing.JRadioButton(); choosePosition = new javax.swing.JComboBox(); LabelFindByID = new javax.swing.JLabel(); txtFindByID = new javax.swing.JTextField();
FindByID = new javax.swing.JButton();
Add = new javax.swing.JButton();
Delete = new javax.swing.JButton();
Update = new javax.swing.JButton();
Save = new javax.swing.JButton();
Exit = new javax.swing.JButton();
LabelFilter = new javax.swing.JLabel();
BoxFilter = new javax.swing.JComboBox(); TxtFilter = new javax.swing.JTextField();
Filter = new javax.swing.JButton();
Load = new javax.swing.JButton();
Refresh = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOS E); jPanel1.setPreferredSize(new java.awt.Dimension(1210, 700)); jPanel1.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(java.awt.event.KeyEvent evt) { jPanel1KeyPressed(evt);
}); systemName.setFont(new java.awt.Font("Segoe UI", 1, 25)); //
NOI18N systemName.setText("HỆ THỐNG QUẢN LÝ NHÂN SỰ");
ManageTable.setModel(new javax.swing.table.DefaultTableModel( new Object [][] {
{null, null, null, null, null, null, null, null, null},
{null, null, null, null, null, null, null, null, null},
{null, null, null, null, null, null, null, null, null},
{null, null, null, null, null, null, null, null, null},
{null, null, null, null, null, null, null, null, null},
{null, null, null, null, null, null, null, null, null},
{null, null, null, null, null, null, null, null, null},
{null, null, null, null, null, null, null, null, null},
{null, null, null, null, null, null, null, null, null},
{null, null, null, null, null, null, null, null, null},
{null, null, null, null, null, null, null, null, null},
{null, null, null, null, null, null, null, null, null},
{null, null, null, null, null, null, null, null, null}, new String [] {
"Mã NV", "Họ và tên", "Ngày sinh", "Giới tính", "Chức vụ",
"SĐT", "Email", "Lương/tháng (VND)", "Địa chỉ"
ManageTable.setMinimumSize(new java.awt.Dimension(400, 400)); ManageTable.setPreferredSize(new java.awt.Dimension(800, 800)); ManageTable.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) {
}); jScrollPane1.setViewportView(ManageTable); if (ManageTable.getColumnModel().getColumnCount() > 0) {
ID.setText("Mã nhân viên");
Name.setText("Họ và tên"); dOB.setText("Ngày sinh");
Email.setText("Email"); phoneNumber.setText("SĐT");
Address.setText("Địa chỉ"); txtEmail.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtEmailActionPerformed(evt);
}); txtSalary.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtSalaryActionPerformed(evt);
Female.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); Female.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { FemaleActionPerformed(evt);
Male.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); Male.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { MaleActionPerformed(evt);
}); choosePosition.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "(GĐ) Giám Đốc",
"(KT) Kế Toán", "(QL) Quản Lí", "(NV) Nhân Viên", "(TTS) Thực Tập Sinh", " " })); choosePosition.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { choosePositionActionPerformed(evt);
LabelFindByID.setFont(new java.awt.Font("Segoe UI", 0, 14)); // NOI18N
LabelFindByID.setText("Tìm kiếm theo mã nhân viên"); txtFindByID.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtFindByIDActionPerformed(evt);
FindByID.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { FindByIDActionPerformed(evt);
Add.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { AddActionPerformed(evt);
Delete.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { DeleteActionPerformed(evt);
Update.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { UpdateActionPerformed(evt);
Save.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { SaveActionPerformed(evt);
Exit.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ExitActionPerformed(evt);
LabelFilter.setFont(new java.awt.Font("Segoe UI", 0, 14)); // NOI18N LabelFilter.setText("Thống kê");
BoxFilter.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Giới tính", "Chức vụ", "Địa chỉ", " " }));
BoxFilter.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { BoxFilterActionPerformed(evt);
Filter.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { FilterActionPerformed(evt);
Load.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { LoadActionPerformed(evt);
Refresh.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { RefreshActionPerformed(evt);
}); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LE ADING)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.LEADING)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.LEADING)
addGroup(jPanel1Layout.createSequentialGroup() addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.LEADING)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.LEADING)
addComponent(choosePosition, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.LEADING)
addComponent(Male, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATE
D, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
addComponent(Female, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.LEADING)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.LEADING)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.LEADING)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.LEADING)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.LEADING)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.LEADING, false)
addGroup(jPanel1Layout.createSequentialGroup() addComponent(Update)
addGroup(jPanel1Layout.createSequentialGroup() addComponent(Load)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATE
D, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) addComponent(Exit)))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELA TED)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.LEADING)
addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 890, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.TRAILING)
addComponent(LabelFilter, javax.swing.GroupLayout.PREFERRED_SIZE, 68, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELA TED)
addComponent(BoxFilter, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.LEADING)
addComponent(txtFindByID, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 187, javax.swing.GroupLayout.PREFERRED_SIZE)
addComponent(TxtFilter, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 187, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.LEADING)
addComponent(FindByID, javax.swing.GroupLayout.Alignment.TRAILING)
addComponent(Filter, javax.swing.GroupLayout.Alignment.TRAILING)))))
addComponent(Refresh, javax.swing.GroupLayout.PREFERRED_SIZE, 44, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATE
D, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) addContainerGap())
); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LE ADING)
addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.LEADING)
addComponent(Refresh, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.LEADING)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.BASELINE)
addComponent(txtID, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.BASELINE)
addComponent(txtName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.BASELINE)
addComponent(txtdOB, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.BASELINE)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.BASELINE)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.BASELINE)
addComponent(txtPhoneNumber, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.BASELINE)
addComponent(txtEmail, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.BASELINE)
addComponent(txtSalary, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.BASELINE)
addComponent(txtAddress, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 436, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATE D)))
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.BASELINE)
addComponent(txtFindByID, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.BASELINE)
addComponent(BoxFilter, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
addComponent(TxtFilter, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
ID.getAccessibleContext().setAccessibleName("jID"); // NOI18N Name.getAccessibleContext().setAccessibleName("Name"); dOB.getAccessibleContext().setAccessibleName("dOB");
Position.getAccessibleContext().setAccessibleName("position"); phoneNumber.getAccessibleContext().setAccessibleName("phoneNumber")
Address.getAccessibleContext().setAccessibleName("Address"); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING )
addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING )
addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,
}// public void showTable (int status) {
ArrayList tempList = new ArrayList(); if(status == 0) { tempList = (ArrayList) employees;
} else if(status == 1) { tempList = (ArrayList) listEmp;
} else { tempList = (ArrayList) employees;
Object[] row = new Object[] {emp.getEmployeeID(), emp.getName(), emp.getdOB(), emp.getGender(), emp.getPosition(), emp.getPhoneNumber(), emp.getEmail(), emp.getSalary(), emp.getAddress()};
} private void FilterActionPerformed(java.awt.event.ActionEvent evt) {
String filter = BoxFilter.getSelectedItem().toString(); listEmp.clear();
String searchText = TxtFilter.getText(); switch (filter) { case "Giới tính": for (Employee emp : employees) { if (emp.getGender().equalsIgnoreCase(searchText)) { listEmp.add(emp);
} break; case "Chức vụ": for (Employee emp : employees) { if (emp.getPosition().equalsIgnoreCase(searchText)) { listEmp.add(emp);
} break; case "Địa chỉ": for (Employee emp : employees) { if (emp.getAddress().equalsIgnoreCase(searchText)) { listEmp.add(emp);
JOptionPane.showMessageDialog(null, "Không hợp lệ!"); break;
} private void AddActionPerformed(java.awt.event.ActionEvent evt) { Employee emp = new Employee();
String newEmployeeID = txtID.getText(); for (Employee e : employees) { if (e.getEmployeeID().equals(newEmployeeID)) {
JOptionPane.showMessageDialog(this, "Trùng ID! Vui lòng nhập
} emp.setEmployeeID(newEmployeeID); emp.setName(txtName.getText()); emp.setdOB(txtdOB.getText());
String gender = ""; if(Male.isSelected()) { gender += "Nam";
} else if (Female.isSelected()) { gender += "Nữ";
} emp.setGender(gender); emp.setPosition(choosePosition.getSelectedItem().toString()); try {
String phoneNumberStr = txtPhoneNumber.getText().trim(); if (!phoneNumberStr.startsWith("0")) { phoneNumberStr = "0" + phoneNumberStr;
} int phoneNum = Integer.parseInt(txtPhoneNumber.getText()); emp.setPhoneNumber(Integer.toString(phoneNum));
// Salary input is not a valid double
JOptionPane.showMessageDialog(this, "Không đúng kiểu dữ liệu!
SĐT phải là số."); return; // Stop further execution
} emp.setEmail(txtEmail.getText()); emp.setSalary(txtSalary.getText()); emp.setAddress(txtAddress.getText()); employees.add(emp); showTable(0);
JOptionPane.showMessageDialog(null, "Thêm dữ liệu thành công!");
} private void UpdateActionPerformed(java.awt.event.ActionEvent evt) { selectedIndex = ManageTable.getSelectedRow();
Employee emp = employees.get(selectedIndex); emp.setEmployeeID(txtID.getText()); emp.setName(txtName.getText()); emp.setdOB(txtdOB.getText());
String gender = ""; if(Male.isSelected()) { gender += "Nam";
} else if (Female.isSelected()) { gender += "Nữ";
} emp.setGender(gender); emp.setPosition(choosePosition.getSelectedItem().toString()); try {
String phoneNumberStr = txtPhoneNumber.getText().trim(); if (!phoneNumberStr.startsWith("0")) { phoneNumberStr = "0" + phoneNumberStr;
} int phoneNum = Integer.parseInt(txtPhoneNumber.getText()); emp.setPhoneNumber(Integer.toString(phoneNum));
// Salary input is not a valid double
JOptionPane.showMessageDialog(this, "Không đúng kiểu dữ liệu! SĐT phải là số."); return; // Stop further execution
} emp.setEmail(txtEmail.getText()); emp.setSalary(txtSalary.getText()); emp.setAddress(txtAddress.getText()); showTable(0);
JOptionPane.showMessageDialog(null, "Sửa dữ liệu thành công!");
} private void DeleteActionPerformed(java.awt.event.ActionEvent evt) { selectedIndex = ManageTable.getSelectedRow();
Employee emp = employees.get(selectedIndex); int n = JOptionPane.showConfirmDialog(this, "Bạn có chắc chắn muốn xóa không?", "Alert", JOptionPane.YES_NO_OPTION); if(n == JOptionPane.YES_OPTION){ employees.remove(selectedIndex); showTable(0);
} private void SaveActionPerformed(java.awt.event.ActionEvent evt) { if(!file.exists()) { try { file.createNewFile();
OutputStream out = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(out); oos.writeObject(employees); oos.close();
JOptionPane.showMessageDialog(null, "Lưu dữ liệu thành công!");
} private void ExitActionPerformed(java.awt.event.ActionEvent evt) { int confimred = JOptionPane.showConfirmDialog(null, "Bạn có muốn thoát không?","Thông báo", JOptionPane.YES_NO_OPTION); { if(confimred == JOptionPane.YES_OPTION) {
} private void ManageTableMouseClicked(java.awt.event.MouseEvent evt)
Employee emp = employees.get(selectedIndex); txtID.setText(emp.getEmployeeID()); txtName.setText(emp.getName()); txtdOB.setText(emp.getdOB());
String sex = emp.getGender(); if(sex.equals("Nam")) {
} else if(sex.equals("Nữ")){
} choosePosition.setSelectedItem(emp.getPosition()); txtPhoneNumber.setText(emp.getPhoneNumber()); txtEmail.setText(emp.getEmail()); txtSalary.setText(emp.getSalary()); txtAddress.setText(emp.getAddress());
} private void LoadActionPerformed(java.awt.event.ActionEvent evt) { try {
InputStream in = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(in); employees = (List) ois.readObject(); ois.close();
JOptionPane.showMessageDialog(null, "Tải dữ liệu lên thành công!");
JOptionPane.showMessageDialog(null, "Không có dữ liệu để tải lên!");
} private void FindByIDActionPerformed(java.awt.event.ActionEvent evt)
String ID = txtFindByID.getText(); listEmp.clear(); for(int i = 0 ; i < employees.size(); i++){
Employee emp = employees.get(i); if(emp.getEmployeeID().equalsIgnoreCase(ID)){ listEmp.add(emp);
} private void RefreshActionPerformed(java.awt.event.ActionEvent evt) { txtID.setText(""); txtName.setText(""); txtdOB.setText("");
Male.setSelected(true); choosePosition.setSelectedIndex(0); txtPhoneNumber.setText(""); txtEmail.setText(""); txtSalary.setText(""); showTable(0);
BoxFilter.setSelectedIndex(0); txtFindByID.setText(""); txtAddress.setText(""); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new HRManagementGUI().setVisible(true); }
// Variables declaration - do not modify private javax.swing.JButton Add; private javax.swing.JLabel Address; private javax.swing.JComboBox BoxFilter; private javax.swing.JButton Delete; private javax.swing.JLabel Email; private javax.swing.JButton Exit; private javax.swing.JRadioButton Female; private javax.swing.JButton Filter; private javax.swing.JButton FindByID; private javax.swing.JLabel Gender; private javax.swing.JLabel ID; private javax.swing.JLabel LabelFilter; private javax.swing.JLabel LabelFindByID; private javax.swing.JButton Load; private javax.swing.JRadioButton Male; private javax.swing.JTable ManageTable;