12.6Swing控件4 JSplitPane JTabbedPane

news2025/6/7 12:04:57

JSplitPane

JSplitPane 是 Java Swing 中用于创建分隔面板的组件,支持两个可调整大小组件的容器。它允许用户通过拖动分隔条来调整两个组件的相对大小,适合用于需要动态调整视图比例的场景。

  • 常用方法
    • setLeftComponent(Component comp):设置左侧组件。
    • setRightComponent(Component comp) 或 setBottomComponent(Component comp):根据方向设置另一侧组件。
    • setDividerLocation(int location):设置分割条的位置。

1. 基本概念与特点

  • 分隔方向:支持水平分隔(HORIZONTAL_SPLIT)和垂直分隔(VERTICAL_SPLIT)。
  • 子组件:只能包含两个组件(左 / 右或上 / 下),通过 setLeftComponent()setRightComponent() 或 setTopComponent()setBottomComponent() 设置。
  • 分隔条(Divider):可自定义宽度、颜色和样式,支持拖动调整大小。
  • 连续布局:拖动分隔条时是否实时更新布局(setContinuousLayout(true))。
  • 一键折叠:支持通过 setOneTouchExpandable(true) 添加快速折叠按钮。

2. 常用构造方法

构造方法描述
JSplitPane()创建默认水平分隔的面板,使用 FlowLayout,无初始组件。
JSplitPane(int orientation)指定分隔方向(HORIZONTAL_SPLIT 或 VERTICAL_SPLIT)。
JSplitPane(int orientation, boolean continuousLayout)指定分隔方向和是否启用连续布局。
JSplitPane(int orientation, Component leftComponent, Component rightComponent)指定分隔方向和初始子组件。

3. 核心方法

方法描述
setDividerLocation(double proportionalLocation)设置分隔条位置(0.0~1.0 表示比例)。
setDividerLocation(int location)设置分隔条的绝对位置(像素值)。
setDividerSize(int newSize)设置分隔条的宽度。
setOneTouchExpandable(boolean newValue)启用 / 禁用一键折叠功能。
setContinuousLayout(boolean newContinuousLayout)启用 / 禁用连续布局(拖动时分隔条是否实时更新)。
setLeftComponent(Component comp) / setTopComponent(Component comp)设置左侧 / 顶部组件。
setRightComponent(Component comp) / setBottomComponent(Component comp)设置右侧 / 底部组件。

4. 简单示例:水平分隔面板

import javax.swing.*;
import java.awt.*;

public class JSplitPaneExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("JSplitPane 示例");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 400);

        // 创建左侧面板(列表)
        JList<String> list = new JList<>(new String[]{"项目1", "项目2", "项目3", "项目4"});
        JScrollPane leftPanel = new JScrollPane(list);

        // 创建右侧面板(文本区域)
        JTextArea textArea = new JTextArea("这是右侧面板内容...");
        JScrollPane rightPanel = new JScrollPane(textArea);

        // 创建水平分隔面板
        JSplitPane splitPane = new JSplitPane(
            JSplitPane.HORIZONTAL_SPLIT,  // 水平分隔
            leftPanel,                    // 左侧组件
            rightPanel                    // 右侧组件
        );

        // 设置分隔条初始位置(比例)
        splitPane.setDividerLocation(0.3);
        // 启用一键折叠功能
        splitPane.setOneTouchExpandable(true);
        // 启用连续布局
        splitPane.setContinuousLayout(true);

        frame.add(splitPane);
        frame.setVisible(true);
    }
}

5. 嵌套分隔面板示例

通过嵌套 JSplitPane 可创建复杂的布局:

import javax.swing.*;
import java.awt.*;

