| | |
| | | private JCheckBox hexSendCheck, loopSendCheck; |
| | | private JTextField loopTimeField; |
| | | private JButton sendBtn, extensionBtn; |
| | | private JLabel loopTimeLabel; // 添加循环时间标签引用 |
| | | private JLabel addressLabel; // 添加地址标签引用 |
| | | private JTextField addressField; // 添加地址文本框引用 |
| | | private JLabel loopTimeLabel; // 添加循环时间标签引用 |
| | | private JLabel addressLabel; // 添加地址标签引用 |
| | | private JTextField addressField; // 添加地址文本框引用 |
| | | |
| | | public SendPanel(MainFrame mainFrame) { |
| | | this.mainFrame = mainFrame; |
| | |
| | | } |
| | | |
| | | private void initializeUI() { |
| | | setLayout(new BorderLayout()); // 设置边界布局 |
| | | setBorder(BorderFactory.createTitledBorder(getString("send.data"))); // 设置带标题的边框 |
| | | 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 后添加: |
| | | // 创建顶部控制面板 |
| | | 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.setVisible(true); |
| | | } |
| | | }); |
| | | topControlPanel.add(hexSendCheck); // 添加HEX发送复选框 |
| | | topControlPanel.add(loopSendCheck); // 添加循环发送复选框 |
| | | topControlPanel.add(loopTimeLabel); // 添加循环时间标签 |
| | | topControlPanel.add(loopTimeField); // 添加循环时间文本框 |
| | | topControlPanel.add(extensionBtn); // 添加扩展按钮 |
| | | 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 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 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 |
| | | // 创建底部控制面板(发送按钮) |
| | | 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) { |
| | |
| | | } |
| | | }); |
| | | |
| | | bottomControlPanel.add(sendBtn); // 添加发送按钮 |
| | | bottomControlPanel.add(sendBtn); // 添加发送按钮 |
| | | |
| | | // 创建主面板,使用垂直盒子布局 |
| | | // 创建主面板,使用垂直盒子布局 |
| | | JPanel mainPanel = new JPanel(); |
| | | mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); // 垂直盒子布局 |
| | | mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); // 垂直盒子布局 |
| | | |
| | | mainPanel.add(topControlPanel); // 添加顶部控制面板 |
| | | mainPanel.add(middleControlPanel); // 添加中部控制面板 |
| | | mainPanel.add(sendAreaPanel); // 添加发送区域面板 |
| | | mainPanel.add(bottomControlPanel); // 添加底部控制面板 |
| | | mainPanel.add(topControlPanel); // 添加顶部控制面板 |
| | | mainPanel.add(middleControlPanel); // 添加中部控制面板 |
| | | mainPanel.add(sendAreaPanel); // 添加发送区域面板 |
| | | mainPanel.add(bottomControlPanel); // 添加底部控制面板 |
| | | |
| | | add(mainPanel, BorderLayout.CENTER); // 添加主面板到中心 |
| | | add(mainPanel, BorderLayout.CENTER); // 添加主面板到中心 |
| | | } |
| | | |
| | | /** |
| | | * 发送数据并在数据日志中显示 |
| | | * 发送数据并在数据日志中显示 |
| | | */ |
| | | private void sendData() { |
| | | String sendContent = sendArea.getText().trim(); |
| | |
| | | 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发送选项格式化内容 |
| | | // 根据HEX发送选项格式化内容 |
| | | if (hexSendCheck.isSelected()) { |
| | | logMessage.append("HEX "); |
| | | // 这里可以添加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有添加日志的方法 |
| | | // 通过反射或其他方式访问DataLogPanel的logArea |
| | | // 这里假设DataLogPanel有添加日志的方法 |
| | | addLogToDataLogPanel(dataLogPanel, logMessage.toString()); |
| | | } |
| | | |
| | | // 这里可以添加实际的发送逻辑 |
| | | // 这里可以添加实际的发送逻辑 |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 将日志信息添加到数据日志面板 |
| | | * @param dataLogPanel 数据日志面板 |
| | | * @param logMessage 日志信息 |
| | | * 将日志信息添加到数据日志面板 |
| | | * @param dataLogPanel 数据日志面板 |
| | | * @param logMessage 日志信息 |
| | | */ |
| | | private void addLogToDataLogPanel(DataLogPanel dataLogPanel, String logMessage) { |
| | | try { |
| | | // 使用反射获取logArea并添加日志 |
| | | // 使用反射获取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()); |
| | | // 这里可以添加备用方案 |
| | | // 如果反射失败,尝试其他方式 |
| | | 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")); // 更新扩展按钮文本 |
| | | 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")); // 更新循环时间标签文本 |
| | | loopTimeLabel.setText(getString("loop.time")); // 更新循环时间标签文本 |
| | | } |
| | | |
| | | // 更新指定地址标签 |
| | | // 更新指定地址标签 |
| | | if (addressLabel != null) { |
| | | addressLabel.setText(getString("specified.address")); // 更新指定地址标签文本 |
| | | addressLabel.setText(getString("specified.address")); // 更新指定地址标签文本 |
| | | } |
| | | |
| | | revalidate(); // 重新验证布局 |
| | | repaint(); // 重新绘制 |
| | | revalidate(); // 重新验证布局 |
| | | repaint(); // 重新绘制 |
| | | } |
| | | |
| | | private String getString(String key) { |
| | | return mainFrame.getString(key); // 从主框架获取字符串 |
| | | return mainFrame.getString(key); // 从主框架获取字符串 |
| | | } |
| | | |
| | | /** |
| | | * 获取发送区域内容 |
| | | * @return 发送内容 |
| | | * 获取发送区域内容 |
| | | * @return 发送内容 |
| | | */ |
| | | public String getSendContent() { |
| | | return sendArea.getText(); |
| | | } |
| | | |
| | | /** |
| | | * 设置发送区域内容 |
| | | * @param content 发送内容 |
| | | * 设置发送区域内容 |
| | | * @param content 发送内容 |
| | | */ |
| | | public void setSendContent(String content) { |
| | | sendArea.setText(content); |
| | | } |
| | | |
| | | /** |
| | | * 获取HEX发送状态 |
| | | * @return 是否HEX发送 |
| | | * 获取HEX发送状态 |
| | | * @return 是否HEX发送 |
| | | */ |
| | | public boolean isHexSend() { |
| | | return hexSendCheck.isSelected(); |
| | | } |
| | | |
| | | /** |
| | | * 获取循环发送状态 |
| | | * @return 是否循环发送 |
| | | * 获取循环发送状态 |
| | | * @return 是否循环发送 |
| | | */ |
| | | public boolean isLoopSend() { |
| | | return loopSendCheck.isSelected(); |
| | | } |
| | | |
| | | /** |
| | | * 获取循环时间 |
| | | * @return 循环时间(毫秒) |
| | | * 获取循环时间 |
| | | * @return 循环时间(毫秒) |
| | | */ |
| | | public int getLoopTime() { |
| | | try { |
| | | return Integer.parseInt(loopTimeField.getText()); |
| | | } catch (NumberFormatException e) { |
| | | return 1000; // 默认1秒 |
| | | return 1000; // 默认1秒 |
| | | } |
| | | } |
| | | } |