12.7Swing控件6 JList

在 Java Swing 中,列表框(JList)是用于顯示一組選項的組件,用戶可以從中選擇一個或多個項目。以下是關于 Swing 列表框的詳細介紹:

1. 基本概念與用途

  • 作用:以垂直列表形式展示選項,支持單選或多選。
  • 常見場景:文件選擇、聯系人列表、設置選項等。

2. 核心類與方法

Swing 列表框的核心類是?JList,它繼承自?JComponent,主要方法包括:

  • 構造方法

    JList()                          // 創建空列表
    JList(Object[] listData)         // 通過數組創建列表
    JList(Vector<?> listData)        // 通過 Vector 創建列表
    JList(ListModel<?> dataModel)    // 通過數據模型創建列表
    
  • 選擇操作

    setSelectionMode(int mode)       // 設置選擇模式
    setSelectedIndex(int index)      // 選擇指定索引的項
    setSelectedIndices(int[] indices) // 選擇多個項
    getSelectedIndex()               // 獲取選中項的索引
    getSelectedIndices()             // 獲取所有選中項的索引
    getSelectedValue()               // 獲取選中項的值
    getSelectedValuesList()          // 獲取所有選中項的值列表
    
  • 外觀設置

    setVisibleRowCount(int n)        // 設置可見行數
    setFixedCellWidth(int width)     // 設置固定單元格寬度
    setFixedCellHeight(int height)   // 設置固定單元格高度
    setLayoutOrientation(int orientation) // 設置布局方向(水平/垂直)
    

3. 選擇模式

通過?setSelectionMode(int mode)?方法設置選擇模式,可選值為:

  • ListSelectionModel.SINGLE_SELECTION:單選模式。
  • ListSelectionModel.SINGLE_INTERVAL_SELECTION:連續多選模式(通過 Shift 鍵)。
  • ListSelectionModel.MULTIPLE_INTERVAL_SELECTION:任意多選模式(通過 Ctrl 鍵或鼠標拖拽)

JList 是 Swing 中的一個組件,它顯示一組固定的對象列表,允許用戶從中進行選擇。這些對象通常以文本形式顯示,但也可以是圖標或其他組件。JList 本身并不提供滾動功能,因此如果列表項超出可視區域,通常需要將其放置在一個 JScrollPane 中。

創建 JList

創建一個簡單的 JList 可以通過以下幾種方式:

  1. 基于數組:適用于已知固定數量的選項。
  2. 基于 Vector?或?基于 ListModel:更靈活,適合動態數據集。
import javax.swing.*;public class JListExample {public static void main(String[] args) {JFrame frame = new JFrame("JList 示例");DefaultListModel<String> listModel = new DefaultListModel<>();listModel.addElement("蘋果");listModel.addElement("香蕉");listModel.addElement("橙子");JList<String> list = new JList<>(listModel);JScrollPane scrollPane = new JScrollPane(list);frame.add(scrollPane);frame.setSize(300, 200);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}
}
重要屬性與方法
  • setSelectionMode(int mode): 設置選擇模式,如單選(ListSelectionModel.SINGLE_SELECTION)、單間隔多選(ListSelectionModel.SINGLE_INTERVAL_SELECTION)或多重任意選擇(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION)。
  • getSelectedIndex() / getSelectedIndices(): 獲取選中的索引或索引數組。
  • getSelectedValue(): 獲取當前選中的值。
  • addListSelectionListener(ListSelectionListener listener): 添加監聽器以響應選擇變化事件。
交互與事件處理

為了響應用戶的交互,比如選擇了不同的列表項,你可以添加一個 ListSelectionListener 來監聽選擇的變化。

list.addListSelectionListener(e -> {if (!e.getValueIsAdjusting()) {System.out.println("選中的項目: " + list.getSelectedValue());}
});

這里,getValueIsAdjusting() 方法用來判斷用戶是否還在拖動選擇范圍,避免在連續選擇時多次觸發事件。

4.綜合示例:水果選擇列表