public class NestedSplitPaneExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("嵌套 JSplitPane 示例");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 600);

        // 创建顶部面板(文本区域)
        JTextArea topTextArea = new JTextArea("这是顶部面板...");
        JScrollPane topPanel = new JScrollPane(topTextArea);

        // 创建左侧面板(列表)
        JList<String> leftList = new JList<>(new String[]{"选项1", "选项2", "选项3"});
        JScrollPane leftPanel = new JScrollPane(leftList);

        // 创建右侧上部面板(表格)
        String[] columnNames = {"ID", "名称"};
        Object[][] data = {{1, "项目A"}, {2, "项目B"}, {3, "项目C"}};
        JTable table = new JTable(data, columnNames);
        JScrollPane rightTopPanel = new JScrollPane(table);

        // 创建右侧下部面板(文本区域)
        JTextArea bottomTextArea = new JTextArea("这是底部面板...");
        JScrollPane rightBottomPanel = new JScrollPane(bottomTextArea);

        // 创建右侧垂直分隔面板
        JSplitPane rightSplitPane = new JSplitPane(
            JSplitPane.VERTICAL_SPLIT,
            rightTopPanel,
            rightBottomPanel
        );
        rightSplitPane.setDividerLocation(0.5);

        // 创建主水平分隔面板
        JSplitPane mainSplitPane = new JSplitPane(
            JSplitPane.HORIZONTAL_SPLIT,
            leftPanel,
            rightSplitPane
        );
        mainSplitPane.setDividerLocation(0.3);

        // 创建最终的垂直分隔面板(顶部面板和主分隔面板)
        JSplitPane finalSplitPane = new JSplitPane(
            JSplitPane.VERTICAL_SPLIT,
            topPanel,
            mainSplitPane
        );
        finalSplitPane.setDividerLocation(0.2);

        frame.add(finalSplitPane);
        frame.setVisible(true);
    }
}

6. 自定义分隔条样式

通过设置 UI 属性或子类化 BasicSplitPaneUI 可自定义分隔条外观:

import javax.swing.*;
import javax.swing.plaf.basic.BasicSplitPaneDivider;
import javax.swing.plaf.basic.BasicSplitPaneUI;
import java.awt.*;

public class CustomDividerExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("自定义分隔条示例");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 400);

        JSplitPane splitPane = new JSplitPane(
            JSplitPane.HORIZONTAL_SPLIT,
            new JLabel("左侧面板"),
            new JLabel("右侧面板")
        );

        // 自定义分隔条样式
        splitPane.setUI(new BasicSplitPaneUI() {
            @Override
            public BasicSplitPaneDivider createDefaultDivider() {
                return new BasicSplitPaneDivider(this) {
                    @Override
                    public void paint(Graphics g) {
                        // 绘制自定义分隔条
                        g.setColor(Color.RED);
                        g.fillRect(0, 0, getSize().width, getSize().height);
                        super.paint(g);
                    }
                };
            }
        });

        // 设置分隔条宽度
        splitPane.setDividerSize(10);

        frame.add(splitPane);
        frame.setVisible(true);
    }
}

7. 监听分隔条位置变化

通过 PropertyChangeListener 监听 dividerLocation 属性变化:

import javax.swing.*;
import java.awt.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

public class DividerListenerExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("分隔条监听示例");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 400);

        JSplitPane splitPane = new JSplitPane(
            JSplitPane.HORIZONTAL_SPLIT,
            new JLabel("左侧面板"),
            new JLabel("右侧面板")
        );

        // 添加分隔条位置变化监听器
        splitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent e) {
                System.out.println("分隔条位置变化:" + e.getOldValue() + " -> " + e.getNewValue());
            }
        });

        frame.add(splitPane);
        frame.setVisible(true);
    }
}

8. 注意事项

  1. 组件大小JSplitPane 会根据子组件的首选大小初始化分隔条位置,可通过 setPreferredSize() 调整。
  2. 禁用拖动:通过重写 Divider 的 mouseDragged() 方法可禁用分隔条拖动:
    splitPane.setUI(new BasicSplitPaneUI() {
        @Override
        public BasicSplitPaneDivider createDefaultDivider() {
            return new BasicSplitPaneDivider(this) {
                @Override
                public void mouseDragged(java.awt.event.MouseEvent e) {
                    // 空实现,禁用拖动
                }
            };
        }
    });
    

  3. 持久化分隔条位置:可通过 getDividerLocation() 获取当前位置,并在下次启动时通过 setDividerLocation() 恢复。

JSplitPane 是 Java Swing 中创建动态分隔界面的强大组件,通过简单配置即可实现灵活的布局。其核心优势在于支持嵌套结构、实时调整和自定义样式,适用于需要动态分配空间的应用场景(如编辑器、文件管理器等)。

