From 8d662de2fd262b3a485f16e197cb4d0ca2a61cdf Mon Sep 17 00:00:00 2001
From: zsh_root <979909237@qq.com>
Date: 星期三, 10 十二月 2025 17:03:47 +0800
Subject: [PATCH] 发布版V1.0

---
 src/home/NetworkConfigPanel.java | 1181 +++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 983 insertions(+), 198 deletions(-)

diff --git a/src/home/NetworkConfigPanel.java b/src/home/NetworkConfigPanel.java
index ef594fd..65fe4dd 100644
--- a/src/home/NetworkConfigPanel.java
+++ b/src/home/NetworkConfigPanel.java
@@ -1,304 +1,1087 @@
 package home;
 
+import jiexi.*;
+
 import javax.swing.*;
 import java.awt.*;
+import java.net.*;
+import java.io.IOException;
+import java.util.Vector;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
 
 public class NetworkConfigPanel extends JPanel {
+    // 鍩虹璁剧疆闈㈡澘缁勪欢
+    private JComboBox<String> ipTypeComboBox;
+    private JTextField staticIpField;
+    private JTextField subnetMaskField;
+    private JTextField gatewayField;
+    private JTextField dnsServerField;
+    private JTextField macAddressField;
+    private JTextField timeoutRestartField;
+    private JTextField httpServerPortField;
+    private JTextField usernameField;
+    private JTextField passwordField;
+    private JTextField deviceNameField;
+
+    // 閫夐」澶嶉�夋
+    private JCheckBox indexCheckBox;
+    private JCheckBox resetCheckBox;
+    private JCheckBox linkCheckBox;
+    private JCheckBox rfc2217CheckBox;
+    private JCheckBox cacheClearCheckBox;
+    private JCheckBox serialSettingsCheckBox;
+
+    // 绔彛璁剧疆闈㈡澘缁勪欢
+    private JComboBox<String> workModeComboBox;
+    private JTextField targetUrlField;
+    private JTextField shortConnectionTimeField;
+    private JComboBox<String> baudRateComboBox;
+    private JTextField localPortField;
+    private JTextField remotePortField;
+    private JComboBox<String> tcpClientCountComboBox;
+    private JCheckBox enableShortConnectionCheckBox;
+
+    // 涓插彛鍙傛暟缁勪欢
+    private JComboBox<String> parityComboBox;
+    private JComboBox<String> dataBitsComboBox;
+    private JComboBox<String> stopBitsComboBox;
+
     private static final long serialVersionUID = 1L;
     private MainFrame mainFrame;
-    private JComboBox<String> protocolCombo;
-    private JTextField addressField, portField;
-    private JButton openBtn, searchBtn;
-    private JLabel protocolLabel, addressLabel, portLabel;
+    private JButton readBtn, searchBtn, saveBtn;
     private JTable deviceTable;
     private JPanel basicSettingsPanel, portSettingsPanel;
+
+    // 鏂板锛氭爣绛惧紩鐢ㄧ敤浜庤瑷�鍒囨崲
+    private JLabel deviceListLabel;
     
+    // 淇濆瓨鎵�鏈夊弬鏁拌鐨勬爣绛惧紩鐢紝鐢ㄤ簬璇█鍒囨崲
+    private Map<String, JLabel> parameterLabels = new HashMap<>();
+    private JLabel optionsLabel;
+    private JLabel parityDataStopLabel;
+
+    // 鍦ㄧ被鍙橀噺鍖哄煙娣诲姞
+    private DeviceConfig currentDeviceConfig;
+
     public NetworkConfigPanel(MainFrame mainFrame) {
         this.mainFrame = mainFrame;
         initializeUI();
     }
-    
+
     private void initializeUI() {
         setLayout(new BorderLayout());
-        
-        // 控制面板
+        // 鎺у埗闈㈡澘
         add(createControlPanel(), BorderLayout.NORTH);
-        
-        // 设备表格和配置面板
+        // 璁惧琛ㄦ牸鍜岄厤缃潰鏉�
         JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
         splitPane.setLeftComponent(createDeviceTablePanel());
         splitPane.setRightComponent(createConfigPanel());
         splitPane.setDividerLocation(400);
-        
         add(splitPane, BorderLayout.CENTER);
     }
-    
+
     private JPanel createControlPanel() {
         JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 5));
-        
-        protocolLabel = new JLabel(getString("protocol.type"));
-        panel.add(protocolLabel);
-        
-        protocolCombo = new JComboBox<>(new String[]{"UDP", "TCP"});
-        protocolCombo.setPreferredSize(new Dimension(150, 25));
-        panel.add(protocolCombo);
-        
-        addressLabel = new JLabel(getString("local.host.address"));
-        panel.add(addressLabel);
-        
-        addressField = new JTextField();
-        addressField.setPreferredSize(new Dimension(150, 25));
-        panel.add(addressField);
-        
-        portLabel = new JLabel(getString("local.host.port"));
-        panel.add(portLabel);
-        
-        portField = new JTextField();
-        portField.setPreferredSize(new Dimension(150, 25));
-        panel.add(portField);
-        
-        // 使用ButtonUtils获取统一样式的按钮
-        openBtn = ButtonUtils.createBlueButton(getString("open"));
         searchBtn = ButtonUtils.createBlueButton(getString("search.devices"));
-        
-        panel.add(openBtn);
+        readBtn = ButtonUtils.createBlueButton(getString("read.parameters"));
+        saveBtn = ButtonUtils.createBlueButton(getString("save.parameters")); // 鏂板淇濆瓨鎸夐挳
+
+        // 娣诲姞鎸夐挳鐨勭偣鍑讳簨浠剁洃鍚櫒
+        searchBtn.addActionListener(e -> searchDevices());
+        readBtn.addActionListener(e -> readDevices());
+        saveBtn.addActionListener(e -> saveDeviceConfig()); // 鏂板淇濆瓨浜嬩欢
+
         panel.add(searchBtn);
-        
+        panel.add(readBtn);
+        panel.add(saveBtn); // 娣诲姞鍒伴潰鏉�
+
         return panel;
     }
