zsh_root
2025-12-10 8d662de2fd262b3a485f16e197cb4d0ca2a61cdf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
package home;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
 
public class SendPanel extends JPanel {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private MainFrame mainFrame;
    private JTextArea sendArea;
    private JCheckBox hexSendCheck, loopSendCheck;
    private JTextField loopTimeField;
    private JButton sendBtn, extensionBtn;
    private JLabel loopTimeLabel; // 添加循环时间标签引用
    private JLabel addressLabel; // 添加地址标签引用
    private JTextField addressField; // 添加地址文本框引用
    
    public SendPanel(MainFrame mainFrame) {
        this.mainFrame = mainFrame;
        initializeUI();
    }
    
    private void initializeUI() {
        setLayout(new BorderLayout()); // 设置边界布局
        setBorder(BorderFactory.createTitledBorder(getString("send.data"))); // 设置带标题的边框
        
        // 创建顶部控制面板
        JPanel topControlPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); // 顶部控制面板,左对齐流式布局
        hexSendCheck = new JCheckBox(getString("hex.send")); // HEX发送复选框
        loopSendCheck = new JCheckBox(getString("loop.send")); // 循环发送复选框
        loopTimeLabel = new JLabel(getString("loop.time")); // 循环时间标签
        loopTimeField = new JTextField(8); // 循环时间文本框
        loopTimeField.setText("1000"); // 设置默认循环时间
        extensionBtn = ButtonUtils.createBlueButton(getString("extension"), 25); // 扩展按钮,高度25像素
        extensionBtn.setPreferredSize(new Dimension(80, 25)); // 设置按钮宽度为120,高度25
        // 在 SendPanel 的 initializeUI() 方法中,创建 extensionBtn 后添加:
        extensionBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ExtensionPanel extensionPanel = new ExtensionPanel(mainFrame);
                extensionPanel.setVisible(true);
            }
        });
        topControlPanel.add(hexSendCheck); // 添加HEX发送复选框
        topControlPanel.add(loopSendCheck); // 添加循环发送复选框
        topControlPanel.add(loopTimeLabel); // 添加循环时间标签
        topControlPanel.add(loopTimeField); // 添加循环时间文本框
        topControlPanel.add(extensionBtn); // 添加扩展按钮
        
        // 创建中部控制面板(指定地址发送)
        JPanel middleControlPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); // 中部控制面板,左对齐流式布局
        addressLabel = new JLabel(getString("specified.address")); // 指定地址标签
        addressField = new JTextField(30); // 指定地址文本框
        middleControlPanel.add(addressLabel); // 添加指定地址标签
        middleControlPanel.add(addressField); // 添加指定地址文本框
        
        // 创建发送区域面板
        JPanel sendAreaPanel = new JPanel(new BorderLayout()); // 发送区域面板,边界布局
        sendArea = new JTextArea(3, 25); // 发送文本区域
        JScrollPane scrollPane = new JScrollPane(sendArea); // 发送区域滚动面板
        sendAreaPanel.add(scrollPane, BorderLayout.CENTER); // 添加滚动面板到中心
        
        // 创建底部控制面板(发送按钮)
        JPanel bottomControlPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); // 底部控制面板,左对齐流式布局
        sendBtn = ButtonUtils.createBlueButton(getString("send"), 25); // 发送按钮,高度25像素
        sendBtn.setPreferredSize(new Dimension(100, 25)); // 设置按钮宽度为120,高度25
        
        // 添加发送按钮点击事件
        sendBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sendData();
            }
        });
        
        bottomControlPanel.add(sendBtn); // 添加发送按钮
        
        // 创建主面板,使用垂直盒子布局
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); // 垂直盒子布局
        
        mainPanel.add(topControlPanel); // 添加顶部控制面板
        mainPanel.add(middleControlPanel); // 添加中部控制面板
        mainPanel.add(sendAreaPanel); // 添加发送区域面板
        mainPanel.add(bottomControlPanel); // 添加底部控制面板
        
        add(mainPanel, BorderLayout.CENTER); // 添加主面板到中心
    }
    
    /**
     * 发送数据并在数据日志中显示
     */
    private void sendData() {
        String sendContent = sendArea.getText().trim();
        if (sendContent.isEmpty()) {
            JOptionPane.showMessageDialog(this, 
                getString("send.content.empty"), 
                getString("prompt"), 
                JOptionPane.WARNING_MESSAGE);
            return;
        }
        
        // 获取当前时间
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String currentTime = dateFormat.format(new Date());
        
        // 构建日志信息
        StringBuilder logMessage = new StringBuilder();
        logMessage.append("[").append(currentTime).append("] ");
        logMessage.append(getString("send")).append(": ");
        
        // 根据HEX发送选项格式化内容
        if (hexSendCheck.isSelected()) {
            logMessage.append("HEX ");
            // 这里可以添加HEX格式转换逻辑
            logMessage.append(sendContent);
        } else {
            logMessage.append("ASCII ");
            logMessage.append(sendContent);
        }
        
        // 如果有指定地址,添加到日志中
        String address = addressField.getText().trim();
        if (!address.isEmpty()) {
            logMessage.append(" [").append(getString("specified.address")).append(": ").append(address).append("]");
        }
        
        logMessage.append("\n");
        
        // 将发送信息添加到数据日志面板
        DataLogPanel dataLogPanel = mainFrame.getDataLogPanel();
        if (dataLogPanel != null) {
            // 通过反射或其他方式访问DataLogPanel的logArea
            // 这里假设DataLogPanel有添加日志的方法
            addLogToDataLogPanel(dataLogPanel, logMessage.toString());
        }
        
        // 这里可以添加实际的发送逻辑
        
    }
    
    /**
     * 将日志信息添加到数据日志面板
     * @param dataLogPanel 数据日志面板
     * @param logMessage 日志信息
     */
    private void addLogToDataLogPanel(DataLogPanel dataLogPanel, String logMessage) {
        try {
            // 使用反射获取logArea并添加日志
            java.lang.reflect.Field logAreaField = DataLogPanel.class.getDeclaredField("logArea");
            logAreaField.setAccessible(true);
            JTextArea logArea = (JTextArea) logAreaField.get(dataLogPanel);
            
            if (logArea != null) {
                logArea.append(logMessage);
                // 自动滚动到最后
                logArea.setCaretPosition(logArea.getDocument().getLength());
            }
        } catch (Exception ex) {
            // 如果反射失败,尝试其他方式
            System.err.println("无法访问数据日志区域: " + ex.getMessage());
            // 这里可以添加备用方案
        }
    }
    
    public void updateLanguage() {
        setBorder(BorderFactory.createTitledBorder(getString("send.data"))); // 更新边框标题
        hexSendCheck.setText(getString("hex.send")); // 更新HEX发送复选框文本
        loopSendCheck.setText(getString("loop.send")); // 更新循环发送复选框文本
        sendBtn.setText(getString("send")); // 更新发送按钮文本
        extensionBtn.setText(getString("extension")); // 更新扩展按钮文本
        
        // 直接更新标签文本,无需遍历查找
        if (loopTimeLabel != null) {
            loopTimeLabel.setText(getString("loop.time")); // 更新循环时间标签文本
        }
        
        // 更新指定地址标签
        if (addressLabel != null) {
            addressLabel.setText(getString("specified.address")); // 更新指定地址标签文本
        }
        
        revalidate(); // 重新验证布局
        repaint(); // 重新绘制
    }
    
    private String getString(String key) {
        return mainFrame.getString(key); // 从主框架获取字符串
    }
    
    /**
     * 获取发送区域内容
     * @return 发送内容
     */
    public String getSendContent() {
        return sendArea.getText();
    }
    
    /**
     * 设置发送区域内容
     * @param content 发送内容
     */
    public void setSendContent(String content) {
        sendArea.setText(content);
    }
    
    /**
     * 获取HEX发送状态
     * @return 是否HEX发送
     */
    public boolean isHexSend() {
        return hexSendCheck.isSelected();
    }
    
    /**
     * 获取循环发送状态
     * @return 是否循环发送
     */
    public boolean isLoopSend() {
        return loopSendCheck.isSelected();
    }
    
    /**
     * 获取循环时间
     * @return 循环时间(毫秒)
     */
    public int getLoopTime() {
        try {
            return Integer.parseInt(loopTimeField.getText());
        } catch (NumberFormatException e) {
            return 1000; // 默认1秒
        }
    }
}