JTabbedPane

JTabbedPane 是 Java Swing 中用于创建选项卡式界面的组件 提供了一个选项卡式的界面,允许用户通过点击不同的选项卡来切换内容视图。每个选项卡可以包含不同的组件或信息,非常适合用于多页面的应用程序界面。

  • 常用方法
    • addTab(String title, Component component):添加一个新的选项卡。
    • setSelectedIndex(int index):选择指定索引处的选项卡。
    • setTitleAt(int index, String title):设置指定索引处选项卡的标题。

1. 基本概念与特点

  • 选项卡布局:支持顶部、底部、左侧或右侧放置标签。
  • 标签样式:可自定义标签文本、图标和工具提示。
  • 组件关联:每个标签对应一个组件(如 JPanelJTextArea 等)。
  • 动态操作:支持添加、删除和重排序标签。
  • 事件监听:可监听标签切换事件。

2. 常用构造方法

构造方法描述
JTabbedPane()创建默认标签位于顶部的选项卡面板。
JTabbedPane(int tabPlacement)指定标签位置(TOPBOTTOMLEFTRIGHT)。
JTabbedPane(int tabPlacement, int tabLayoutPolicy)指定标签位置和布局策略(WRAP_TAB_LAYOUT 或 SCROLL_TAB_LAYOUT)。

3. 核心方法

方法描述
addTab(String title, Component component)添加带标题的标签页。
addTab(String title, Icon icon, Component component)添加带标题和图标的标签页。
addTab(String title, Icon icon, Component component, String tip)添加带标题、图标和工具提示的标签页。
insertTab(String title, Icon icon, Component component, String tip, int index)在指定位置插入标签页。
removeTabAt(int index)移除指定位置的标签页。
setSelectedIndex(int index)选择指定索引的标签页。
setTabComponentAt(int index, Component component)设置标签的自定义组件(如带关闭按钮的标签)。
setTitleAt(int index, String title)修改指定标签的标题。
setIconAt(int index, Icon icon)修改指定标签的图标。
addChangeListener(ChangeListener listener)添加标签切换事件监听器。

4. 简单示例:基本选项卡面板

import javax.swing.*;
import java.awt.*;

public class JTabbedPaneExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("JTabbedPane 示例");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 400);

        // 创建选项卡面板
        JTabbedPane tabbedPane = new JTabbedPane();

        // 添加第一个标签页
        JPanel panel1 = new JPanel();
        panel1.add(new JLabel("这是第一个标签页"));
        tabbedPane.addTab("标签1", panel1);

        // 添加第二个标签页(带图标)
        JPanel panel2 = new JPanel();
        panel2.add(new JLabel("这是第二个标签页"));
        Icon icon = new ImageIcon("path/to/icon.png"); // 替换为实际图标路径
        tabbedPane.addTab("标签2", icon, panel2, "这是第二个标签的提示");

        // 添加第三个标签页
        JPanel panel3 = new JPanel();
        panel3.add(new JLabel("这是第三个标签页"));
        tabbedPane.addTab("标签3", panel3);

        frame.add(tabbedPane);
        frame.setVisible(true);
    }
}

5. 标签位置与布局策略示例

import javax.swing.*;
import java.awt.*;

public class TabPlacementExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("标签位置示例");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 600);

        // 创建一个大的选项卡面板,包含四个方向的标签子面板
        JTabbedPane mainTabbedPane = new JTabbedPane();

        // 顶部标签
        JTabbedPane topTabs = new JTabbedPane(JTabbedPane.TOP);
        topTabs.addTab("顶部1", new JLabel("顶部标签1"));
        topTabs.addTab("顶部2", new JLabel("顶部标签2"));
        mainTabbedPane.addTab("顶部标签", topTabs);

        // 底部标签
        JTabbedPane bottomTabs = new JTabbedPane(JTabbedPane.BOTTOM);
        bottomTabs.addTab("底部1", new JLabel("底部标签1"));
        bottomTabs.addTab("底部2", new JLabel("底部标签2"));
        mainTabbedPane.addTab("底部标签", bottomTabs);

        // 左侧标签
        JTabbedPane leftTabs = new JTabbedPane(JTabbedPane.LEFT);
        leftTabs.addTab("左侧1", new JLabel("左侧标签1"));
        leftTabs.addTab("左侧2", new JLabel("左侧标签2"));
        mainTabbedPane.addTab("左侧标签", leftTabs);

        // 右侧标签
        JTabbedPane rightTabs = new JTabbedPane(JTabbedPane.RIGHT);
        rightTabs.addTab("右侧1", new JLabel("右侧标签1"));
        rightTabs.addTab("右侧2", new JLabel("右侧标签2"));
        mainTabbedPane.addTab("右侧标签", rightTabs);

        frame.add(mainTabbedPane);
        frame.setVisible(true);
    }
}