-    
+
+    private void readDevices() {
+        // 鑾峰彇閫変腑鐨勮澶�
+        int selectedRow = deviceTable.getSelectedRow();
+        if (selectedRow == -1) {
+            JOptionPane.showMessageDialog(this,
+                    getString("please.select.device"),
+                    getString("prompt"),
+                    JOptionPane.WARNING_MESSAGE);
+            return;
+        }
+
+        // 妫�鏌ユ槸鍚﹀彧閫変腑浜嗕竴涓澶�
+        int[] selectedRows = deviceTable.getSelectedRows();
+        if (selectedRows.length > 1) {
+            JOptionPane.showMessageDialog(this,
+                    getString("select.one.device"),
+                    getString("prompt"),
+                    JOptionPane.WARNING_MESSAGE);
+            return;
+        }
+
+        // 鑾峰彇閫変腑璁惧鐨処P鍜孧AC鍦板潃
+        String deviceIp = (String) deviceTable.getValueAt(selectedRow, 1); // 绗簩鍒楁槸IP鍦板潃
+        String deviceMac = (String) deviceTable.getValueAt(selectedRow, 3); // 绗洓鍒楁槸MAC鍦板潃
+
+        // 鍦ㄦ柊绾跨▼涓墽琛孶DP璇诲彇鎿嶄綔
+        new Thread(() -> {
+            DatagramSocket socket = null;
+            try {
+                // 鍒涘缓UDP Socket
+                socket = new DatagramSocket();
+                socket.setSoTimeout(5000); // 璁剧疆5绉掕秴鏃�
+                // 鍑嗗璇诲彇閰嶇疆鐨勬暟鎹�
+                byte[] sendData = DellS2.reads2peizhi((byte) 0x03, deviceMac);
+                // 鍒涘缓鐩爣鍦板潃锛氶�変腑璁惧鐨処P锛岀鍙�1500
+                InetAddress deviceAddress = InetAddress.getByName(deviceIp);
+                int port = 1500;
+                // 鍒涘缓鏁版嵁鍖�
+                DatagramPacket packet = new DatagramPacket(sendData, sendData.length, deviceAddress, port);
+                // 鍙戦�佽鍙栬姹�
+                socket.send(packet);
+                // 鍑嗗鎺ユ敹鍝嶅簲
+                byte[] receiveData = new byte[1024];
+                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
+                // 鎺ユ敹鍝嶅簲
+                socket.receive(receivePacket);
+                // 澶勭悊鍝嶅簲鏁版嵁
+                processReadResponse(receivePacket, deviceIp, deviceMac);
+            } catch (SocketTimeoutException e) {
+                SwingUtilities.invokeLater(() -> {
+                    JOptionPane.showMessageDialog(this,
+                            getString("read.timeout"),
+                            getString("error"),
+                            JOptionPane.ERROR_MESSAGE);
+                });
+            } catch (UnknownHostException e) {
+                SwingUtilities.invokeLater(() -> {
+                    JOptionPane.showMessageDialog(this,
+                            getString("invalid.ip.address") + ": " + deviceIp,
+                            getString("error"),
+                            JOptionPane.ERROR_MESSAGE);
+                });
+            } catch (IOException e) {
+                SwingUtilities.invokeLater(() -> {
+                    JOptionPane.showMessageDialog(this,
+                            getString("read.device.error") + ": " + e.getMessage(),
+                            getString("error"),
+                            JOptionPane.ERROR_MESSAGE);
+                });
+                e.printStackTrace();
+            } finally {
+                // 鍏抽棴socket
+                if (socket != null && !socket.isClosed()) {
+                    socket.close();
+                }
+            }
+        }).start();
+    }
+
+    /**
+     * 澶勭悊璇诲彇閰嶇疆鐨勫搷搴旀暟鎹�
+     */
+    private void processReadResponse(DatagramPacket packet, String deviceIp, String deviceMac) {
+        // 鑾峰彇鍝嶅簲鏁版嵁
+        byte[] responseData = packet.getData();
+        int dataLength = packet.getLength();
+
+        // 灏嗗瓧鑺傛暟鎹浆鎹负鍗佸叚杩涘埗瀛楃涓�
+        String hexData = bytesToHex(responseData, dataLength);
+
+        // 鎵撳嵃鍒版帶鍒跺彴
+        System.out.println(hexData);
+        DeviceConfig deviceConfig = DeviceConfigParser.parseDeviceConfig(hexData);
+
+        // 淇濆瓨褰撳墠璁惧閰嶇疆
+        this.currentDeviceConfig = deviceConfig;
+
+        // 灏嗚В鏋愮殑閰嶇疆鏁版嵁搴旂敤鍒癠I缁勪欢
+        updateUIWithDeviceConfig(deviceConfig);
+
+        // 鍦║I绾跨▼涓樉绀烘垚鍔熸秷鎭�
+        SwingUtilities.invokeLater(() -> {
+            JOptionPane.showMessageDialog(this,
+                    getString("read.success") + "\nIP: " + deviceIp + "\nMAC: " + deviceMac,
+                    getString("success"),
+                    JOptionPane.INFORMATION_MESSAGE);
+        });
+    }
+
+    /**
+     * 淇濆瓨璁惧閰嶇疆 - 灏哢I閰嶇疆璧嬪�煎洖DeviceConfig瀵硅薄骞堕�氳繃UDP骞挎挱鍙戦��
+     */
+    private void saveDeviceConfig() {
+        if (currentDeviceConfig == null) {
+            JOptionPane.showMessageDialog(this,
+                    getString("read.parameters.first"),
+                    getString("prompt"),
+                    JOptionPane.WARNING_MESSAGE);
+            return;
+        }
+
+        try {
+            // 浠嶶I鏇存柊鍩虹璁剧疆鍒癉eviceConfig
+            updateDeviceConfigFromBasicSettings();
+
+            // 浠嶶I鏇存柊绔彛璁剧疆鍒癉eviceConfig
+            updateDeviceConfigFromPortSettings();
+
+            String mac = currentDeviceConfig.getMacAddress().replaceAll(":", "");
+            byte[] bytes = DellS2.alert_s2(currentDeviceConfig.getStaticIp(), currentDeviceConfig.getGatewayIp(),
+                    currentDeviceConfig.getSubnetMask(), currentDeviceConfig.getModuleName(), mac);
+            byte[] bytes1 = DellS2.alert_s2_chuankou(currentDeviceConfig.getTargetUrl(), mac,
+                    "0" + currentDeviceConfig.getWorkMode(), currentDeviceConfig.getRemotePort() + "",
+                    currentDeviceConfig.getBaudRate() + "");
+            byte[] bytes2 = DellS2.reads2peizhi((byte) 0x02, mac);
+            // 鍦ㄦ柊绾跨▼涓墽琛孶DP鍙戦�佹搷浣�
+            new Thread(() -> {
+                DatagramSocket socket = null;
+                try {
+                    // 鍒涘缓UDP Socket
+                    socket = new DatagramSocket();
+                    socket.setBroadcast(true);
+
+                    // 鍒涘缓骞挎挱鍦板潃锛�255.255.255.255锛岀鍙�1500
+                    InetAddress broadcastAddress = InetAddress.getByName("255.255.255.255");
+                    int port = 1500;
+
+                    // 鍙戦�佺涓�涓暟鎹寘 (bytes)
+                    if (bytes != null && bytes.length > 0) {
+                        DatagramPacket packet1 = new DatagramPacket(bytes, bytes.length, broadcastAddress, port);
+                        socket.send(packet1);
+                    }
+
+                    if (bytes1 != null && bytes1.length > 0) {
+                        DatagramPacket packet2 = new DatagramPacket(bytes1, bytes1.length, broadcastAddress, port);
+                        socket.send(packet2);
+                    }
+
+                    if (bytes2 != null && bytes2.length > 0) {
+                        DatagramPacket packet3 = new DatagramPacket(bytes2, bytes2.length, broadcastAddress, port);
+                        socket.send(packet3);
+                    }
+
+                    SwingUtilities.invokeLater(() -> {
+                        JOptionPane.showMessageDialog(this,
+                                getString("save.success"),
+                                getString("success"),
+                                JOptionPane.INFORMATION_MESSAGE);
+                    });
+
+                } catch (SocketException e) {
+                    SwingUtilities.invokeLater(() -> {
+                        JOptionPane.showMessageDialog(this,
+                                getString("udp.socket.failed") + ": " + e.getMessage(),
+                                getString("error"),
+                                JOptionPane.ERROR_MESSAGE);
+                    });
+                } catch (UnknownHostException e) {
+                    SwingUtilities.invokeLater(() -> {
+                        JOptionPane.showMessageDialog(this,
+                                getString("invalid.broadcast.address"),
+                                getString("error"),
+                                JOptionPane.ERROR_MESSAGE);
+                    });
+                } catch (IOException e) {
+                    SwingUtilities.invokeLater(() -> {
+                        JOptionPane.showMessageDialog(this,
+                                getString("send.udp.failed") + ": " + e.getMessage(),
+                                getString("error"),
+                                JOptionPane.ERROR_MESSAGE);
+                    });
+                } finally {
+                    // 鍏抽棴socket
+                    if (socket != null && !socket.isClosed()) {
+                        socket.close();
+                    }
+                }
+            }).start();
+
+        } catch (Exception e) {
+            JOptionPane.showMessageDialog(this,
+                    getString("save.config.error") + ": " + e.getMessage(),
+                    getString("error"),
+                    JOptionPane.ERROR_MESSAGE);
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 浠庡熀纭�璁剧疆UI鏇存柊DeviceConfig
+     */
+    private void updateDeviceConfigFromBasicSettings() {
+        // IP鍦板潃绫诲瀷
+        currentDeviceConfig.setIpType(ipTypeComboBox.getSelectedIndex());
+
+        // 缃戠粶閰嶇疆
+        currentDeviceConfig.setStaticIp(staticIpField.getText().trim());
+        currentDeviceConfig.setSubnetMask(subnetMaskField.getText().trim());
+        currentDeviceConfig.setGatewayIp(gatewayField.getText().trim());
+        currentDeviceConfig.setDnsServer(dnsServerField.getText().trim());
+        currentDeviceConfig.setMacAddress(macAddressField.getText().trim());
+
+        // 璁惧淇℃伅
+        currentDeviceConfig.setModuleName(deviceNameField.getText().trim());
+        currentDeviceConfig.setUsername(usernameField.getText().trim());
+        currentDeviceConfig.setPassword(passwordField.getText().trim());
+
+        // 鏁板瓧瀛楁闇�瑕佽浆鎹�
+        try {
+            if (!httpServerPortField.getText().trim().isEmpty()) {
+                currentDeviceConfig.setHttpServerPort(Integer.parseInt(httpServerPortField.getText().trim()));
+            }
+            if (!timeoutRestartField.getText().trim().isEmpty()) {
+                currentDeviceConfig.setTimeoutRestart(Integer.parseInt(timeoutRestartField.getText().trim()));
+            }
+        } catch (NumberFormatException e) {
+            throw new RuntimeException(getString("port.timeout.format.error"), e);
+        }
+
+        // 鍔熻兘閫夐」
+        currentDeviceConfig.setIndex(indexCheckBox.isSelected());
+        currentDeviceConfig.setReset(resetCheckBox.isSelected());
+        currentDeviceConfig.setLink(linkCheckBox.isSelected());
+        currentDeviceConfig.setRfc2217(rfc2217CheckBox.isSelected());
+        currentDeviceConfig.setCacheClear(cacheClearCheckBox.isSelected());
+    }
+
+    /**
+     * 浠庣鍙h缃甎I鏇存柊DeviceConfig
+     */
+    private void updateDeviceConfigFromPortSettings() {
+        // 涓插彛閰嶇疆
+        try {
+            if (baudRateComboBox.getSelectedItem() != null) {
+                currentDeviceConfig.setBaudRate(Integer.parseInt(baudRateComboBox.getSelectedItem().toString()));
+            }
+
+            // 鏁版嵁浣嶃�佹牎楠屼綅銆佸仠姝綅闇�瑕佹牴鎹弿杩板弽鍚戞槧灏勫埌鏁板��
+            currentDeviceConfig.setDataBitsDesc(dataBitsComboBox.getSelectedItem().toString());
+            currentDeviceConfig.setParityDesc(parityComboBox.getSelectedItem().toString());
+            currentDeviceConfig.setStopBitsDesc(stopBitsComboBox.getSelectedItem().toString());
+
+        } catch (NumberFormatException e) {
+            throw new RuntimeException(getString("baudrate.format.error"), e);
+        }
+
+        // 閫氫俊閰嶇疆
+        currentDeviceConfig.setWorkModeDesc(workModeComboBox.getSelectedItem().toString());
+        currentDeviceConfig.setTargetUrl(targetUrlField.getText().trim());
+
+        // 鏁板瓧瀛楁闇�瑕佽浆鎹�
+        try {
+            if (!shortConnectionTimeField.getText().trim().isEmpty()) {
+                currentDeviceConfig.setShortConnectionTime(Integer.parseInt(shortConnectionTimeField.getText().trim()));
+            }
+            if (!localPortField.getText().trim().isEmpty()) {
+                currentDeviceConfig.setLocalPort(Integer.parseInt(localPortField.getText().trim()));
+            }
+            if (!remotePortField.getText().trim().isEmpty()) {
+                currentDeviceConfig.setRemotePort(Integer.parseInt(remotePortField.getText().trim()));
+            }
+            if (tcpClientCountComboBox.getSelectedItem() != null) {
+                currentDeviceConfig.setTcpClientCount(Integer.parseInt(tcpClientCountComboBox.getSelectedItem().toString()));
+            }
+        } catch (NumberFormatException e) {
+            throw new RuntimeException(getString("port.time.format.error"), e);
+        }
+
+        // 杩炴帴绫诲瀷
+        currentDeviceConfig.setConnectionType(enableShortConnectionCheckBox.isSelected() ? 0 : 1);
+    }
+
+    /**
+     * 灏咲eviceConfig閰嶇疆鏁版嵁搴旂敤鍒癠I缁勪欢
+     */
+    public void updateUIWithDeviceConfig(DeviceConfig config) {
+        if (config == null) return;
+
+        // 鍦‥DT绾跨▼涓洿鏂癠I
+        SwingUtilities.invokeLater(() -> {
+            try {
+                // 鏇存柊鍩虹璁剧疆闈㈡澘
+                updateBasicSettings(config);
+                // 鏇存柊绔彛璁剧疆闈㈡澘
+                updatePortSettings(config);
+            } catch (Exception e) {
+                System.err.println(getString("update.ui.error") + ": " + e.getMessage());
+                e.printStackTrace();
+            }
+        });
+    }
+
+    private void updateBasicSettings(DeviceConfig config) {
+        // IP鍦板潃绫诲瀷
+        if (ipTypeComboBox != null) {
+            ipTypeComboBox.setSelectedIndex(config.getIpType());
+        }
+
+        // 缃戠粶閰嶇疆
+        setTextFieldText(staticIpField, config.getStaticIp());
+        setTextFieldText(subnetMaskField, config.getSubnetMask());
+        setTextFieldText(gatewayField, config.getGatewayIp());
+        setTextFieldText(dnsServerField, config.getDnsServer());
+        setTextFieldText(macAddressField, config.getMacAddress());
+
+        // 璁惧淇℃伅
+        setTextFieldText(deviceNameField, config.getModuleName());
+        setTextFieldText(usernameField, config.getUsername());
+        setTextFieldText(passwordField, config.getPassword());
+        setTextFieldText(httpServerPortField, String.valueOf(config.getHttpServerPort()));
+        setTextFieldText(timeoutRestartField, String.valueOf(config.getTimeoutRestart()));
+
+        // 鍔熻兘閫夐」
+        setCheckBoxSelected(indexCheckBox, config.isIndex());
+        setCheckBoxSelected(resetCheckBox, config.isReset());
+        setCheckBoxSelected(linkCheckBox, config.isLink());
+        setCheckBoxSelected(rfc2217CheckBox, config.isRfc2217());
+        setCheckBoxSelected(cacheClearCheckBox, config.isCacheClear());
+    }
+
+    private void updatePortSettings(DeviceConfig config) {
+        // 涓插彛閰嶇疆
+        setComboBoxSelectedItem(baudRateComboBox, String.valueOf(config.getBaudRate()));
+        setComboBoxSelectedItem(dataBitsComboBox, config.getDataBitsDesc());
+        setComboBoxSelectedItem(parityComboBox, config.getParityDesc());
+        setComboBoxSelectedItem(stopBitsComboBox, config.getStopBitsDesc());
+
+        // 閫氫俊閰嶇疆
+        setComboBoxSelectedItem(workModeComboBox, config.getWorkModeDesc());
+        setTextFieldText(targetUrlField, config.getTargetUrl());
+        setTextFieldText(shortConnectionTimeField, String.valueOf(config.getShortConnectionTime()));
+        setTextFieldText(localPortField, String.valueOf(config.getLocalPort()));
+        setTextFieldText(remotePortField, String.valueOf(config.getRemotePort()));
+        setComboBoxSelectedItem(tcpClientCountComboBox, String.valueOf(config.getTcpClientCount()));
+
+        // 杩炴帴绫诲瀷
+        setCheckBoxSelected(enableShortConnectionCheckBox, config.getConnectionType() == 0);
+    }
+
+    // 杈呭姪鏂规硶
+    private void setTextFieldText(JTextField field, String text) {
+        if (field != null && text != null) {
+            field.setText(text);
+        }
+    }
+
+    private void setCheckBoxSelected(JCheckBox checkBox, boolean selected) {
+        if (checkBox != null) {
+            checkBox.setSelected(selected);
+        }
+    }
+
+    private void setComboBoxSelectedItem(JComboBox<String> comboBox, String item) {
+        if (comboBox != null && item != null) {
+            comboBox.setSelectedItem(item);
+        }
+    }
+
+    /**
+     * 鎼滅储璁惧 - 鍙戦�乁DP骞挎挱鏁版嵁骞剁洃鍚繑鍥�
+     */
+    private void searchDevices() {
+        new Thread(() -> {
+            DatagramSocket socket = null;
+            try {
+                // 鍒涘缓UDP Socket
+                socket = new DatagramSocket();
+                socket.setBroadcast(true);
+                // 璁剧疆鎺ユ敹瓒呮椂鏃堕棿涓�5绉�
+                socket.setSoTimeout(5000);
+                // 鍑嗗瑕佸彂閫佺殑鏁版嵁锛欶F 01 01 02 (鍗佸叚杩涘埗瀛楄妭)
+                byte[] sendData = DellS2.serch();
+                // 鍒涘缓骞挎挱鍦板潃锛�255.255.255.255锛岀鍙�1500
+                InetAddress broadcastAddress = InetAddress.getByName("255.255.255.255");
+                int port = 1500;
+                DellS2.getRow().removeAllElements();
+                prepareSearch();
+                // 鍒涘缓鏁版嵁鍖�
+                DatagramPacket packet = new DatagramPacket(sendData, sendData.length, broadcastAddress, port);
+                // 鍙戦�佹暟鎹寘
+                socket.send(packet);
+                // 鐩戝惉璁惧鍝嶅簲
+                listenForDeviceResponses(socket);
+            } catch (SocketException e) {
+                e.printStackTrace();
+            } catch (UnknownHostException e) {
+                e.printStackTrace();
+            } catch (IOException e) {
+                // 濡傛灉鏄秴鏃跺紓甯革紝灞炰簬姝e父鎯呭喌
+                if (e instanceof SocketTimeoutException) {
+                    System.out.println(getString("listen.timeout"));
+                    SwingUtilities.invokeLater(() -> {
+                        JOptionPane.showMessageDialog(this,
+                                getString("search.complete.timeout"),
+                                getString("search.complete"),
+                                JOptionPane.INFORMATION_MESSAGE);
+                    });
+                } else {
+                    SwingUtilities.invokeLater(() -> {
+                        JOptionPane.showMessageDialog(this,
+                                getString("send.receive.udp.failed") + ": " + e.getMessage(),
+                                getString("error"),
+                                JOptionPane.ERROR_MESSAGE);
+                    });
+                    e.printStackTrace();
+                }
+            } finally {
+                // 鍏抽棴socket
+                if (socket != null && !socket.isClosed()) {
+                    socket.close();
+                }
+            }
+        }).start();
+    }
+
+    /**
+     * 鐩戝惉璁惧鍝嶅簲
+     */
+    private void listenForDeviceResponses(DatagramSocket socket) {
+        try {
+            int responseCount = 0;
+            long startTime = System.currentTimeMillis();
+            long timeout = 5000; // 5绉掕秴鏃�
+
+            // 鎸佺画鐩戝惉鐩村埌瓒呮椂
+            while (System.currentTimeMillis() - startTime < timeout) {
+                try {
+                    // 鍑嗗鎺ユ敹缂撳啿鍖�
+                    byte[] receiveData = new byte[1024];
+                    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
+
+                    // 璁剧疆鍓╀綑瓒呮椂鏃堕棿
+                    long remainingTime = timeout - (System.currentTimeMillis() - startTime);
+                    if (remainingTime <= 0) break;
+
+                    socket.setSoTimeout((int) remainingTime);
+
+                    // 鎺ユ敹鏁版嵁
+                    socket.receive(receivePacket);
+                    responseCount++;
+
+                    // 澶勭悊鎺ユ敹鍒扮殑鏁版嵁
+                    processDeviceResponse(receivePacket, responseCount);
+
+                } catch (SocketTimeoutException e) {
+                    // 瓒呮椂缁х画寰幆锛屾鏌ユ�昏秴鏃�
+                    continue;
+                }
+            }
+            System.out.println(getString("search.complete.responses") + " " + responseCount + " " + getString("devices.found"));
+
+        } catch (IOException e) {
+            System.err.println(getString("listen.device.error") + ": " + e.getMessage());
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 澶勭悊璁惧鍝嶅簲鏁版嵁
+     */
+    private void processDeviceResponse(DatagramPacket packet, int responseNumber) {
+        // 鑾峰彇鍝嶅簲鏁版嵁
+        byte[] responseData = packet.getData();
+        int dataLength = packet.getLength();
+
+        // 灏嗗瓧鑺傛暟鎹浆鎹负鍗佸叚杩涘埗瀛楃涓�
+        String hexData = bytesToHex(responseData, dataLength);
+        DellS2.serch_fanhui(hexData);
+
+        // 鍦║I绾跨▼涓洿鏂拌澶囪〃鏍�
+        SwingUtilities.invokeLater(() -> {
+            Vector<S2data> row = DellS2.getRow();
+            for (S2data s2data : row) {
+                addDeviceToTable(s2data);
+            }
+        });
+    }
+
+    /**
+     * 灏嗗瓧鑺傛暟缁勮浆鎹负鍗佸叚杩涘埗瀛楃涓�
+     */
+    private String bytesToHex(byte[] bytes, int length) {
+        StringBuilder hexString = new StringBuilder();
+        for (int i = 0; i < length; i++) {
+            String hex = Integer.toHexString(bytes[i] & 0xFF);
+            if (hex.length() == 1) {
+                hexString.append('0');
+            }
+            hexString.append(hex.toUpperCase());
+        }
+        return hexString.toString();
+    }
+
     private JPanel createDeviceTablePanel() {
         JPanel panel = new JPanel(new BorderLayout());
-        panel.setBorder(BorderFactory.createTitledBorder(getString("device.list")));
-        
+        deviceListLabel = new JLabel(getString("device.list"));
+        panel.setBorder(BorderFactory.createTitledBorder(deviceListLabel.getText()));
+
         String[] columnNames = {
-            getString("select"),
-            getString("device.ip"),
-            getString("device.name"),
-            getString("mac.address"),
-            getString("version")
+                getString("select"),
+                getString("device.ip"),
+                getString("device.name"),
+                getString("mac.address"),
+                getString("version")
         };
-        
-        Object[][] data = {}; // 空数据,实际使用时动态填充
-        deviceTable = new JTable(data, columnNames);
+
+        // 鏄惧紡浣跨敤 DefaultTableModel
+        javax.swing.table.DefaultTableModel model = new javax.swing.table.DefaultTableModel(columnNames, 0) {
+            @Override
+            public Class<?> getColumnClass(int columnIndex) {
+                // 绗竴鍒楁槸Boolean绫诲瀷锛堥�夋嫨妗嗭級
+                if (columnIndex == 0) {
+                    return Boolean.class;
+                }
+                return String.class;
+            }
+
+            @Override
+            public boolean isCellEditable(int row, int column) {
+                // 鍙湁绗竴鍒楋紙閫夋嫨妗嗭級鍙紪杈�
+                return column == 0;
+            }
+        };
+
+        deviceTable = new JTable(model);
+
+        // 璁剧疆閫夋嫨妯″紡涓哄崟閫�
+        deviceTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+
+        // 娣诲姞閫夋嫨鐩戝惉鍣紝纭繚鍙兘閫夋嫨涓�涓澶�
+        deviceTable.getSelectionModel().addListSelectionListener(e -> {
+            if (!e.getValueIsAdjusting()) {
+                int selectedRow = deviceTable.getSelectedRow();
+                if (selectedRow != -1) {
+                    // 鍙栨秷鍏朵粬琛岀殑閫夋嫨妗�
+                    for (int i = 0; i < deviceTable.getRowCount(); i++) {
+                        if (i != selectedRow) {
+                            deviceTable.setValueAt(Boolean.FALSE, i, 0);
+                        }
+                    }
+                    // 璁剧疆褰撳墠琛岀殑閫夋嫨妗嗕负閫変腑鐘舵��
+                    deviceTable.setValueAt(Boolean.TRUE, selectedRow, 0);
+                }
+            }
+        });
+
         JScrollPane scrollPane = new JScrollPane(deviceTable);
-        
         panel.add(scrollPane, BorderLayout.CENTER);
-        
+
         return panel;
     }
-    
+
+    /**
+     * 娓呯┖璁惧琛ㄦ牸
+     */
+    public void clearDeviceTable() {
+        // 瀹夊叏鍦拌幏鍙栨ā鍨�
+        if (deviceTable.getModel() instanceof javax.swing.table.DefaultTableModel) {
+            javax.swing.table.DefaultTableModel model = (javax.swing.table.DefaultTableModel) deviceTable.getModel();
+            model.setRowCount(0);
+            System.out.println(getString("device.table.cleared"));
+        } else {
+            // 濡傛灉涓嶆槸DefaultTableModel锛屼娇鐢ㄥ叾浠栨柟寮忔竻绌�
+            System.err.println(getString("table.model.error"));
+        }
+    }
+
+    /**
+     * 娣诲姞璁惧鍒拌〃鏍�
+     */
+    private void addDeviceToTable(S2data deviceInfo) {
+        // 瀹夊叏鍦拌幏鍙栨ā鍨�
+        if (deviceTable.getModel() instanceof javax.swing.table.DefaultTableModel) {
+            javax.swing.table.DefaultTableModel model = (javax.swing.table.DefaultTableModel) deviceTable.getModel();
+
+            // 娣诲姞鏂拌澶囧埌琛ㄦ牸
+            Object[] rowData = {
+                    Boolean.FALSE,           // 閫夋嫨妗�
+                    deviceInfo.getIp(),  // 璁惧IP
+                    deviceInfo.getName(),    // 璁惧鍚嶇О
+                    deviceInfo.getMac(),     // MAC鍦板潃
+                    deviceInfo.getVersion()  // 鐗堟湰
+            };
+            model.addRow(rowData);
+        } else {
+            System.err.println(getString("table.model.error"));
+        }
+    }
+
     private JPanel createConfigPanel() {
         JPanel panel = new JPanel();
         panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
-        
-        // 创建包含基础设置和端口设置的滚动面板
+
+        // 鍒涘缓鍖呭惈鍩虹璁剧疆鍜岀鍙h缃殑婊氬姩闈㈡澘
         JPanel contentPanel = new JPanel();
         contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
-        
-        // 添加顶部间距
+
+        // 娣诲姞椤堕儴闂磋窛
         contentPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0));
-        
-        // 基础设置
+
+        // 鍩虹璁剧疆
         basicSettingsPanel = createBasicSettingsPanel();
         contentPanel.add(basicSettingsPanel);
         contentPanel.add(Box.createVerticalStrut(10));
-        
-        // 端口设置
+
+        // 绔彛璁剧疆
         portSettingsPanel = createPortSettingsPanel();
         contentPanel.add(portSettingsPanel);
-        
-        // 将内容面板放入滚动面板
+
+        // 灏嗗唴瀹归潰鏉挎斁鍏ユ粴鍔ㄩ潰鏉�
         JScrollPane scrollPane = new JScrollPane(contentPanel);
         scrollPane.setBorder(BorderFactory.createEmptyBorder());
         scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
         scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
-        
+
         JPanel wrapperPanel = new JPanel(new BorderLayout());
         wrapperPanel.add(scrollPane, BorderLayout.CENTER);
-        
+
         return wrapperPanel;
     }
-    
+
     private JPanel createBasicSettingsPanel() {
         JPanel panel = new JPanel();
         panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
         panel.setBorder(BorderFactory.createTitledBorder(getString("basic.settings")));
-        
-        // 第一行
-        panel.add(createParameterRow("ip.address.type", createComboBox(new String[]{getString("static.ip")}, 150, 25), true));
-        
-        // 第二行
-        panel.add(createParameterRow("module.static.ip", createTextField("", 150, 25), true));
-        
-        // 第三行
-        panel.add(createParameterRow("subnet.mask", createTextField("", 150, 25), true));
-        
-        // 第四行
-        panel.add(createParameterRow("gateway", createTextField("", 150, 25), true));
-        
-        // 第五行
-        panel.add(createParameterRow("dns.address", createTextField("", 150, 25), false));
-        
-        // 第六行
-        panel.add(createParameterRow("user.mac.address", createTextField("", 150, 25), false));
-        
-        // 第七行
-        panel.add(createParameterRow("timeout.restart", createTextField("", 150, 25), false));
-        
-        // 第八行
-        panel.add(createParameterRow("http.service.port", createTextField("", 150, 25), false));
-        
-        // 第九行
-        panel.add(createParameterRow("username", createTextField("", 150, 25), false));
-        
-        // 第十行
-        panel.add(createParameterRow("password", createTextField("", 150, 25), false));
-        
-        // 第十一行
-        panel.add(createParameterRow("device.name", createTextField("", 150, 25), false));
-        
-        // 第十二行 - 选项复选框(第一行)
+
+        // 绗竴琛� - IP鍦板潃绫诲瀷
+        ipTypeComboBox = createComboBox(new String[]{getString("static.ip")}, 150, 25);
+        panel.add(createParameterRow("ip.address.type", ipTypeComboBox, true));
+
+        // 绗簩琛� - 妯″潡闈欐�両P
+        staticIpField = createTextField("", 150, 25);
+        panel.add(createParameterRow("module.static.ip", staticIpField, true));
+
+        // 绗笁琛� - 瀛愮綉鎺╃爜
+        subnetMaskField = createTextField("", 150, 25);
+        panel.add(createParameterRow("subnet.mask", subnetMaskField, true));
+
+        // 绗洓琛� - 缃戝叧
+        gatewayField = createTextField("", 150, 25);
+        panel.add(createParameterRow("gateway", gatewayField, true));
+
+        // 绗簲琛� - DNS鍦板潃
+        dnsServerField = createTextField("", 150, 25);
+        panel.add(createParameterRow("dns.address", dnsServerField, false));
+
+        // 绗叚琛� - 鐢ㄦ埛MAC鍦板潃
+        macAddressField = createTextField("", 150, 25);
+        panel.add(createParameterRow("user.mac.address", macAddressField, false));
+
+        // 绗竷琛� - 瓒呮椂閲嶅惎鏃堕棿
+        timeoutRestartField = createTextField("", 150, 25);
+        panel.add(createParameterRow("timeout.restart", timeoutRestartField, false));
+
+        // 绗叓琛� - HTTP鏈嶅姟绔彛
+        httpServerPortField = createTextField("", 150, 25);
+        panel.add(createParameterRow("http.service.port", httpServerPortField, false));
+
+        // 绗節琛� - 鐢ㄦ埛鍚�
+        usernameField = createTextField("", 150, 25);
+        panel.add(createParameterRow("username", usernameField, false));
+
+        // 绗崄琛� - 瀵嗙爜
+        passwordField = createTextField("", 150, 25);
+        panel.add(createParameterRow("password", passwordField, false));
+
+        // 绗崄涓�琛� - 璁惧鍚嶇О
+        deviceNameField = createTextField("", 150, 25);
+        panel.add(createParameterRow("device.name", deviceNameField, false));
+
+        // 绗崄浜岃 - 閫夐」澶嶉�夋锛堢涓�琛岋級
         JPanel optionPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 0));
-        optionPanel.add(new JLabel(getString("options") + ":"));
-        
+        optionsLabel = new JLabel(getString("options") + ":");
+        optionPanel.add(optionsLabel);
+
         JPanel checkPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0));
