package dell_system; import targets.Company; import targets.Department; import javax.swing.*; import javax.swing.border.EmptyBorder; import javax.swing.table.*; import java.awt.*; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.*; import java.util.List; import java.util.ResourceBundle; public class DepartmentManagementPanel extends JPanel { private static final long serialVersionUID = 1L; private JTable departmentTable; private DefaultTableModel tableModel; private List allDepartments; private List allCompanies; private ResourceBundle messages; private JTextField searchField; @SuppressWarnings("serial") public DepartmentManagementPanel(ResourceBundle messages) { this.messages = messages; setLayout(new BorderLayout()); setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // ¶¥²¿Ãæ°å JPanel topPanel = new JPanel(new BorderLayout(5, 5)); topPanel.setBorder(BorderFactory.createTitledBorder(getMessage("QKOP"))); // ËÑË÷Ãæ°å JPanel searchInputPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0)); JLabel searchLabel = new JLabel(getMessage("DEPARTMENT_NAME") + ":"); searchField = new JTextField(20); JButton searchButton = new JButton(getMessage("SEARCH")); JButton resetButton = new JButton(getMessage("RESET")); searchInputPanel.add(searchLabel); searchInputPanel.add(searchField); searchInputPanel.add(searchButton); searchInputPanel.add(resetButton); // ²Ù×÷°´Å¥Ãæ°å JPanel actionPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 0)); JButton addButton = new JButton(getMessage("ADD")); JButton editButton = new JButton(getMessage("EDIT")); JButton deleteButton = new JButton(getMessage("DELETE")); JButton refreshButton = new JButton(getMessage("REFRESH")); actionPanel.add(addButton); actionPanel.add(editButton); actionPanel.add(deleteButton); actionPanel.add(refreshButton); topPanel.add(searchInputPanel, BorderLayout.CENTER); topPanel.add(actionPanel, BorderLayout.EAST); // ´´½¨±í¸ñÁÐÃû String[] columnNames = { getMessage("INDEX"), getMessage("DEPARTMENT_NAME"), getMessage("BELONGING_COMPANY"), getMessage("VIEW_PERMISSION"), getMessage("ADD_PERMISSION"), getMessage("EDIT_PERMISSION"), getMessage("DELETE_PERMISSION"), getMessage("ADDED_DATE") }; // ´´½¨±í¸ñÄ£ÐÍ tableModel = new DefaultTableModel(columnNames, 0) { @Override public boolean isCellEditable(int row, int column) { return false; } }; // ´´½¨±í¸ñ departmentTable = new JTable(tableModel); departmentTable.setAutoCreateRowSorter(true); departmentTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // ÉèÖÃÁпí TableColumnModel columnModel = departmentTable.getColumnModel(); columnModel.getColumn(0).setPreferredWidth(50); // ÐòºÅ columnModel.getColumn(1).setPreferredWidth(150); // ²¿ÃÅÃû³Æ columnModel.getColumn(2).setPreferredWidth(150); // ËùÊô¹«Ë¾ columnModel.getColumn(3).setPreferredWidth(80); // ²é¿´È¨ÏÞ columnModel.getColumn(4).setPreferredWidth(80); // Ôö¼ÓȨÏÞ columnModel.getColumn(5).setPreferredWidth(80); // ÐÞ¸ÄȨÏÞ columnModel.getColumn(6).setPreferredWidth(80); // ɾ³ýȨÏÞ columnModel.getColumn(7).setPreferredWidth(150); // Ìí¼ÓÈÕÆÚ // ÉèÖñíÍ·Ñùʽ JTableHeader header = departmentTable.getTableHeader(); header.setBackground(Color.GRAY); header.setForeground(Color.WHITE); header.setFont(header.getFont().deriveFont(Font.BOLD)); // ´´½¨±íÍ·äÖȾÆ÷ DefaultTableCellRenderer headerRenderer = new DefaultTableCellRenderer() { { setHorizontalAlignment(SwingConstants.LEFT); setBackground(Color.GRAY); setForeground(Color.WHITE); setFont(getFont().deriveFont(Font.BOLD)); } }; // Ó¦ÓñíÍ·äÖȾÆ÷ for (int i = 0; i < departmentTable.getColumnCount(); i++) { departmentTable.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer); } JScrollPane scrollPane = new JScrollPane(departmentTable); scrollPane.setPreferredSize(new Dimension(1000, 400)); // Ìí¼Ó×é¼þ add(topPanel, BorderLayout.NORTH); add(scrollPane, BorderLayout.CENTER); // ¼ÓÔØÊý¾Ý loadDepartmentData(); loadCompanyData(); // Ìí¼Óʼþ¼àÌýÆ÷ addButton.addActionListener(e -> addNewDepartment()); editButton.addActionListener(e -> editSelectedDepartment()); deleteButton.addActionListener(e -> deleteSelectedDepartments()); refreshButton.addActionListener(e -> { loadDepartmentData(); loadCompanyData(); }); searchButton.addActionListener(e -> searchDepartments()); resetButton.addActionListener(e -> resetSearch()); } private void loadDepartmentData() { try { allDepartments = Dell_department.getAllDepartments(); updateTable(allDepartments); } catch (SQLException ex) { JOptionPane.showMessageDialog(this, getMessage("DATA_LOAD_ERROR") + ": " + ex.getMessage(), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); } } private void loadCompanyData() { try { allCompanies = Dell_company.getAllCompanies(); } catch (SQLException ex) { JOptionPane.showMessageDialog(this, getMessage("DATA_LOAD_ERROR") + ": " + ex.getMessage(), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); } } // ËÑË÷²¿ÃÅ private void searchDepartments() { String keyword = searchField.getText().trim(); if (keyword.isEmpty()) { updateTable(allDepartments); return; } List filtered = new ArrayList<>(); for (Department dept : allDepartments) { if (dept.getDepartmentName().toLowerCase().contains(keyword.toLowerCase())) { filtered.add(dept); } } if (filtered.isEmpty()) { JOptionPane.showMessageDialog(this, getMessage("SEARCH_NO_DEPARTMENTS"), getMessage("INFO"), JOptionPane.INFORMATION_MESSAGE); } updateTable(filtered); } // ÖØÖÃËÑË÷ private void resetSearch() { searchField.setText(""); updateTable(allDepartments); } private void updateTable(List departments) { tableModel.setRowCount(0); int index = 1; for (Department dept : departments) { tableModel.addRow(new Object[]{ index++, dept.getDepartmentName(), dept.getCompany(), dept.getViewPermission().equals("1") ? getMessage("HAS_PERMISSION") : getMessage("NO_PERMISSION"), dept.getAddPermission().equals("1") ? getMessage("HAS_PERMISSION") : getMessage("NO_PERMISSION"), dept.getEditPermission().equals("1") ? getMessage("HAS_PERMISSION") : getMessage("NO_PERMISSION"), dept.getDeletePermission().equals("1") ? getMessage("HAS_PERMISSION") : getMessage("NO_PERMISSION"), dept.getAddedDate() }); } } private void addNewDepartment() { DepartmentEditDialog dialog = new DepartmentEditDialog( (Frame) SwingUtilities.getWindowAncestor(this), messages, true, null, allCompanies ); dialog.setVisible(true); if (dialog.isConfirmed()) { Department newDept = dialog.getDepartment(); // ÑéÖ¤ÊäÈë if (validateInput(newDept)) { // ¼ì²é²¿ÃÅÃû³ÆÊÇ·ñΨһ if (isDepartmentNameExists(newDept.getDepartmentName())) { JOptionPane.showMessageDialog(this, getMessage("DEPARTMENT_NAME_EXISTS"), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); return; } // ±£´æµ½Êý¾Ý¿â if (saveDepartmentToDatabase(newDept)) { // ¸üÐÂÄÚ´æÊý¾Ý allDepartments.add(newDept); updateTable(allDepartments); } } } } private void editSelectedDepartment() { int selectedRow = departmentTable.getSelectedRow(); if (selectedRow == -1) { JOptionPane.showMessageDialog(this, getMessage("SELECT_DEPARTMENT_TO_EDIT"), getMessage("WARNING"), JOptionPane.WARNING_MESSAGE); return; } // »ñȡѡÖеIJ¿ÃÅ int modelRow = departmentTable.convertRowIndexToModel(selectedRow); String deptName = (String) tableModel.getValueAt(modelRow, 1); Department dept = findDepartmentByName(deptName); if (dept == null) { JOptionPane.showMessageDialog(this, getMessage("DEPARTMENT_NOT_FOUND"), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); return; } DepartmentEditDialog dialog = new DepartmentEditDialog( (Frame) SwingUtilities.getWindowAncestor(this), messages, false, dept, allCompanies ); dialog.setVisible(true); if (dialog.isConfirmed()) { Department updatedDept = dialog.getDepartment(); // ÑéÖ¤ÊäÈë if (validateInput(updatedDept)) { // ¸üв¿ÃÅÐÅÏ¢ dept.setDepartmentName(updatedDept.getDepartmentName()); dept.setCompany(updatedDept.getCompany()); dept.setViewPermission(updatedDept.getViewPermission()); dept.setAddPermission(updatedDept.getAddPermission()); dept.setEditPermission(updatedDept.getEditPermission()); dept.setDeletePermission(updatedDept.getDeletePermission()); // ¸üÐÂÊý¾Ý¿â if (updateDepartmentInDatabase(dept)) { // ¸üбí¸ñ updateTable(allDepartments); } } } } private void deleteSelectedDepartments() { int[] selectedRows = departmentTable.getSelectedRows(); if (selectedRows.length == 0) { JOptionPane.showMessageDialog(this, getMessage("SELECT_DEPARTMENT_TO_DELETE"), getMessage("WARNING"), JOptionPane.WARNING_MESSAGE); return; } int confirm = JOptionPane.showConfirmDialog(this, getMessage("CONFIRM_DELETE") + " " + selectedRows.length + " " + getMessage("DEPARTMENTS") + "?", getMessage("CONFIRM"), JOptionPane.YES_NO_OPTION); if (confirm == JOptionPane.YES_OPTION) { Arrays.sort(selectedRows); for (int i = selectedRows.length - 1; i >= 0; i--) { int viewRow = selectedRows[i]; int modelRow = departmentTable.convertRowIndexToModel(viewRow); String deptName = (String) tableModel.getValueAt(modelRow, 1); Department dept = findDepartmentByName(deptName); if (dept != null) { // ´ÓÊý¾Ý¿âɾ³ý if (deleteDepartmentFromDatabase(dept)) { // ´ÓÄÚ´æÊý¾Ýɾ³ý allDepartments.remove(dept); } } } // ˢбí¸ñ updateTable(allDepartments); } } private boolean validateInput(Department dept) { // ²¿ÃÅÃû³Æ²»ÄÜΪ¿Õ if (dept.getDepartmentName() == null || dept.getDepartmentName().trim().isEmpty()) { JOptionPane.showMessageDialog(this, getMessage("DEPARTMENT_NAME_REQUIRED"), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); return false; } // ²¿ÃÅÃû³Æ³¤¶ÈÑéÖ¤ (2-30×Ö·û) String name = dept.getDepartmentName().trim(); if (name.length() < 2 || name.length() > 30) { JOptionPane.showMessageDialog(this, getMessage("DEPARTMENT_NAME_LENGTH"), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); return false; } return true; } private boolean isDepartmentNameExists(String deptName) { for (Department dept : allDepartments) { if (dept.getDepartmentName().equals(deptName)) { return true; } } return false; } private Department findDepartmentByName(String deptName) { for (Department dept : allDepartments) { if (dept.getDepartmentName().equals(deptName)) { return dept; } } return null; } private boolean saveDepartmentToDatabase(Department dept) { try { Dell_department.insertDepartment(dept); JOptionPane.showMessageDialog(this, getMessage("SAVE_SUCCESS"), getMessage("SUCCESS"), JOptionPane.INFORMATION_MESSAGE); return true; } catch (SQLException ex) { JOptionPane.showMessageDialog(this, getMessage("SAVE_FAILED") + ": " + ex.getMessage(), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); return false; } } private boolean updateDepartmentInDatabase(Department dept) { try { // ×¢Ò⣺ÕâÀïÐèҪʵÏÖupdateDepartment·½·¨ // Dell_department.updateDepartment(dept); JOptionPane.showMessageDialog(this, getMessage("UPDATE_SUCCESS"), getMessage("SUCCESS"), JOptionPane.INFORMATION_MESSAGE); return true; } catch (Exception ex) { JOptionPane.showMessageDialog(this, getMessage("UPDATE_FAILED") + ": " + ex.getMessage(), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); return false; } } private boolean deleteDepartmentFromDatabase(Department dept) { try { Dell_department.deleteDepartment(dept.getId()); JOptionPane.showMessageDialog(this, getMessage("DELETE_SUCCESS"), getMessage("SUCCESS"), JOptionPane.INFORMATION_MESSAGE); return true; } catch (SQLException ex) { JOptionPane.showMessageDialog(this, getMessage("DELETE_FAILED") + ": " + ex.getMessage(), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); return false; } } private String getMessage(String key) { try { return messages.getString(key); } catch (Exception e) { return "[" + key + "]"; } } // ²¿Ãű༭¶Ô»°¿ò class DepartmentEditDialog extends JDialog { private static final long serialVersionUID = 1L; private JTextField nameField; private JComboBox companyCombo; private ButtonGroup viewPermissionGroup; private ButtonGroup addPermissionGroup; private ButtonGroup editPermissionGroup; private ButtonGroup deletePermissionGroup; private JTextField dateField; private boolean confirmed = false; private Department department; public DepartmentEditDialog(Frame parent, ResourceBundle messages, boolean isAddDialog, Department existingDept, List companies) { super(parent, isAddDialog ? getMessage("ADD_DEPARTMENT") : getMessage("EDIT_DEPARTMENT"), true); setLayout(new BorderLayout()); setSize(500, 300); setLocationRelativeTo(parent); JPanel formPanel = new JPanel(new GridLayout(7, 2, 5, 5)); formPanel.setBorder(new EmptyBorder(10, 10, 10, 10)); // ²¿ÃÅÃû³Æ JLabel nameLabel = new JLabel(getMessage("DEPARTMENT_NAME") + ": *"); nameField = new JTextField(); formPanel.add(nameLabel); formPanel.add(nameField); // ËùÊô¹«Ë¾ JLabel companyLabel = new JLabel(getMessage("BELONGING_COMPANY") + ": *"); companyCombo = new JComboBox<>(); for (Company company : companies) { companyCombo.addItem(company.getCompanyName()); } formPanel.add(companyLabel); formPanel.add(companyCombo); // ²é¿´È¨ÏÞ JLabel viewLabel = new JLabel(getMessage("VIEW_PERMISSION") + ":"); viewPermissionGroup = new ButtonGroup(); JRadioButton viewYes = new JRadioButton(getMessage("HAS_PERMISSION")); viewYes.setSelected(true); JRadioButton viewNo = new JRadioButton(getMessage("NO_PERMISSION")); viewPermissionGroup.add(viewYes); viewPermissionGroup.add(viewNo); JPanel viewPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); viewPanel.add(viewYes); viewPanel.add(viewNo); formPanel.add(viewLabel); formPanel.add(viewPanel); // Ôö¼ÓȨÏÞ JLabel addLabel = new JLabel(getMessage("ADD_PERMISSION") + ":"); addPermissionGroup = new ButtonGroup(); JRadioButton addYes = new JRadioButton(getMessage("HAS_PERMISSION")); JRadioButton addNo = new JRadioButton(getMessage("NO_PERMISSION")); addNo.setSelected(true); addPermissionGroup.add(addYes); addPermissionGroup.add(addNo); JPanel addPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); addPanel.add(addYes); addPanel.add(addNo); formPanel.add(addLabel); formPanel.add(addPanel); // ÐÞ¸ÄȨÏÞ JLabel editLabel = new JLabel(getMessage("EDIT_PERMISSION") + ":"); editPermissionGroup = new ButtonGroup(); JRadioButton editYes = new JRadioButton(getMessage("HAS_PERMISSION")); JRadioButton editNo = new JRadioButton(getMessage("NO_PERMISSION")); editNo.setSelected(true); editPermissionGroup.add(editYes); editPermissionGroup.add(editNo); JPanel editPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); editPanel.add(editYes); editPanel.add(editNo); formPanel.add(editLabel); formPanel.add(editPanel); // ɾ³ýȨÏÞ JLabel deleteLabel = new JLabel(getMessage("DELETE_PERMISSION") + ":"); deletePermissionGroup = new ButtonGroup(); JRadioButton deleteYes = new JRadioButton(getMessage("HAS_PERMISSION")); JRadioButton deleteNo = new JRadioButton(getMessage("NO_PERMISSION")); deleteNo.setSelected(true); deletePermissionGroup.add(deleteYes); deletePermissionGroup.add(deleteNo); JPanel deletePanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); deletePanel.add(deleteYes); deletePanel.add(deleteNo); formPanel.add(deleteLabel); formPanel.add(deletePanel); // Ìí¼ÓÈÕÆÚ JLabel dateLabel = new JLabel(getMessage("ADDED_DATE") + ":"); dateField = new JTextField(); dateField.setEditable(false); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); dateField.setText(sdf.format(new Date())); formPanel.add(dateLabel); formPanel.add(dateField); // Èç¹ûÊDZ༭¶Ô»°¿ò£¬Ìî³äÏÖÓÐÊý¾Ý if (!isAddDialog && existingDept != null) { nameField.setText(existingDept.getDepartmentName()); companyCombo.setSelectedItem(existingDept.getCompany()); // ÉèÖÃȨÏÞÑ¡Ïî setPermissionSelection(viewPermissionGroup, existingDept.getViewPermission()); setPermissionSelection(addPermissionGroup, existingDept.getAddPermission()); setPermissionSelection(editPermissionGroup, existingDept.getEditPermission()); setPermissionSelection(deletePermissionGroup, existingDept.getDeletePermission()); dateField.setText(existingDept.getAddedDate()); } add(formPanel, BorderLayout.CENTER); // °´Å¥Ãæ°å JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); JButton okButton = new JButton(getMessage("OK")); JButton cancelButton = new JButton(getMessage("CANCEL")); okButton.addActionListener(e -> { confirmed = true; department = createDepartmentFromInput(); dispose(); }); cancelButton.addActionListener(e -> dispose()); buttonPanel.add(okButton); buttonPanel.add(cancelButton); add(buttonPanel, BorderLayout.SOUTH); } private void setPermissionSelection(ButtonGroup group, String permission) { for (AbstractButton button : Collections.list(group.getElements())) { String buttonText = button.getText(); boolean isMatch = ("1".equals(permission) && buttonText.equals(getMessage("HAS_PERMISSION"))) || ("0".equals(permission) && buttonText.equals(getMessage("NO_PERMISSION"))); if (isMatch) { button.setSelected(true); break; } } } private Department createDepartmentFromInput() { Department dept = new Department(); dept.setDepartmentName(nameField.getText()); dept.setCompany((String) companyCombo.getSelectedItem()); dept.setViewPermission(getPermissionValue(viewPermissionGroup)); dept.setAddPermission(getPermissionValue(addPermissionGroup)); dept.setEditPermission(getPermissionValue(editPermissionGroup)); dept.setDeletePermission(getPermissionValue(deletePermissionGroup)); dept.setAddedDate(dateField.getText()); return dept; } private String getPermissionValue(ButtonGroup group) { for (AbstractButton button : Collections.list(group.getElements())) { if (button.isSelected()) { return button.getText().equals(getMessage("HAS_PERMISSION")) ? "1" : "0"; } } return "0"; } public Department getDepartment() { return department; } public boolean isConfirmed() { return confirmed; } } }