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