-        checkPanel.add(new JCheckBox("Index"));
-        checkPanel.add(new JCheckBox("Reset"));
-        checkPanel.add(new JCheckBox("Link"));
-        checkPanel.add(new JCheckBox("RFC2217"));
-        
+        indexCheckBox = new JCheckBox(getString("option.index"));
+        resetCheckBox = new JCheckBox(getString("option.reset"));
+        linkCheckBox = new JCheckBox(getString("option.link"));
+        rfc2217CheckBox = new JCheckBox(getString("option.rfc2217"));
+
+        checkPanel.add(indexCheckBox);
+        checkPanel.add(resetCheckBox);
+        checkPanel.add(linkCheckBox);
+        checkPanel.add(rfc2217CheckBox);
+
         optionPanel.add(checkPanel);
         optionPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 35));
         panel.add(optionPanel);
-        
-        // 第十三行 - 选项复选框(第二行)
+
+        // 绗崄涓夎 - 閫夐」澶嶉�夋锛堢浜岃锛�
         JPanel optionPanel2 = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 0));
-        // 添加空标签保持对齐
         optionPanel2.add(new JLabel(" "));
-        
+
         JPanel checkPanel2 = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0));
-        checkPanel2.add(new JCheckBox(getString("clear.cache")));
-        checkPanel2.add(new JCheckBox(getString("serial.settings")));
-        
+        cacheClearCheckBox = new JCheckBox(getString("clear.cache"));
+        serialSettingsCheckBox = new JCheckBox(getString("serial.settings"));
+
+        checkPanel2.add(cacheClearCheckBox);
+        checkPanel2.add(serialSettingsCheckBox);
+
         optionPanel2.add(checkPanel2);
         optionPanel2.setMaximumSize(new Dimension(Integer.MAX_VALUE, 35));
         panel.add(optionPanel2);
