package dell_suanfa; import targets.LayerManagement; import javax.swing.*; import javax.swing.border.EmptyBorder; import javax.swing.table.*; import dell_system.Dell_company; import java.awt.*; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.*; import java.util.List; import java.util.ResourceBundle; public class LayerManagementPanel extends JPanel { private static final long serialVersionUID = 1L; private JTable layerTable; private DefaultTableModel tableModel; private List allLayers; private ResourceBundle messages; private JTextField searchField; @SuppressWarnings("serial") public LayerManagementPanel(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("FLOOR_SETTINGS"))); // ×ó²àËÑË÷Ãæ°å JPanel searchInputPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0)); JLabel searchLabel = new JLabel(getMessage("SEARCH") + ":"); 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("LAYER_NUMBER"), getMessage("BOTTOM_HEIGHT"), getMessage("TOP_HEIGHT"), getMessage("COMPANY"), getMessage("DATE") }; // ´´½¨±í¸ñÄ£ÐÍ tableModel = new DefaultTableModel(columnNames, 0) { @Override public boolean isCellEditable(int row, int column) { return false; } }; // ´´½¨±í¸ñ layerTable = new JTable(tableModel); layerTable.setAutoCreateRowSorter(true); layerTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // ÉèÖÃÁпí TableColumnModel columnModel = layerTable.getColumnModel(); columnModel.getColumn(0).setPreferredWidth(50); // ÐòºÅ columnModel.getColumn(1).setPreferredWidth(100); // ²ã±àºÅ columnModel.getColumn(2).setPreferredWidth(100); // ²ãµ×¸ß columnModel.getColumn(3).setPreferredWidth(100); // ²ã¶¥¸ß columnModel.getColumn(4).setPreferredWidth(200); // ËùÊô¹«Ë¾ columnModel.getColumn(5).setPreferredWidth(200); // Ìí¼Óʱ¼ä // ÉèÖñíÍ·Ñùʽ JTableHeader header = layerTable.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 < layerTable.getColumnCount(); i++) { layerTable.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer); } JScrollPane scrollPane = new JScrollPane(layerTable); scrollPane.setPreferredSize(new Dimension(900, 400)); // Ìí¼Ó×é¼þ add(topPanel, BorderLayout.NORTH); add(scrollPane, BorderLayout.CENTER); // ¼ÓÔØÊý¾Ý loadLayerData(); // Ìí¼Óʼþ¼àÌýÆ÷ addButton.addActionListener(e -> addNewLayer()); editButton.addActionListener(e -> editSelectedLayer()); deleteButton.addActionListener(e -> deleteSelectedLayers()); refreshButton.addActionListener(e -> loadLayerData()); searchButton.addActionListener(e -> searchLayers()); resetButton.addActionListener(e -> resetSearch()); } private void loadLayerData() { try { allLayers = Dell_LayerManagement.getAllLayers(); updateTable(allLayers); } catch (SQLException ex) { JOptionPane.showMessageDialog(this, getMessage("DATA_LOAD_ERROR") + ": " + ex.getMessage(), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); } } // ËÑË÷Â¥²ã private void searchLayers() { String keyword = searchField.getText().trim(); if (keyword.isEmpty()) { updateTable(allLayers); return; } List filtered = new ArrayList<>(); for (LayerManagement layer : allLayers) { if (layer.getLayerNumber().toLowerCase().contains(keyword.toLowerCase())) { filtered.add(layer); } } if (filtered.isEmpty()) { JOptionPane.showMessageDialog(this, getMessage("SEARCH_NO_RESULTS"), getMessage("INFO"), JOptionPane.INFORMATION_MESSAGE); } updateTable(filtered); } // ÖØÖÃËÑË÷ private void resetSearch() { searchField.setText(""); updateTable(allLayers); } private void updateTable(List layers) { tableModel.setRowCount(0); int index = 1; for (LayerManagement layer : layers) { tableModel.addRow(new Object[]{ index++, layer.getLayerNumber(), layer.getBottomHeight(), layer.getTopHeight(), layer.getCompany(), layer.getAddTime() }); } } private void addNewLayer() { LayerEditDialog dialog = new LayerEditDialog( (Frame) SwingUtilities.getWindowAncestor(this), messages, true, null ); dialog.setVisible(true); if (dialog.isConfirmed()) { LayerManagement newLayer = dialog.getLayer(); // ÑéÖ¤ÊäÈë if (validateInput(newLayer)) { // ¼ì²é²ã±àºÅÊÇ·ñΨһ if (isLayerNumberExists(newLayer.getLayerNumber())) { JOptionPane.showMessageDialog(this, getMessage("LAYER_NUMBER_EXISTS"), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); return; } // ±£´æµ½Êý¾Ý¿â if (saveLayerToDatabase(newLayer)) { // ¸üÐÂÄÚ´æÊý¾Ý allLayers.add(newLayer); updateTable(allLayers); } } } } private void editSelectedLayer() { int selectedRow = layerTable.getSelectedRow(); if (selectedRow == -1) { JOptionPane.showMessageDialog(this, getMessage("SELECT_LAYER_TO_EDIT"), getMessage("WARNING"), JOptionPane.WARNING_MESSAGE); return; } // »ñȡѡÖеÄÂ¥²ã int modelRow = layerTable.convertRowIndexToModel(selectedRow); String layerNumber = (String) tableModel.getValueAt(modelRow, 1); LayerManagement layer = findLayerByNumber(layerNumber); if (layer == null) { JOptionPane.showMessageDialog(this, getMessage("LAYER_NOT_FOUND"), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); return; } LayerEditDialog dialog = new LayerEditDialog( (Frame) SwingUtilities.getWindowAncestor(this), messages, false, layer ); dialog.setVisible(true); if (dialog.isConfirmed()) { LayerManagement updatedLayer = dialog.getLayer(); // ÑéÖ¤ÊäÈë if (validateInput(updatedLayer)) { // ¸üÐÂÂ¥²ãÐÅÏ¢ layer.setBottomHeight(updatedLayer.getBottomHeight()); layer.setTopHeight(updatedLayer.getTopHeight()); layer.setCompany(updatedLayer.getCompany()); // ¸üÐÂÊý¾Ý¿â if (updateLayerInDatabase(layer)) { // ¸üбí¸ñ updateTable(allLayers); } } } } private void deleteSelectedLayers() { int[] selectedRows = layerTable.getSelectedRows(); if (selectedRows.length == 0) { JOptionPane.showMessageDialog(this, getMessage("SELECT_LAYER_TO_DELETE"), getMessage("WARNING"), JOptionPane.WARNING_MESSAGE); return; } int confirm = JOptionPane.showConfirmDialog(this, getMessage("CONFIRM_DELETE") + " " + selectedRows.length + " " + getMessage("LAYERS") + "?", 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 = layerTable.convertRowIndexToModel(viewRow); String layerNumber = (String) tableModel.getValueAt(modelRow, 1); LayerManagement layer = findLayerByNumber(layerNumber); if (layer != null) { // ´ÓÊý¾Ý¿âɾ³ý if (deleteLayerFromDatabase(layer)) { // ´ÓÄÚ´æÊý¾Ýɾ³ý allLayers.remove(layer); } } } // ˢбí¸ñ updateTable(allLayers); } } private boolean validateInput(LayerManagement layer) { // ²ã±àºÅ²»ÄÜΪ¿Õ if (layer.getLayerNumber() == null || layer.getLayerNumber().trim().isEmpty()) { JOptionPane.showMessageDialog(this, getMessage("LAYER_NUMBER_REQUIRED"), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); return false; } // ²ãµ×¸ß²»ÄÜΪ¿ÕÇÒΪÊý×Ö try { Integer.parseInt(layer.getBottomHeight()); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(this, getMessage("BOTTOM_HEIGHT_NUMBER"), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); return false; } // ²ã¶¥¸ß²»ÄÜΪ¿ÕÇÒΪÊý×Ö try { Integer.parseInt(layer.getTopHeight()); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(this, getMessage("TOP_HEIGHT_NUMBER"), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); return false; } // ²ã¶¥¸ßÓ¦´óÓÚ²ãµ×¸ß int bottom = Integer.parseInt(layer.getBottomHeight()); int top = Integer.parseInt(layer.getTopHeight()); if (top <= bottom) { JOptionPane.showMessageDialog(this, getMessage("TOP_HEIGHT_GREATER"), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); return false; } return true; } private boolean isLayerNumberExists(String layerNumber) { for (LayerManagement layer : allLayers) { if (layer.getLayerNumber().equals(layerNumber)) { return true; } } return false; } private LayerManagement findLayerByNumber(String layerNumber) { for (LayerManagement layer : allLayers) { if (layer.getLayerNumber().equals(layerNumber)) { return layer; } } return null; } private boolean saveLayerToDatabase(LayerManagement layer) { try { Dell_LayerManagement.insertLayer(layer); 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 updateLayerInDatabase(LayerManagement layer) { try { Dell_LayerManagement.updateLayer(layer); JOptionPane.showMessageDialog(this, getMessage("UPDATE_SUCCESS"), getMessage("SUCCESS"), JOptionPane.INFORMATION_MESSAGE); return true; } catch (SQLException ex) { JOptionPane.showMessageDialog(this, getMessage("UPDATE_FAILED") + ": " + ex.getMessage(), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); return false; } } private boolean deleteLayerFromDatabase(LayerManagement layer) { String idStr = layer.getId(); // ¼ì²éIDÊÇ·ñÓÐЧ if (idStr == null || idStr.trim().isEmpty()) { JOptionPane.showMessageDialog(this, getMessage("INVALID_LAYER_ID"), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); return false; } try { int id = Integer.parseInt(idStr); Dell_LayerManagement.deleteLayer(id); JOptionPane.showMessageDialog(this, getMessage("DELETE_SUCCESS"), getMessage("SUCCESS"), JOptionPane.INFORMATION_MESSAGE); return true; } catch (NumberFormatException e) { JOptionPane.showMessageDialog(this, getMessage("INVALID_LAYER_ID") + ": " + idStr, getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); return false; } 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 LayerEditDialog extends JDialog { private static final long serialVersionUID = 1L; private JTextField numberField; private JTextField bottomHeightField; private JTextField topHeightField; private JComboBox companyComboBox; private boolean confirmed = false; public LayerEditDialog(Frame parent, ResourceBundle messages, boolean isAddDialog, LayerManagement existingLayer) { super(parent, isAddDialog ? getMessage("ADD_LAYER") : getMessage("EDIT_LAYER"), true); setLayout(new BorderLayout()); setSize(400, 200); setLocationRelativeTo(parent); JPanel formPanel = new JPanel(new GridLayout(4, 2, 5, 5)); formPanel.setBorder(new EmptyBorder(10, 10, 10, 10)); // ²ã±àºÅ JLabel numberLabel = new JLabel(getMessage("LAYER_NUMBER") + ": *"); numberField = new JTextField(); if (!isAddDialog && existingLayer != null) { numberField.setEditable(false); // ±à¼­Ä£Ê½Ï²»¿ÉÐÞ¸Ä } formPanel.add(numberLabel); formPanel.add(numberField); // ²ãµ×¸ß JLabel bottomLabel = new JLabel(getMessage("BOTTOM_HEIGHT") + " (cm): *"); bottomHeightField = new JTextField(); formPanel.add(bottomLabel); formPanel.add(bottomHeightField); // ²ã¶¥¸ß JLabel topLabel = new JLabel(getMessage("TOP_HEIGHT") + " (cm): *"); topHeightField = new JTextField(); formPanel.add(topLabel); formPanel.add(topHeightField); // ËùÊô¹«Ë¾ JLabel companyLabel = new JLabel(getMessage("COMPANY") + ": *"); companyComboBox = new JComboBox<>(); String[] companyNames = Dell_company.getAllCompanyNames(); for (String name : companyNames) { companyComboBox.addItem(name); } formPanel.add(companyLabel); formPanel.add(companyComboBox); // Èç¹ûÊDZ༭¶Ô»°¿ò£¬Ìî³äÏÖÓÐÊý¾Ý if (!isAddDialog && existingLayer != null) { numberField.setText(existingLayer.getLayerNumber()); bottomHeightField.setText(existingLayer.getBottomHeight()); topHeightField.setText(existingLayer.getTopHeight()); companyComboBox.setSelectedItem(existingLayer.getCompany()); } 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; dispose(); }); cancelButton.addActionListener(e -> dispose()); buttonPanel.add(okButton); buttonPanel.add(cancelButton); add(buttonPanel, BorderLayout.SOUTH); } public LayerManagement getLayer() { if (!confirmed) { return null; } LayerManagement layer = new LayerManagement(); layer.setLayerNumber(numberField.getText()); layer.setBottomHeight(bottomHeightField.getText()); layer.setTopHeight(topHeightField.getText()); layer.setCompany((String) companyComboBox.getSelectedItem()); // ÉèÖÃÌí¼Óʱ¼ä SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); layer.setAddTime(sdf.format(new Date())); return layer; } public boolean isConfirmed() { return confirmed; } } }