6. 动态操作与事件监听

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

public class DynamicTabExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("动态选项卡示例");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 400);

        JTabbedPane tabbedPane = new JTabbedPane();

        // 添加初始标签页
        tabbedPane.addTab("标签1", new JLabel("初始标签页"));

        // 创建操作面板
        JPanel controlPanel = new JPanel();
        JButton addButton = new JButton("添加标签");
        JButton removeButton = new JButton("删除当前标签");
        controlPanel.add(addButton);
        controlPanel.add(removeButton);

        // 添加标签按钮事件
        addButton.addActionListener(new ActionListener() {
            private int tabCount = 2;
            @Override
            public void actionPerformed(ActionEvent e) {
                tabbedPane.addTab("标签" + tabCount, new JLabel("新标签页 " + tabCount));
                tabCount++;
            }
        });

        // 删除标签按钮事件
        removeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int selectedIndex = tabbedPane.getSelectedIndex();
                if (selectedIndex >= 0) {
                    tabbedPane.removeTabAt(selectedIndex);
                }
            }
        });

        // 添加标签切换监听器
        tabbedPane.addChangeListener(e -> {
            int selectedIndex = tabbedPane.getSelectedIndex();
            if (selectedIndex >= 0) {
                System.out.println("切换到标签:" + tabbedPane.getTitleAt(selectedIndex));
            }
        });

        // 使用 BorderLayout 添加组件
        frame.getContentPane().add(tabbedPane, BorderLayout.CENTER);
        frame.getContentPane().add(controlPanel, BorderLayout.SOUTH);

        frame.setVisible(true);
    }
}

7. 自定义标签组件(带关闭按钮)

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ClosableTabExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("带关闭按钮的标签");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 400);

        JTabbedPane tabbedPane = new JTabbedPane();

        // 添加初始标签页
        addClosableTab(tabbedPane, "标签1", new JLabel("内容 1"));
        addClosableTab(tabbedPane, "标签2", new JLabel("内容 2"));

        frame.add(tabbedPane);
        frame.setVisible(true);
    }

    private static void addClosableTab(JTabbedPane tabbedPane, String title, Component content) {
        // 添加标签页
        tabbedPane.addTab(title, content);
        
        // 获取标签索引
        int index = tabbedPane.indexOfTab(title);
        
        // 创建自定义标签组件(带文本和关闭按钮)
        JPanel tabComponent = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
        tabComponent.setOpaque(false);
        
        JLabel titleLabel = new JLabel(title);
        tabComponent.add(titleLabel);
        
        JButton closeButton = new JButton("×");
        closeButton.setBorder(null);
        closeButton.setContentAreaFilled(false);
        closeButton.setFocusPainted(false);
        closeButton.setMargin(new Insets(0, 0, 0, 0));
        closeButton.addActionListener(e -> tabbedPane.remove(index));
        tabComponent.add(closeButton);
        
        // 设置自定义标签组件
        tabbedPane.setTabComponentAt(index, tabComponent);
    }
}

8. 注意事项

  1. 布局策略:当标签过多时,可使用 SCROLL_TAB_LAYOUT 启用滚动:

    JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT);
    
  2. 键盘导航:默认支持 Ctrl+Tab 和 Ctrl+Shift+Tab 切换标签,可通过 setMnemonicAt() 设置快捷键。

  3. 标签图标:图标应保持简洁,避免过大影响布局。

  4. 预加载与懒加载

    • 预加载:在初始化时创建所有标签页的组件。
    • 懒加载:在首次切换到标签页时创建组件(通过监听 ChangeListener 实现)。

