zsh_root
2025-12-10 8d662de2fd262b3a485f16e197cb4d0ca2a61cdf
src/home/ExtensionPanel.java
@@ -17,19 +17,19 @@
    private File commandFile;
    
    public ExtensionPanel(MainFrame parent) {
        super(parent, getString(parent, "extension"), false); // 设置为非模态对话框
        super(parent, getString(parent, "extension"), false); // 设置为非模态对话框
        this.mainFrame = parent;
        initializeUI();
        loadCommands();
    }
    
    private void initializeUI() {
        setSize(800, 500); // 修改默认打开窗口为800*500
        setSize(800, 500); // 修改默认打开窗口为800*500
        setLocationRelativeTo(mainFrame);
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        setLayout(new BorderLayout());
        
        // 创建命令面板
        // 创建命令面板
        commandPanel = new JPanel();
        commandPanel.setLayout(new BoxLayout(commandPanel, BoxLayout.Y_AXIS));
        
@@ -41,10 +41,10 @@
            TitledBorder.TOP
        ));
        
        // 创建按钮面板
        // 创建按钮面板
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        
        // 使用ButtonUtils创建样式按钮
        // 使用ButtonUtils创建样式按钮
        saveButton = ButtonUtils.createBlueButton(getString(mainFrame, "save.common.commands"), 25);
        saveButton.setPreferredSize(new Dimension(120, 25));
        
@@ -60,7 +60,7 @@
        add(scrollPane, BorderLayout.CENTER);
        add(buttonPanel, BorderLayout.SOUTH);
        
        // 初始化指令文件
        // 初始化指令文件
        String rootPath = System.getProperty("user.dir");
        File systemFileDir = new File(rootPath + File.separator + "systemfile");
        if (!systemFileDir.exists()) {
@@ -70,14 +70,14 @@
    }
    
    private void loadCommands() {
        commandPanel.removeAll(); // 清空面板
        commandPanel.removeAll(); // 清空面板
        
        if (commandFile.exists()) {
            try (BufferedReader reader = new BufferedReader(new FileReader(commandFile))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    if (!line.trim().isEmpty()) {
                        // 每行格式:是否HEX:指令内容
                        // 每行格式:是否HEX:指令内容
                        String[] parts = line.split(":", 2);
                        boolean isHex = false;
                        String command = "";
@@ -100,7 +100,7 @@
            }
        }
        
        // 添加一个空行用于新增命令
        // 添加一个空行用于新增命令
        addCommandRow(false, "");
        
        commandPanel.revalidate();
@@ -110,18 +110,18 @@
    private void addCommandRow(boolean isHex, String command) {
        JPanel rowPanel = new JPanel();
        rowPanel.setLayout(new BoxLayout(rowPanel, BoxLayout.X_AXIS));
        rowPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); // 设置行间距
        rowPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); // 设置行间距
        
        // HEX复选框
        // HEX复选框
        JCheckBox hexCheckBox = new JCheckBox(getString(mainFrame, "hex.send"));
        hexCheckBox.setSelected(isHex);
        hexCheckBox.setAlignmentY(Component.CENTER_ALIGNMENT);
        
        // 命令文本框
        // 命令文本框
        JTextField commandField = new JTextField(command);
        commandField.setMaximumSize(new Dimension(Integer.MAX_VALUE, 30)); // 限制高度,宽度自适应
        commandField.setMaximumSize(new Dimension(Integer.MAX_VALUE, 30)); // 限制高度,宽度自适应
        
        // 发送按钮
        // 发送按钮
        JButton sendButton = createSendButton();
        sendButton.addActionListener(new ActionListener() {
            @Override
@@ -130,11 +130,11 @@
            }
        });
        
        // 添加组件到行面板
        // 添加组件到行面板
        rowPanel.add(hexCheckBox);
        rowPanel.add(Box.createHorizontalStrut(5)); // HEX复选框与文本框间隔5像素
        rowPanel.add(Box.createHorizontalStrut(5)); // HEX复选框与文本框间隔5像素
        rowPanel.add(commandField);
        rowPanel.add(Box.createHorizontalStrut(10)); // 文本框与按钮间隔10像素
        rowPanel.add(Box.createHorizontalStrut(10)); // 文本框与按钮间隔10像素
        rowPanel.add(sendButton);
        
        commandPanel.add(rowPanel);