-        
+
         return panel;
     }
-    
+
     private JPanel createPortSettingsPanel() {
         JPanel panel = new JPanel();
         panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
         panel.setBorder(BorderFactory.createTitledBorder(getString("port.settings")));
-        
-        // 第一行
-        panel.add(createParameterRow("module.work.mode", createComboBox(new String[]{"UDP Client", "TCP Client", "TCP Server"}, 150, 25), false));
-        
-        // 第二行
-        panel.add(createParameterRow("target.ip.domain", createTextField("", 150, 25), false));
-        
-        // 第三行
-        panel.add(createParameterRow("short.connection.time", createTextField("", 150, 25), false));
-        
-        // 第四行
-        panel.add(createParameterRow("serial.baud.rate", createComboBoxWithSelection(new String[]{"9600", "19200", "38400", "115200", "921600"}, "115200", 150, 25), false));
-        
-        // 第五行
-        panel.add(createParameterRow("local.port", createTextField("", 150, 25), false));
-        
-        // 第六行
-        panel.add(createParameterRow("remote.port", createTextField("", 150, 25), false));
-        
-        // 第七行
-        panel.add(createParameterRow("tcp.server.connections", createComboBox(new String[]{"4", "3", "2", "1"}, 150, 25), false));
-        
-        // 第八行 - 开启短连接复选框
+
+        // 绗竴琛� - 妯″潡宸ヤ綔妯″紡
+        workModeComboBox = createComboBox(new String[]{
+            getString("work.mode.udp.client"), 
+            getString("work.mode.tcp.client"), 
+            getString("work.mode.tcp.server")
+        }, 150, 25);
+        panel.add(createParameterRow("module.work.mode", workModeComboBox, false));
+
+        // 绗簩琛� - 鐩爣IP/鍩熷悕
+        targetUrlField = createTextField("", 150, 25);
+        panel.add(createParameterRow("target.ip.domain", targetUrlField, false));
+
+        // 绗笁琛� - 鐭繛鎺ユ椂闂�
+        shortConnectionTimeField = createTextField("", 150, 25);
+        panel.add(createParameterRow("short.connection.time", shortConnectionTimeField, false));
+
+        // 绗洓琛� - 涓插彛娉㈢壒鐜�
+        baudRateComboBox = createComboBoxWithSelection(new String[]{"9600", "19200", "38400", "115200", "921600"}, "115200", 150, 25);
+        panel.add(createParameterRow("serial.baud.rate", baudRateComboBox, false));
+
+        // 绗簲琛� - 鏈湴绔彛
+        localPortField = createTextField("", 150, 25);
+        panel.add(createParameterRow("local.port", localPortField, false));
+
+        // 绗叚琛� - 杩滅▼绔彛
+        remotePortField = createTextField("", 150, 25);
+        panel.add(createParameterRow("remote.port", remotePortField, false));
+
+        // 绗竷琛� - TCP Server杩炴帴鏁�
+        tcpClientCountComboBox = createComboBox(new String[]{"4", "3", "2", "1"}, 150, 25);
+        panel.add(createParameterRow("tcp.server.connections", tcpClientCountComboBox, false));
+
+        // 绗叓琛� - 寮�鍚煭杩炴帴澶嶉�夋
         JPanel shortConnPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 0));