JTabbedPane 是 Java Swing 中组织多页面界面的高效组件,通过标签切换可有效节省屏幕空间。其核心优势在于支持多种标签布局、动态操作和自定义样式,适用于需要分类展示内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2402869.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python训练第四十六天

DAY 46 通道注意力(SE注意力) 知识点回顾&#xff1a; 不同CNN层的特征图&#xff1a;不同通道的特征图什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。通道注意力&#xff1a;模型的定义和插入的位置通…

第2天:认识LSTM

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: PyCharm 框 架: pytorch &#xff08;二&#xff09;具体步骤…

自动化提示生成框架(AutoPrompt)

自动化提示生成框架(AutoPrompt) 一、核心创新点 自动化提示生成框架(AutoPrompt) 创新本质:提出基于梯度引导搜索的自动化提示生成方法,替代人工设计模板的传统模式。技术路径: 将提示视为可训练的离散token序列,通过优化提示向量(prompt embedding)搜索语义空间。利…

中国首套1公里高分辨率大气湿度指数数据集(2003~2020)

时间分辨率&#xff1a;月空间分辨率&#xff1a;100m - 1km共享方式&#xff1a;开放获取数据大小&#xff1a;34.79 GB数据时间范围&#xff1a;2003-01-01 — 2020-12-31元数据更新时间&#xff1a;2023-07-26 数据集摘要 中国首套1公里高分辨率大气湿度指数数据集&#xf…

计算机视觉顶刊《International Journal of Computer Vision》2025年5月前沿热点可视化分析

追踪计算机视觉领域的前沿热点是把握技术发展方向、推动创新落地的关键&#xff0c;分析这些热点&#xff0c;不仅能洞察技术趋势&#xff0c;更能为科研选题和工程实践提供重要参考。本文对计算机视觉顶刊《International Journal of Computer Vision》2025年5月前沿热点进行了…

python学习打卡day45

DAY 45 Tensorboard使用介绍 知识点回顾&#xff1a; tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战&#xff1a;MLP和CNN模型 效果展示如下&#xff0c;很适合拿去组会汇报撑页数&#xff1a; 作业&#xff1a;对resnet18在cifar10上采用微调策…

Verilog编程技巧01——如何编写三段式状态机

前言 Verilog编程技巧系列文章将聚焦于介绍Verilog的各种编程范式或者说技巧&#xff0c;编程技巧和编程规范有部分重合&#xff0c;但并非完全一样。规范更注重编码的格式&#xff0c;像变量命名、缩进、注释风格等&#xff0c;而编程技巧则更偏重更直观易读、更便于维护、综合…

智启未来:当知识库遇见莫奈的调色盘——API工作流重构企业服务美学

目录 引言 一、初识蓝耘元生代MaaS平台 1.1 平台架构 1.2 平台的优势 1.3 应用场景 二、手把手教你如何在蓝耘进行注册 &#xff08;1&#xff09;输入手机号&#xff0c;将验证码正确填入即可快速完成注册 &#xff08;2&#xff09;进入下面的页面表示已经成功注册&…

如何在 Windows 11 中永久更改默认浏览器:阻止 Edge 占据主导地位

在 Windows 11 中更改默认浏览器对于新手或技术不太熟练的用户来说可能会令人沮丧。 为什么要在 Windows 11 中更改默认浏览器? 这是一个重要的问题:你为什么要从 Microsoft Edge 切换过来? 生态系统集成:如果你已经在广泛使用 Google 服务,Chrome 可以提供无缝集成。同…

量子比特实现方式

经典计算机是通过电子电路运转起来的。使用硅制半导体制成的名为晶体管的小元件发挥了开关的作用&#xff0c;将其与金属布线组合起来即可实现逻辑门&#xff0c;再将逻辑门集成起来就能制造出经典计算机。量子计算机的制造过程则要复杂许多&#xff0c;因为量子计算机既需要量…

智慧水务发展迅猛:从物联网架构到AIoT系统的跨越式升级

