826220679@qq.com
昨天 1bda9524add969e315d870f284046ecf1097f956
src/dell_anchor/BaseStationManagementPanel.java
@@ -1,11 +1,13 @@
package dell_anchor;
import databases.DBConnector;
import dell_targets.Dell_BaseStation;
import publicsWay.ButtonUtils;
import publicsWay.TableUtils;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.SQLException;
import java.util.*;
import java.util.List;
@@ -26,49 +28,56 @@
        setLayout(new BorderLayout());
        setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        
        // 创建搜索面板
        JPanel searchPanel = new JPanel(new BorderLayout(5, 5));
        searchPanel.setBorder(BorderFactory.createTitledBorder(getMessage("SEARCH")));
        // 顶部操作面板
        JPanel topPanel = new JPanel(new BorderLayout(5, 5));
        topPanel.setBorder(BorderFactory.createTitledBorder(messages.getString("QUICK_OPERATION")));
        
        // 创建搜索组件
        // 搜索面板
        JPanel searchInputPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0));
        JLabel searchLabel = new JLabel(messages.getString("BASE_STATION_ID") + ":");
        searchField = new JTextField(15);
        JButton searchButton = new JButton(getMessage("SEARCH"));
        JButton refreshButton = new JButton(getMessage("REFRESH"));
        JButton addButton = new JButton(getMessage("ADD"));
        JButton editButton = new JButton(getMessage("EDIT"));
        JButton deleteButton = new JButton(getMessage("DELETE"));
        refreshButton.addActionListener(e -> loadBaseStationData());
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 5));
        buttonPanel.add(searchButton);
        buttonPanel.add(refreshButton);
        buttonPanel.add(addButton);
        buttonPanel.add(editButton);
        buttonPanel.add(deleteButton);
        searchPanel.add(searchField, BorderLayout.CENTER);
        searchPanel.add(buttonPanel, BorderLayout.EAST);
        
        // 添加按钮事件监听器
        addButton.addActionListener(e -> addNewBaseStation());
        editButton.addActionListener(e -> editSelectedBaseStation());
        deleteButton.addActionListener(e -> deleteSelectedBaseStations());
        searchButton.addActionListener(new SearchAction());
        // 使用ButtonUtils创建蓝色按钮
        JButton searchButton = ButtonUtils.createBlueButton(messages.getString("SEARCH"));
        JButton resetButton = ButtonUtils.createBlueButton(messages.getString("RESET"));
        JButton refreshButton = ButtonUtils.createBlueButton(messages.getString("REFRESH"));
        JButton addButton = ButtonUtils.createBlueButton(messages.getString("ADD"));
        JButton editButton = ButtonUtils.createBlueButton(messages.getString("EDIT"));
        JButton deleteButton = ButtonUtils.createBlueButton(messages.getString("DELETE"));
        searchInputPanel.add(searchLabel);
        searchInputPanel.add(searchField);
        searchInputPanel.add(searchButton);
        searchInputPanel.add(resetButton);
        searchInputPanel.add(refreshButton);
        // 操作按钮面板
        JPanel actionPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 0));
        actionPanel.add(addButton);
        actionPanel.add(editButton);
        actionPanel.add(deleteButton);
        // 将搜索面板和操作按钮面板放在一行
        JPanel rowPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 5));
        rowPanel.add(searchInputPanel);
        rowPanel.add(actionPanel);
        topPanel.add(rowPanel, BorderLayout.CENTER);
        // 创建表格列名
        String[] columnNames = {
            getMessage("INDEX"),
            getMessage("BASE_STATION_ID"),
            getMessage("BASE_STATION_STATUS"),
            getMessage("X_COORD"),
            getMessage("Y_COORD"),
            getMessage("Z_COORD"),
            getMessage("LAYER"),
            getMessage("GROUP"),
            getMessage("PORT"),
            getMessage("FIRMWARE_VERSION"),
            getMessage("ONLINE_TIME"),
            getMessage("COMPANY")
            messages.getString("INDEX"),
            messages.getString("BASE_STATION_ID"),
            messages.getString("BASE_STATION_STATUS"),
            messages.getString("X_COORD"),
            messages.getString("Y_COORD"),
            messages.getString("Z_COORD"),
            messages.getString("LAYER"),
            messages.getString("GROUP"),
            messages.getString("PORT"),
            messages.getString("FIRMWARE_VERSION"),
            messages.getString("ONLINE_TIME"),
            messages.getString("COMPANY")
        };
        
        // 创建表格模型
@@ -79,14 +88,16 @@
            }
        };
        
        // 创建表格
        // 创建表格 - 使用TableUtils中的方法
        baseStationTable = new JTable(tableModel);
        TableUtils.setupTableStyle(baseStationTable);
        TableUtils.setupTableHeaderStyle(baseStationTable);
        baseStationTable.setAutoCreateRowSorter(true);
        baseStationTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        
        // 设置列宽
        TableColumnModel columnModel = baseStationTable.getColumnModel();
        columnModel.getColumn(0).setPreferredWidth(30);  // 序号
        columnModel.getColumn(0).setPreferredWidth(30);  // 索引
        columnModel.getColumn(1).setPreferredWidth(100); // 基站编号
        columnModel.getColumn(2).setPreferredWidth(70);  // ״̬
        columnModel.getColumn(3).setPreferredWidth(70);  // X坐标