-        shortConnPanel.add(new JLabel(" ")); // 空标签保持对齐
-        
+        shortConnPanel.add(new JLabel(" "));
+
         JPanel shortConnSubPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0));
-        shortConnSubPanel.add(new JCheckBox(getString("enable.short.connection")));
-        
+        enableShortConnectionCheckBox = new JCheckBox(getString("enable.short.connection"));
+        shortConnSubPanel.add(enableShortConnectionCheckBox);
+
         shortConnPanel.add(shortConnSubPanel);
         shortConnPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 35));
         panel.add(shortConnPanel);
-        
-        // 第九行 - 校验/数据/停止
+
+        // 绗節琛� - 鏍¢獙/鏁版嵁/鍋滄
         JPanel parityPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 0));
-        parityPanel.add(new JLabel(getString("parity.data.stop") + ":"));
-        
+        parityDataStopLabel = new JLabel(getString("parity.data.stop") + ":");
+        parityPanel.add(parityDataStopLabel);
+
         JPanel paritySubPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0));
-        paritySubPanel.add(createComboBox(new String[]{"NONE"}, 80, 25));
-        paritySubPanel.add(createComboBox(new String[]{"8"}, 60, 25));
-        paritySubPanel.add(createComboBox(new String[]{"1"}, 60, 25));
-        
+        parityComboBox = createComboBox(new String[]{getString("parity.none")}, 80, 25);
+        dataBitsComboBox = createComboBox(new String[]{"8"}, 60, 25);
+        stopBitsComboBox = createComboBox(new String[]{"1"}, 60, 25);
+
+        paritySubPanel.add(parityComboBox);
+        paritySubPanel.add(dataBitsComboBox);
+        paritySubPanel.add(stopBitsComboBox);
+
         parityPanel.add(paritySubPanel);
         parityPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 35));
         panel.add(parityPanel);