AI大模型引领智慧水务迈入新纪元 2025年5月25日&#xff0c;水利部自主研发的“水利标准AI大模型”正式发布&#xff0c;它标志着水务行业智能化进程的重大突破。该模型集成1800余项水利标准、500余项法规及海量科研数据&#xff0c;支持立项、编制、审查等全流程智能管理&…

Java高级 | 【实验五】Spring boot+mybatis操作数据库

隶书文章&#xff1a;Java高级 | &#xff08;二十二&#xff09;Java常用类库-CSDN博客 系列文章&#xff1a;Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…

在MATLAB中使用自定义的ROS2消息

简明结论&#xff1a; 无论ROS2节点和MATLAB运行在哪&#xff0c;MATLAB本机都必须拥有自定义消息源码并本地用ros2genmsg生成&#xff0c;才能在Simulink里订阅这些消息。只要你想让MATLAB或Simulink能识别自定义消息&#xff0c;必须把消息包源码(.msg等)拷到本机指定目录&a…

【MATLAB去噪算法】基于ICEEMDAN联合小波阈值去噪算法

ICEEMDAN联合小波阈值去噪算法相关文献 &#xff08;注&#xff1a;目前相关论文较少&#xff0c;应用该套代码可发直接一些水刊&#xff09; 一、CEEMDAN的局限性 模式残留噪声问题&#xff1a;原始CEEMDAN在计算每个IMF时直接对噪声扰动的信号进行模态分解并平均。 后果&a…

XXTEA,XTEA与TEA

TEA、XTEA和XXTEA都是分组加密算法&#xff0c;它们在设计、安全性、性能等方面存在显著区别。以下是它们的主要区别&#xff1a; 密钥长度 TEA&#xff1a;使用128位密钥。 XTEA&#xff1a;通常使用128位或256位密钥。 XXTEA&#xff1a;密钥长度更灵活&#xff0c;可以使用任…

机器人玩转之---嵌入式开发板基础知识到实战选型指南(包含ORIN、RDK X5、Raspberry pi、RK系列等)

1. 基础知识讲解 1.1 什么是嵌入式开发板&#xff1f; 嵌入式开发板是一种专门设计用于嵌入式系统开发的硬件平台&#xff0c;它集成了微处理器、内存、存储、输入输出接口等核心组件于单块印刷电路板上。与传统的PC不同&#xff0c;嵌入式开发板具有体积小、功耗低、成本适中…

腾讯云国际版和国内版账户通用吗?一样吗?为什么?

在当今全球化的数字化时代&#xff0c;云计算服务成为众多企业和个人拓展业务、存储数据的重要选择。腾讯云作为国内领先的云服务提供商&#xff0c;其国际版和国内版备受关注。那么&#xff0c;腾讯云国际版和国内版账户是否通用&#xff1f;它们究竟一样吗&#xff1f;背后又…

OrCAD X Capture CIS设计小诀窍系列第二季--03.如何在Capture中输出带有目录和元器件信息的PDF

背景介绍&#xff1a;我们在进行原理图设计时&#xff0c;经常需要输出PDF来查看或评审&#xff0c;但通过”Print”功能导出的PDF较为简单&#xff0c;只能查看设计视图&#xff1b;而通过使用Ghostscript软件可以输出带有目录和元器件信息的PDF&#xff0c;让设计师可以直接在…

汽车的安全性能测试:试验台铁地板的重要性

汽车的安全性能测试是非常重要的&#xff0c;其中试验台铁地板的设计和材料选择起着至关重要的作用。试验台铁地板是指在进行汽车碰撞、侧翻等试验时&#xff0c;用于支撑汽车底部和提供稳定支撑的重要部件。 在进行汽车碰撞试验时&#xff0c;试验台铁地板的设计和材料需要具…

实践指南:从零开始搭建RAG驱动的智能问答系统

LLM 赋能的最强大的应用之一是复杂的问答 (Q&A) 聊天机器人。这些是可以回答关于特定来源信息问题的应用程序。这些应用程序使用一种称为检索增强生成的技术&#xff0c;或 RAG。本文将展示如何基于 LangChain 构建一个简单的基于非结构化数据文本数据源的问答应用程序。 温…