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秒 } } }