-        
-        // 第十行 - 保存参数按钮
-        JPanel savePanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        savePanel.add(ButtonUtils.createBlueButton(getString("save.parameters")));
-        savePanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 35));
-        panel.add(savePanel);
-        
+
         return panel;
     }
-    
-    // 创建参数行的辅助方法,参考BaseStationPanel的布局
+
+    // 鍒涘缓鍙傛暟琛岀殑杈呭姪鏂规硶锛屽弬鑰傿aseStationPanel鐨勫竷灞�
     private JPanel createParameterRow(String paramKey, JComponent component, boolean withStar) {
         JPanel paramPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 0));
-        
+
         String labelText = getString(paramKey);
         if (withStar) {
-            labelText += " ★";
+            labelText += " 鈽�";
         }
-        
+
         JLabel label = new JLabel(labelText);
         label.setPreferredSize(new Dimension(140, 25));
         
+        // 淇濆瓨鏍囩寮曠敤锛岀敤浜庤瑷�鍒囨崲
+        parameterLabels.put(paramKey, label);
+
         paramPanel.add(label);
         paramPanel.add(component);
-        
-        // 设置固定高度
+
+        // 璁剧疆鍥哄畾楂樺害
         paramPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 35));
         return paramPanel;
     }
-    
-    // 创建文本框的辅助方法
+
+    // 鍒涘缓鏂囨湰妗嗙殑杈呭姪鏂规硶
     private JTextField createTextField(String text, int width, int height) {
         JTextField textField = new JTextField(text);
         textField.setPreferredSize(new Dimension(width, height));
         return textField;
     }