@@ -143,38 +143,38 @@
    private JButton createSendButton() {
        JButton button = new JButton(getString(mainFrame, "send"));
        
        // 设置按钮大小为60×20(宽×高)
        // 设置按钮大小为60×20(宽×高)
        button.setPreferredSize(new Dimension(80, 20));
        button.setMinimumSize(new Dimension(80, 20));
        button.setMaximumSize(new Dimension(80, 20));
        
        // 设置按钮样式
        // 设置按钮样式
        button.setBackground(new Color(0, 120, 215));
        button.setForeground(Color.WHITE);
        button.setFocusPainted(false);
        button.setBorderPainted(false);
        button.setFont(button.getFont().deriveFont(Font.BOLD, 12f));
        
        // 添加鼠标交互效果
        // 添加鼠标交互效果
        button.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                button.setBackground(new Color(0, 150, 255)); // 悬停时变亮
                button.setBackground(new Color(0, 150, 255)); // 悬停时变亮
                button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
            }
            
            public void mouseExited(java.awt.event.MouseEvent evt) {
                button.setBackground(new Color(0, 120, 215)); // 恢复正常颜色
                button.setBackground(new Color(0, 120, 215)); // 恢复正常颜色
                button.setCursor(Cursor.getDefaultCursor());
            }
            
            public void mousePressed(java.awt.event.MouseEvent evt) {
                // 点击效果 - 颜色变深并有轻微缩小效果
                // 点击效果 - 颜色变深并有轻微缩小效果
                button.setBackground(new Color(0, 80, 160));
                button.setBounds(button.getX() + 1, button.getY() + 1, 58, 18);
            }
            
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                // 恢复原状
                // 恢复原状
                button.setBackground(new Color(0, 150, 255));
                button.setBounds(button.getX() - 1, button.getY() - 1, 60, 20);
            }
@@ -229,16 +229,16 @@
            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(mainFrame, "send")).append(": ");
        
        // 根据HEX发送选项格式化内容
        // 根据HEX发送选项格式化内容
        if (isHex) {
            logMessage.append("HEX ");
            logMessage.append(command);
@@ -250,28 +250,28 @@
        logMessage.append(" [").append(getString(mainFrame, "extension.command")).append("]");
        logMessage.append("\n");
        
        // 将发送信息添加到数据日志面板
        // 将发送信息添加到数据日志面板
        addLogToDataLogPanel(logMessage.toString());
        
        // 调用主框架的发送方法
        // 调用主框架的发送方法
        if (mainFrame != null) {
            mainFrame.sendDataFromExtension(command, isHex);
        }
    }
    
    /**
     * 将日志信息添加到数据日志面板
     * @param logMessage 日志信息
     * 将日志信息添加到数据日志面板
     * @param logMessage 日志信息
     */
    private void addLogToDataLogPanel(String logMessage) {
        try {
            // 通过主框架获取DataLogPanel实例
            // 通过主框架获取DataLogPanel实例
            if (mainFrame != null) {
                // 直接调用MainFrame的日志添加方法,避免使用反射
                // 直接调用MainFrame的日志添加方法,避免使用反射
                mainFrame.addToDataLog(logMessage);
            }
        } catch (Exception ex) {
            // 备用方案:尝试使用反射
            // 备用方案:尝试使用反射
            try {
                DataLogPanel dataLogPanel = mainFrame.getDataLogPanel();
                if (dataLogPanel != null) {
@@ -281,16 +281,16 @@
                    
                    if (logArea != null) {
                        logArea.append(logMessage);
                        // 自动滚动到最后
                        // 自动滚动到最后
                        logArea.setCaretPosition(logArea.getDocument().getLength());
                    }
                }
            } catch (Exception e) {
                System.err.println("无法访问数据日志区域: " + e.getMessage());
                // 显示错误信息
                System.err.println("无法访问数据日志区域: " + e.getMessage());
                // 显示错误信息
                JOptionPane.showMessageDialog(this,
                    "无法在数据日志中显示内容: " + e.getMessage(),
                    "错误",
                    getString(mainFrame, "cannot.display.in.data.log") + ": " + e.getMessage(),
                    getString(mainFrame, "error"),
                    JOptionPane.ERROR_MESSAGE);
            }
        }