下面是一個列表框示例,允許用戶選擇喜歡的水果:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class ListExample {public static void main(String[] args) {// 創建 JFrameJFrame frame = new JFrame("水果選擇列表");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(300, 300);frame.setLocationRelativeTo(null);// 創建水果數據String[] fruits = {"蘋果", "香蕉", "橙子", "葡萄", "草莓", "西瓜"};// 創建列表框JList<String> fruitList = new JList<>(fruits);fruitList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);fruitList.setVisibleRowCount(5); // 設置可見行數// 添加滾動條JScrollPane scrollPane = new JScrollPane(fruitList);// 創建按鈕和結果標簽JButton selectButton = new JButton("確定選擇");JLabel resultLabel = new JLabel("你選擇了: ");selectButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {StringBuilder selectedFruits = new StringBuilder();for (String fruit : fruitList.getSelectedValuesList()) {selectedFruits.append(fruit).append("、");}if (selectedFruits.length() > 0) {selectedFruits.deleteCharAt(selectedFruits.length() - 1); // 刪除最后一個頓號} else {selectedFruits.append("無");}resultLabel.setText("你選擇了: " + selectedFruits);}});// 添加組件到面板JPanel panel = new JPanel();panel.setLayout(new BorderLayout());panel.add(scrollPane, BorderLayout.CENTER);JPanel buttonPanel = new JPanel();buttonPanel.add(selectButton);buttonPanel.add(resultLabel);panel.add(buttonPanel, BorderLayout.SOUTH);frame.add(panel);frame.setVisible(true);}
}

5. 數據模型(ListModel)

JList 的數據可以通過?ListModel?動態管理,常用的實現類是?DefaultListModel

// 使用 DefaultListModel 創建可動態更新的列表
DefaultListModel<String> model = new DefaultListModel<>();
model.addElement("選項1");
model.addElement("選項2");
model.addElement("選項3");JList<String> dynamicList = new JList<>(model);// 動態添加元素
model.addElement("選項4");// 動態刪除元素
model.removeElement("選項2");

6. 自定義渲染器(ListCellRenderer)

通過自定義渲染器,可以改變列表項的外觀(如顏色、圖標、字體等):

// 自定義渲染器示例:為偶數行設置不同背景色
class CustomRenderer extends DefaultListCellRenderer {@Overridepublic Component getListCellRendererComponent(JList<?> list, Object value,int index, boolean isSelected,boolean cellHasFocus) {Component c = super.getListCellRendererComponent(list, value, index,isSelected, cellHasFocus);// 偶數行設置灰色背景if (index % 2 == 0 && !isSelected) {c.setBackground(Color.LIGHT_GRAY);}return c;}
}// 使用自定義渲染器
fruitList.setCellRenderer(new CustomRenderer());

7. 事件監聽

通過?ListSelectionListener?監聽列表選擇變化:

fruitList.addListSelectionListener(new ListSelectionListener() {@Overridepublic void valueChanged(ListSelectionEvent e) {if (!e.getValueIsAdjusting()) { // 防止多次觸發System.out.println("選中項索引: " + fruitList.getSelectedIndex());System.out.println("選中項值: " + fruitList.getSelectedValue());}}
});

8. 水平布局與包裝

通過?setLayoutOrientation?方法可以設置水平布局:

// 水平布局,自動換行
fruitList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
fruitList.setVisibleRowCount(0); // 0 表示根據內容自動計算行數

總結

Swing 列表框是一個功能豐富的組件,通過合理使用數據模型、選擇模式和渲染器,可以滿足各種復雜需求。注意在處理大量數據時使用虛擬列表(JList?默認支持)以提高性能。

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

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

相關文章

C++: condition_variable: wait_for -> unlock_wait_for_lock?

作為C++的初學者,面臨的一個很大的問題,就是很多的概念并不是可以通過名稱直觀的預知它要完成的細節,比如這里的condition_variable的wait_for。C++的設計意圖好像是,我告訴你這樣用,你只要這樣做就行,又簡單還實用!而且需要記住的規則量又大的驚人。最后看起來,更像是…

HTML版英語學習系統

HTML版英語學習系統 這是一個完全免費、無需安裝、功能完整的英語學習工具&#xff0c;使用HTML CSS JavaScript實現。 功能 文本朗讀練習 - 輸入英文文章&#xff0c;系統朗讀幫助練習聽力和發音&#xff0c;適合跟讀練習&#xff0c;模仿學習&#xff1b;實時詞典查詢 - 雙…

【JUC面試篇】Java并發編程高頻八股——線程與多線程

目錄 1. 什么是進程和線程&#xff1f;有什么區別和聯系&#xff1f; 2. Java的線程和操作系統的線程有什么區別&#xff1f; 3. 線程的創建方式有哪些? 4. 如何啟動和停止線程&#xff1f; 5. Java線程的狀態模型&#xff08;有哪些狀態&#xff09;&#xff1f; 6. 調用…

LSTM-SVM多變量時序預測(Matlab完整源碼和數據)

LSTM-SVM多變量時序預測&#xff08;Matlab完整源碼和數據&#xff09; 目錄 LSTM-SVM多變量時序預測&#xff08;Matlab完整源碼和數據&#xff09;效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 代碼主要功能 該代碼實現了一個LSTM-SVM多變量時序預測模型&#xff0c…

ES6——數組擴展之Set數組

在ES6&#xff08;ECMAScript 2015&#xff09;中&#xff0c;JavaScript的Set對象提供了一種存儲任何值唯一性的方式&#xff0c;類似于數組但又不需要索引訪問。這對于需要確保元素唯一性的場景非常有用。Set對象本身并不直接提供數組那樣的方法來操作數據&#xff08;例如ma…

日志收集工具-logstash

提示&#xff1a;Windows 環境下 安裝部署 logstash 采集日志文件 文章目錄 一、下載二、解壓部署三、常用插件四、常用配置 Logstash 服務器數據處理管道&#xff0c;能夠從多個來源采集數據&#xff0c;轉換數據&#xff0c;然后將數據發送到您最喜歡的存儲庫中。Logstash 沒…

6個月Python學習計劃 Day 21 - Python 學習前三周回顧總結

? 第一周&#xff1a;基礎入門與流程控制&#xff08;Day 1 - 7&#xff09; “打地基”的一周&#xff0c;我們走完了從變量、輸入輸出、判斷、循環到第一個小型系統的完整鏈路。 &#x1f4d8; 學習重點&#xff1a; Python 基礎語法&#xff1a;變量類型、字符串格式化、注…

Spring Boot SQL數據庫功能詳解

Spring Boot自動配置與數據源管理 數據源自動配置機制 當在Spring Boot項目中添加數據庫驅動依賴&#xff08;如org.postgresql:postgresql&#xff09;后&#xff0c;應用啟動時自動配置系統會嘗試創建DataSource實現。開發者只需提供基礎連接信息&#xff1a; 數據庫URL格…

java每日精進 6.11【消息隊列】

1.內存級Spring_Event 1.1 控制器層&#xff1a;StringTextController /*** 字符串文本管理控制器* 提供通過消息隊列異步獲取文本信息的接口*/ RestController RequestMapping("/api/string-text") public class StringTextController {Resourceprivate StringTex…

【凌智視覺模塊】rv1106 部署 ppocrv4 檢測模型 rknn 推理

PP-OCRv4 文本框檢測 1. 模型介紹 如有需要可以前往我們的倉庫進行查看 凌智視覺模塊 PP-OCRv4在PP-OCRv3的基礎上進一步升級。整體的框架圖保持了與PP-OCRv3相同的pipeline&#xff0c;針對檢測模型和識別模型進行了數據、網絡結構、訓練策略等多個模塊的優化。 從算法改…

uniapp Vue2 獲取電量的獨家方法:繞過官方插件限制

在使用 uniapp 進行跨平臺應用開發時&#xff0c;獲取設備電量信息是一個常見的需求。然而&#xff0c;uniapp 官方提供的uni.getBatteryInfo方法存在一定的局限性&#xff0c;它不僅需要下載插件&#xff0c;而且目前僅支持 Vue3&#xff0c;這讓使用 Vue2 進行開發的開發者陷…

Go語言中的if else控制語句

if else是Go語言中最基礎也最常用的條件控制語句&#xff0c;用于根據條件執行不同的代碼塊。下面我將詳細介紹Go語言中if else的各種用法和特性。 1. 基本語法 1.1. 最簡單的if語句 if 條件表達式 {// 條件為true時執行的代碼 } 示例&#xff1a; if x > 10 {fmt.Prin…

[Spring]-AOP

AOP場景 AOP: Aspect Oriented Programming (面向切面編程) OOP: Object Oriented Programming (面向對象編程) 場景設計 設計: 編寫一個計算器接口和實現類&#xff0c;提供加減乘除四則運算 需求: 在加減乘除運算的時候需要記錄操作日志(運算前參數、運算后結果)實現方案:…

Web3 借貸與清算機制全解析:鏈上金融的運行邏輯

Web3 借貸與清算機制全解析&#xff1a;鏈上金融的運行邏輯 超額抵押借款 例如&#xff0c;借款人用ETH為抵押借入DAI&#xff1b;借款人的ETH的價值一定是要超過DAI的價值&#xff1b;借款人可以任意自由的使用自己借出的DAI 穩定幣 第一步&#xff1a;借款人需要去提供一定…

RK3588開發筆記-GNSS-RTK模塊調試

目錄 前言 一、什么是GNSS/RTK 二、硬件連接 三、內核配置 四、模塊調試 五、ntripclient使用 總結 前言 在RK3588平臺上集成高精度定位功能是許多工業級應用的需求。本文記錄了我調試GNSS-RTK模塊的全過程,包含硬件連接、驅動移植、數據解析和精度優化等關鍵環節,希望對…

Vue.js $emit的介紹和簡單使用

前言 在 Vue.js 開發中&#xff0c;組件化是核心思想之一。但組件間的通信是一個重要課題&#xff0c;特別是子組件向父組件傳遞數據的場景。Vue 提供了多種通信方式&#xff0c;而$emit正是實現子→父通信的關鍵方法。本文將深入解析$emit的原理、使用場景及最佳實踐。 一、$e…

【Linux 學習計劃】-- 簡易版shell編寫

目錄 思路 創建自己的命令行 獲取用戶命令 分割命令 檢查是否是內建命令 cd命令實現 進程程序替換執行程序 總代碼 結語 思路 int main() {while (1){// 1. 自己的命令行PrintCommandLine();// 2. 獲取用戶命令char command[SIZE];int n GetUserCommand(command, si…

一個完整的日志收集方案:Elasticsearch + Logstash + Kibana+Filebeat (二)

&#x1f4c4; 本地 Windows 部署 Logstash 連接本地 Elasticsearch 指南 ? 目標 在本地 Windows 上安裝并運行 Logstash配置 Logstash 將數據發送至本地 Elasticsearch測試數據采集與 ES 存儲流程 &#x1f9f0; 前提條件 軟件版本要求安裝說明Java17Oracle JDK 下載 或 O…

Java使用Selenium反爬蟲優化方案

當我們爬取大站的時候&#xff0c;就得需要對抗反爬蟲機制的場景&#xff0c;因為項目要求使用Java和Selenium。Selenium通常用于模擬用戶操作&#xff0c;但效率較低&#xff0c;所以需要我們結合其他技術來實現高效。 在 Java 中使用 Selenium 進行高效反爬蟲對抗時&#xff…

狀態管理方案對比與決策

1. 狀態管理的基本概念 現代前端應用隨著功能復雜度提升&#xff0c;狀態管理已成為架構設計的核心挑戰。狀態管理本質上解決的是數據的存儲、變更追蹤和響應式更新問題&#xff0c;以確保UI與底層數據保持同步。 核心挑戰: 狀態共享與組件通信可預測的狀態變更性能優化與重…