-    
-    // 创建下拉框的辅助方法
+
+    // 鍒涘缓涓嬫媺妗嗙殑杈呭姪鏂规硶
     private JComboBox<String> createComboBox(String[] items, int width, int height) {
         JComboBox<String> comboBox = new JComboBox<>(items);
         comboBox.setPreferredSize(new Dimension(width, height));
         return comboBox;
     }
-    
-    // 创建带默认选择的下拉框
+
+    // 鍒涘缓甯﹂粯璁ら�夋嫨鐨勪笅鎷夋
     private JComboBox<String> createComboBoxWithSelection(String[] items, String selected, int width, int height) {
         JComboBox<String> comboBox = createComboBox(items, width, height);
         comboBox.setSelectedItem(selected);
         return comboBox;
     }
-    
+
     public void updateLanguage() {
-        // 更新控制面板文本
-        protocolLabel.setText(getString("protocol.type"));
-        addressLabel.setText(getString("local.host.address"));
-        portLabel.setText(getString("local.host.port"));
-        openBtn.setText(getString("open"));
+        // 鏇存柊鎺у埗闈㈡澘鎸夐挳鏂囨湰
         searchBtn.setText(getString("search.devices"));
+        readBtn.setText(getString("read.parameters"));
+        saveBtn.setText(getString("save.parameters"));
+
+        // 鏇存柊璁惧琛ㄦ牸鏍囬
+        if (deviceListLabel != null) {
+            deviceListLabel.setText(getString("device.list"));
+            // 鏇存柊琛ㄦ牸杈规鏍囬
+            if (deviceTable != null && deviceTable.getParent() != null && 
+                deviceTable.getParent().getParent() instanceof JPanel) {
+                JPanel tablePanel = (JPanel) deviceTable.getParent().getParent();
+                tablePanel.setBorder(BorderFactory.createTitledBorder(getString("device.list")));
+            }
+        }
+
+        // 鏇存柊璁剧疆闈㈡澘杈规鏍囬
+        if (basicSettingsPanel != null) {
+            basicSettingsPanel.setBorder(BorderFactory.createTitledBorder(getString("basic.settings")));
+        }
+        if (portSettingsPanel != null) {
+            portSettingsPanel.setBorder(BorderFactory.createTitledBorder(getString("port.settings")));
+        }
+
+        // 鏇存柊鎵�鏈夊弬鏁拌鐨勬爣绛炬枃鏈�
+        updateParameterRowLabels();
         
-        // 更新设备表格标题
-        if (deviceTable != null) {
-            // 更新表格标题
+        // 鏇存柊鍏朵粬鐙珛鏍囩
+        if (optionsLabel != null) {
+            optionsLabel.setText(getString("options") + ":");
+        }
+        if (parityDataStopLabel != null) {
+            parityDataStopLabel.setText(getString("parity.data.stop") + ":");
+        }
+
+        // 鏇存柊澶嶉�夋鏂囨湰
+        if (indexCheckBox != null) {
+            indexCheckBox.setText(getString("option.index"));
+        }
+        if (resetCheckBox != null) {
+            resetCheckBox.setText(getString("option.reset"));
+        }
+        if (linkCheckBox != null) {
+            linkCheckBox.setText(getString("option.link"));
+        }
+        if (rfc2217CheckBox != null) {
+            rfc2217CheckBox.setText(getString("option.rfc2217"));
+        }
+        if (cacheClearCheckBox != null) {
+            cacheClearCheckBox.setText(getString("clear.cache"));
+        }
+        if (serialSettingsCheckBox != null) {
+            serialSettingsCheckBox.setText(getString("serial.settings"));
+        }
+        if (enableShortConnectionCheckBox != null) {
+            enableShortConnectionCheckBox.setText(getString("enable.short.connection"));
+        }
+
+        // 鏇存柊宸ヤ綔妯″紡涓嬫媺妗嗛�夐」
+        if (workModeComboBox != null) {
+            String currentSelection = (String) workModeComboBox.getSelectedItem();
+            workModeComboBox.removeAllItems();
+            workModeComboBox.addItem(getString("work.mode.udp.client"));
+            workModeComboBox.addItem(getString("work.mode.tcp.client"));
+            workModeComboBox.addItem(getString("work.mode.tcp.server"));
+            // 灏濊瘯鎭㈠涔嬪墠鐨勯�夋嫨
+            if (currentSelection != null) {
+                try {
+                    // 灏濊瘯鏍规嵁鏃у�兼壘鍒板搴旂殑鏂板��
+                    if (currentSelection.contains("UDP")) {
+                        workModeComboBox.setSelectedItem(getString("work.mode.udp.client"));
+                    } else if (currentSelection.contains("TCP Client")) {
+                        workModeComboBox.setSelectedItem(getString("work.mode.tcp.client"));
+                    } else if (currentSelection.contains("TCP Server")) {
+                        workModeComboBox.setSelectedItem(getString("work.mode.tcp.server"));
+                    }
+                } catch (Exception e) {
+                    // 濡傛灉鎭㈠澶辫触锛岄�夋嫨绗竴椤�
+                    if (workModeComboBox.getItemCount() > 0) {
+                        workModeComboBox.setSelectedIndex(0);
+                    }
+                }
+            }
+        }
+
+        // 鏇存柊鏍¢獙浣嶄笅鎷夋閫夐」
+        if (parityComboBox != null) {
+            String currentSelection = (String) parityComboBox.getSelectedItem();
+            parityComboBox.removeAllItems();
+            parityComboBox.addItem(getString("parity.none"));
+            // 鎭㈠涔嬪墠鐨勯�夋嫨
+            if (currentSelection != null && currentSelection.equals("NONE")) {
+                parityComboBox.setSelectedItem(getString("parity.none"));
+            } else if (parityComboBox.getItemCount() > 0) {
+                parityComboBox.setSelectedIndex(0);
+            }
+        }
+
+        // 鏇存柊琛ㄦ牸鍒楀悕
+        updateTableColumnNames();
+
+        revalidate();
+        repaint();
+    }
+
+    /**
+     * 鏇存柊鎵�鏈夊弬鏁拌鐨勬爣绛炬枃鏈�
+     */
+    private void updateParameterRowLabels() {
+        // 闇�瑕佸甫鏄熷彿鐨勫弬鏁伴敭鍒楄〃锛堟牴鎹� createParameterRow 璋冪敤鏃剁殑 withStar 鍙傛暟锛�
+        Set<String> keysWithStar = new HashSet<>();
+        keysWithStar.add("ip.address.type");
+        keysWithStar.add("module.static.ip");
+        keysWithStar.add("subnet.mask");
+        keysWithStar.add("gateway");
+        
+        // 鏇存柊鎵�鏈変繚瀛樼殑鏍囩
+        for (Map.Entry<String, JLabel> entry : parameterLabels.entrySet()) {
+            String paramKey = entry.getKey();
+            JLabel label = entry.getValue();
+            if (label != null) {
+                String labelText = getString(paramKey);
+                // 濡傛灉杩欎釜鍙傛暟闇�瑕佹槦鍙凤紝娣诲姞鏄熷彿
+                if (keysWithStar.contains(paramKey)) {
+                    labelText += " 鈽�";
+                }
+                label.setText(labelText);
+            }
+        }
+    }
+
+    /**
+     * 鏇存柊琛ㄦ牸鍒楀悕
+     */
+    private void updateTableColumnNames() {
+        if (deviceTable != null && deviceTable.getModel() instanceof javax.swing.table.DefaultTableModel) {
+            javax.swing.table.DefaultTableModel model = (javax.swing.table.DefaultTableModel) deviceTable.getModel();
+            
             String[] columnNames = {
                 getString("select"),
                 getString("device.ip"),
@@ -306,29 +1089,31 @@
                 getString("mac.address"),
                 getString("version")
             };
-            // 这里需要更新表格列名,为了简单起见,我们只更新边框标题
-            JViewport viewport = (JViewport) deviceTable.getParent();
-            if (viewport != null) {
-                JScrollPane scrollPane = (JScrollPane) viewport.getParent();
-                if (scrollPane != null) {
-                    scrollPane.setBorder(BorderFactory.createTitledBorder(getString("device.list")));
+            
+            // 淇濆瓨褰撳墠鏁版嵁
+            int rowCount = model.getRowCount();
+            Object[][] data = new Object[rowCount][columnNames.length];
+            for (int i = 0; i < rowCount; i++) {
+                for (int j = 0; j < columnNames.length; j++) {
+                    if (j < model.getColumnCount()) {
+                        data[i][j] = model.getValueAt(i, j);
+                    }
                 }
             }
+            
+            // 鏇存柊鍒楀悕鍜屾暟鎹�
+            model.setColumnIdentifiers(columnNames);
         }
-        
-        // 更新设置面板边框标题
-        if (basicSettingsPanel != null) {
-            basicSettingsPanel.setBorder(BorderFactory.createTitledBorder(getString("basic.settings")));
-        }
-        if (portSettingsPanel != null) {
-            portSettingsPanel.setBorder(BorderFactory.createTitledBorder(getString("port.settings")));
-        }
-        
-        revalidate();
-        repaint();
     }
-    
+
     private String getString(String key) {
         return mainFrame.getString(key);
     }
+
+    /**
+     * 鍦ㄦ悳绱㈠紑濮嬫椂璋冪敤锛屾竻绌烘棫鏁版嵁骞跺噯澶囨柊鎼滅储
+     */
+    private void prepareSearch() {
+        clearDeviceTable();
+    }
 }
\ No newline at end of file

--
Gitblit v1.10.0