@@ -99,31 +110,30 @@
        columnModel.getColumn(10).setPreferredWidth(120); // 上线时间
        columnModel.getColumn(11).setPreferredWidth(100); // 所属公司
        
        // 设置表头样式
        JTableHeader header = baseStationTable.getTableHeader();
        // 设置表头左对齐
        header.setDefaultRenderer(new DefaultTableCellRenderer() {
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value,
                    boolean isSelected, boolean hasFocus, int row, int column) {
                super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                setHorizontalAlignment(SwingConstants.LEFT);
                setBackground(Color.GRAY);
                setForeground(Color.WHITE);
                setFont(getFont().deriveFont(Font.BOLD));
                return this;
            }
        });
        // 应用单元格渲染器到所有列 - 使用TableUtils中的方法
        DefaultTableCellRenderer cellRenderer = TableUtils.createCenteredCellRenderer();
        for (int i = 0; i < baseStationTable.getColumnCount(); i++) {
            baseStationTable.getColumnModel().getColumn(i).setCellRenderer(cellRenderer);
        }
        
        JScrollPane scrollPane = new JScrollPane(baseStationTable);
        scrollPane.setPreferredSize(new Dimension(1200, 500));
        scrollPane.setBorder(BorderFactory.createEmptyBorder()); // 移除滚动面板边框
        
        // 添加组件
        add(searchPanel, BorderLayout.NORTH);
        add(topPanel, BorderLayout.NORTH);
        add(scrollPane, BorderLayout.CENTER);
        
        // 加载数据
        loadBaseStationData();
        // 添加事件监听器
        searchButton.addActionListener(e -> searchBaseStations());
        resetButton.addActionListener(e -> resetSearch());
        refreshButton.addActionListener(e -> loadBaseStationData());
        addButton.addActionListener(e -> addNewBaseStation());
        editButton.addActionListener(e -> editSelectedBaseStation());
        deleteButton.addActionListener(e -> deleteSelectedBaseStations());
    }
    
    private void loadBaseStationData() {
@@ -161,6 +171,36 @@
                bs.getCompany()
            });
        }
    }
    // 搜索基站
    private void searchBaseStations() {
        String keyword = searchField.getText().trim();
        if (keyword.isEmpty()) {
            updateTable(allBaseStations);
            return;
        }
        List<LocationBaseStation> filtered = new ArrayList<>();
        for (LocationBaseStation bs : allBaseStations) {
            if ((bs.getCode() != null && bs.getCode().toLowerCase().contains(keyword.toLowerCase())) ||
                (bs.getCompany() != null && bs.getCompany().toLowerCase().contains(keyword.toLowerCase()))) {
                filtered.add(bs);
            }
        }
        if (filtered.isEmpty()) {
            JOptionPane.showMessageDialog(this, getMessage("SEARCH_NO_RESULTS"),
                    getMessage("INFO"), JOptionPane.INFORMATION_MESSAGE);
        }
        updateTable(filtered);
    }
    // 重置搜索
    private void resetSearch() {
        searchField.setText("");
        updateTable(allBaseStations);
    }
    
    // 添加新基站
@@ -270,7 +310,7 @@
            return false;
        }
        
        // HEX格式验证(0-9, A-F)
        // HEX格式验证(0-9, A-F)
        if (!Pattern.matches("[0-9A-Fa-f]+", bs.getCode())) {
            JOptionPane.showMessageDialog(this, getMessage("INVALID_HEX_FORMAT"),
                                        getMessage("ERROR"), JOptionPane.ERROR_MESSAGE);
@@ -444,32 +484,6 @@
        return result > 0;
    }
    
    // 搜索功能
    private class SearchAction implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            String keyword = searchField.getText().trim();
            if (keyword.isEmpty()) {
                updateTable(allBaseStations);
                return;
            }
            List<LocationBaseStation> filteredList = new ArrayList<>();
            for (LocationBaseStation bs : allBaseStations) {
                if (matchesKeyword(bs, keyword)) {
                    filteredList.add(bs);
                }
            }
            updateTable(filteredList);
        }
        private boolean matchesKeyword(LocationBaseStation bs, String keyword) {
            return (bs.getCode() != null && bs.getCode().contains(keyword)) ||
                   (bs.getCompany() != null && bs.getCompany().contains(keyword));
        }
    }
    private String getMessage(String key) {
        try {
            return messages.getString(key);
@@ -578,8 +592,8 @@
        // 按钮面板
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        JButton okButton = new JButton(messages.getString("OK"));
        JButton cancelButton = new JButton(messages.getString("CANCEL"));
        JButton okButton = ButtonUtils.createBlueButton(messages.getString("OK"));
        JButton cancelButton = ButtonUtils.createBlueButton(messages.getString("CANCEL"));
        okButton.addActionListener(e -> {
            confirmed = true;