zsh_root
2025-12-10 8d662de2fd262b3a485f16e197cb4d0ca2a61cdf
src/home/SendPanel.java
@@ -16,9 +16,9 @@
    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;
@@ -26,19 +26,19 @@
    }
    
    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) {
@@ -46,31 +46,31 @@
                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) {
@@ -78,22 +78,22 @@
            }
        });
        
        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();
@@ -105,26 +105,26 @@
            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("]");
@@ -132,108 +132,108 @@
        
        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秒
        }
    }
}