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 中組織多頁面界面的高效組件,通過標簽切換可有效節省屏幕空間。其核心優勢在于支持多種標簽布局、動態操作和自定義樣式,適用于需要分類展示內容

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908462.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908462.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908462.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spark 單機模式部署與啟動

&#x1f680; Spark 單機模式部署與啟動教程&#xff08;適配 Hadoop 3.1.1&#xff09; 本文記錄了在 Linux 環境中部署 Spark 的完整過程&#xff0c;使用 Standalone 單機模式&#xff0c;適配 Hadoop 3.1.1&#xff0c;最終可通過 Web 頁面訪問 Spark Master 狀態界面。 …

JAVA學習 DAY2 java程序運行、注意事項、轉義字符

本系列可作為JAVA學習系列的筆記&#xff0c;文中提到的一些練習的代碼&#xff0c;小編會將代碼復制下來&#xff0c;大家復制下來就可以練習了&#xff0c;方便大家學習。 點贊關注不迷路&#xff01;您的點贊、關注和收藏是對小編最大的支持和鼓勵&#xff01; 系列文章目錄…

Visual Studio 中的 MD、MTD、MDD、MT 選項詳解

在Visual Studio中開發C++項目時,正確選擇運行時庫(runtime library)對于確保應用程序的性能、穩定性和兼容性至關重要。本文將詳細介紹/MD, /MT, /MDd, 和 /MTd這些編譯器選項的意義、應用場景及其區別。 MSVCRT.dll MSVCRT.dll 是 Microsoft Visual C++ Runtime Library …

EasyRTC嵌入式音視頻通信SDK助力物聯網/視頻物聯網音視頻打造全場景應用

一、方案概述? 隨著物聯網技術的飛速發展&#xff0c;視頻物聯網在各行業的應用日益廣泛。實時音視頻通信技術作為視頻物聯網的核心支撐&#xff0c;其性能直接影響著系統的交互體驗和信息傳遞效率。EasyRTC作為一款成熟的音視頻框架&#xff0c;具備低延遲、高畫質、跨平臺等…

棧的概念以及實現

目錄: 一、棧的概念 二、棧的實現 1.棧的初始化 2.棧的銷毀 3.入棧 4.出棧 5.獲取棧頂數據 6.判斷棧是否為空 7.獲取棧的個數 三、代碼 一、棧的概念 棧是一種特殊的線性表&#xff0c;其只允許在固定的一端進行插入和刪除元素操作。 進行數據插入和刪除操作的一端…

【Bluedroid】藍牙啟動之 SMP_Init 源碼解析

藍牙(安全管理協議,Security Management Protocol)是藍牙設備安全通信的核心協議,負責配對、密鑰協商和安全等級管理。本文圍繞 Bluedroid SMP 協議的初始化流程展開,系統解析其核心控制塊(tSMP_CB)的狀態管理、與 L2CAP 層的接口注冊,以及 P-256 橢圓曲線參數的初始化…

C++課設:考勤記錄系統

名人說&#xff1a;路漫漫其修遠兮&#xff0c;吾將上下而求索。—— 屈原《離騷》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 專欄介紹&#xff1a;《編程項目實戰》 目錄 一、項目背景與需求分析1. 傳統考勤管理…

前端面試題之ES6保姆級教程

ES6 核心特性深度解析&#xff1a;現代 JavaScript 開發基石 2015 年發布的 ECMAScript 2015&#xff08;ES6&#xff09;徹底改變了 JavaScript 的編程范式&#xff0c;本文將全面剖析其核心特性及最佳實踐 一、ES6 簡介與背景 ECMAScript 6.0&#xff08;簡稱 ES6&#xff0…

CTF:網絡安全的實戰演練場

文章目錄 每日一句正能量前言一、CTF簡介&#xff08;一&#xff09;什么是CTF&#xff1f;&#xff08;二&#xff09;CTF的歷史 二、CTF比賽形式&#xff08;一&#xff09;線上賽&#xff08;Online CTF&#xff09;&#xff08;二&#xff09;線下賽&#xff08;Offline CT…

