当前位置: 首页 > article >正文

12.6Swing控件4 JSplitPane JTabbedPane

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() {@Overridepublic BasicSplitPaneDivider createDefaultDivider() {return new BasicSplitPaneDivider(this) {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic BasicSplitPaneDivider createDefaultDivider() {return new BasicSplitPaneDivider(this) {@Overridepublic 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;@Overridepublic void actionPerformed(ActionEvent e) {tabbedPane.addTab("标签" + tabCount, new JLabel("新标签页 " + tabCount));tabCount++;}});// 删除标签按钮事件removeButton.addActionListener(new ActionListener() {@Overridepublic 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 中组织多页面界面的高效组件,通过标签切换可有效节省屏幕空间。其核心优势在于支持多种标签布局、动态操作和自定义样式,适用于需要分类展示内容

相关文章:

12.6Swing控件4 JSplitPane JTabbedPane

JSplitPane JSplitPane 是 Java Swing 中用于创建分隔面板的组件&#xff0c;支持两个可调整大小组件的容器。它允许用户通过拖动分隔条来调整两个组件的相对大小&#xff0c;适合用于需要动态调整视图比例的场景。 常用方法&#xff1a; setLeftComponent(Component comp)&a…...

Python训练第四十六天

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

C++编程——关于比较器的使用

注&#xff1a; 简单记录一下C里比较器的构建&#xff0c;常用于自定义 sort() 函数和优先队列的改写优先级。 简单构建比较器&#xff1a; sort() 函数&#xff1a; vector<int> arr;//(a, b) -> true : a < b //升序排列 bool compare(int a, int b) {retur…...

第2天:认识LSTM

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

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

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

两轮自平衡机器人建模、LQR控制与仿真分析

以下是一个针对两轮自平衡机器人(平衡车) 的完整建模、控制设计与仿真分析报告,包含详细的理论推导、控制算法实现及Python仿真代码。 两轮自平衡机器人建模、LQR控制与仿真分析 1. 引言 两轮自平衡机器人是一种典型的欠驱动、非线性、不稳定系统,其动力学特性与倒立摆高度…...

在NLP文本处理中,将字符映射到阿拉伯数字(构建词汇表vocab)的核心目的和意义

一、词汇表的核心作用 ‌数值化表示‌ 将离散的文本字符转换为连续的数值索引&#xff0c;使计算机能够处理非结构化的语言数据57。例如&#xff1a; "中国" → 2"a" → 5 ‌统一输入格式‌ 不同长度的文本通过填充/截断转换为固定长度的数字序列&#xf…...

中国首套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上采用微调策…...

JAVA元编程

一、引言&#xff1a;元编程的本质与 Java 实现 元编程&#xff08;Metaprogramming&#xff09;是一种 “操纵程序的程序” 的编程范式&#xff0c;其核心思想是通过代码动态操作代码本身。在 Java 中&#xff0c;元编程主要通过 ** 反射&#xff08;Reflection&#xff09;、…...

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

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

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

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

java教程笔记(十一)-泛型

Java 泛型&#xff08;Generics&#xff09;是 Java 5 引入的重要特性之一&#xff0c;它允许在定义类、接口和方法时使用类型参数。泛型的核心思想是将类型由具体的数据类型推迟到使用时再确定&#xff0c;从而提升代码的复用性和类型安全性。 1.泛型的基本概念 1. 什么是泛…...

JUnit​​ 和 ​​Mockito​​ 的详细说明及示例,涵盖核心概念、常用注解、测试场景和实战案例。

一、JUnit 详解 1. JUnit 核心概念 ​​测试类​​&#xff1a;以 Test 结尾的类&#xff08;或通过 Test 注解标记的方法&#xff09;。​​断言&#xff08;Assertions&#xff09;​​&#xff1a;验证预期结果与实际结果是否一致&#xff08;如 assertEquals()&#xff0…...

【Go语言基础【7】】条件语句

文章目录 零、概述一、if 条件语句1. 单条件模型2. 多条件模型&#xff08;else if&#xff09;3. 条件嵌套与优化 二、switch 条件判断1. 基本用法2. fallthrough 穿透执行3. break 终止执行 零、概述 语句类型适用场景核心特点if-else单条件或简单多条件判断逻辑清晰&#x…...

【Python 算法零基础 4.排序 ⑪ 十大排序算法总结】

目录 一、选择排序回顾 二、冒泡排序回顾 三、插入排序回顾 四、计数排序回顾 五、归并排序回顾 六、快速排序回顾 七、桶排序回顾 八、基数排序 九、堆排序 十、希尔排序 十一、十大排序算法对比 十二、各算法详解与应用场景 1. 选择排序&#xff08;Selection Sort&#xff…...

解决神经网络输出尺寸过小的实战方案

训练CIFAR10分类模型时出现报错&#xff1a;RuntimeError: Given input size: (256x1x1). Calculated output size: (256x0x0). Output size is too small。该问题由网络结构设计缺陷导致图像尺寸过度缩小引发。 核心原因分析 网络结构缺陷 原始模型采用六层卷积层&#xff0c…...

Python备忘

1. 自定义多线程程序&#xff1a; import concurrent.futures import threadingclass CustomThreadPool:def __init__(self, max_workers):self.max_workers max_workersself.pool concurrent.futures.ThreadPoolExecutor(max_workers)self.running_num 0self.semaphore t…...

如何在 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;支持立项、编制、审查等全流程智能管理&…...

1、cpp实现Python的print函数

实现一 #include <iostream> #include <list> #include <string>using namespace std;// 定义一个空的print函数&#xff0c;作为递归终止条件 void print(){// };// 可变参数模板函数&#xff0c;用于递归输出传入的参数 template <typename T, typenam…...

【Linux基础知识系列】第十四篇-系统监控与性能优化

一、简介 随着信息技术的飞速发展&#xff0c;Linux系统在服务器领域占据着重要地位。无论是web服务器、数据库服务器还是文件服务器&#xff0c;都需要高效的运行以满足业务需求。系统监控与性能优化是确保Linux系统稳定、高效运行的关键任务。通过实时监测系统资源的使用情况…...

云原生思维重塑数字化基座:从理念到实践的深度剖析

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;云原生为何成为数字化的“基础设施语言”&#xff1f; 随着5G、人工智能、物联网等技术逐步进入规模化落地阶段&am…...

Animate On Scroll 用于在用户滚动页面时实现元素的动画效果

AOS (Animate On Scroll) 详细介绍 什么是AOS&#xff1f; AOS&#xff08;Animate On Scroll&#xff09;是一个轻量级的JavaScript库&#xff0c;用于在用户滚动页面时实现元素的动画效果。它允许网页元素在进入或离开视口&#xff08;viewport&#xff09;时触发各种CSS动…...

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

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

[蓝桥杯]搭积木

搭积木 题目描述 小明对搭积木非常感兴趣。他的积木都是同样大小的正立方体。 在搭积木时&#xff0c;小明选取 mm 块积木作为地基&#xff0c;将他们在桌子上一字排开&#xff0c;中间不留空隙&#xff0c;并称其为第 0 层。 随后&#xff0c;小明可以在上面摆放第 1 层&a…...

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

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

使用C/C++和OpenCV实现图像拼接

使用 C 和 OpenCV 实现图像拼接 本文将详细介绍如何利用 OpenCV 库&#xff0c;在 C 环境中实现图像拼接。图像拼接技术可以将多张具有重叠区域的图像合成为一张高分辨率的全景图。OpenCV 提供了一个功能强大的 Stitcher 类&#xff0c;它封装了从特征点检测、匹配到图像融合的…...