如何自定義一個 Spring Boot Starter?

導語&#xff1a; 在后端 Java 面試中&#xff0c;Spring Boot 是繞不開的重點&#xff0c;而“如何自定義一個 Starter”作為進階開發能力的體現&#xff0c;常被面試官用于考察候選人的工程架構思維與 Spring Boot 底層掌握程度。本文將帶你深入理解自定義 Starter 的實現邏輯…

大學課程:計算機科學與技術專業主要課程,是否落伍了?

計算機科學與技術 計算機科學與技術&#xff08;CS&#xff09;是一門涵蓋理論、系統、應用的綜合學科&#xff0c;其課程體系圍繞“計算機的底層原理、開發方法、技術創新”展開&#xff0c;既包含數學與理論基礎&#xff0c;也涉及工程實踐與前沿技術。以下是主要課程的分類…

docker-部署Nginx以及Tomcat

一、docker 部署Nginx 1、搜索鏡像&#xff08;nginx&#xff09; [rootlocalhost /]# docker search nginx Error response from daemon: Get "https://index.docker.io/v1/search?qnginx&n25": dial tcp 192.133.77.133:443: connect: connection refused 簡…

服務器信任質詢

NSURLSession 與 NSURLAuthenticationMethodServerTrust —— 從零開始的“服務器信任質詢”全流程 目標讀者&#xff1a;剛接觸 iOS 網絡開發、準備理解 HTTPS 與證書校驗細節的同學 出發點&#xff1a;搞清楚為什么會有“質詢”、質詢的觸發時機、以及在 delegate 里怎么正確…

MCP協議重構AI Agent生態:萬能插槽如何終結工具孤島?

前言 在人工智能技術快速發展的2025年&#xff0c;MCP(Model Context Protocol&#xff0c;模型上下文協議)正逐漸成為AI Agent生態系統的關鍵基礎設施。這一由Anthropic主導的開放協議&#xff0c;旨在解決AI模型與外部工具和數據源之間的連接難題&#xff0c;被業界形象地稱…

測試 FreeSWITCH 的 mod_loopback

bgapi originate loopback/answer,park/default/inline park inline show channels as xml show calls as xml 有 2 個 channels 有 2 個 calls 比較有意思 在 loopback-a 是播放 wav 在 loopback-b 上可以錄音 這就是回環 有什么用呢&#xff1f; 除了做測試&#x…

三維GIS開發cesium智慧地鐵教程(4)城市白模加載與樣式控制

一、添加3D瓦片 <!-- 核心依賴引入 --> <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"><!-- 模型數據路徑 --> u…

Unity 中的顏色空間

一、顏色空間基本概念疑問 1、什么是顏色空間&#xff1f; 顏色空間是一個數學模型或系統&#xff0c;它定義了一套規則和方法&#xff0c;用來精確地描述、表示和組織顏色。? 可以把它想象成一個三維坐標系?&#xff08;或者有時更多維&#xff09; 每個維度代表一…

Mac下Android Studio掃描根目錄卡死問題記錄

環境信息 操作系統: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日構建) 問題現象 在項目開發過程中&#xff0c;提示一個依賴外部頭文件的cpp源文件需要同步&#xff0c;點…

Python----目標檢測(YOLO簡介)

一、 YOLO簡介 [YOLO](You Only Look Once&#xff09;是一種流行的物體檢測和圖像分割模型&#xff0c; 由華盛頓大學的約瑟夫-雷德蒙&#xff08;Joseph Redmon&#xff09;和阿里-法哈迪&#xff08;Ali Farhadi&#xff09;開發&#xff0c;YOLO 于 2015 年推出&#xff0c…

OLED(SSD306)移植全解-基于IIC

OLED&#xff08;SSD306&#xff09;移植全解-基于IIC 一&#xff0c;什么是oled?二&#xff0c;什么是IIC協議三&#xff0c;IIC通信流程&#xff1a;四&#xff0c;針對SSD1306的IIC通信流程&#xff08;結合芯片手冊版&#xff09;1&#xff0c;主機發送起始信號2&#xff…