在 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
可以通過以下幾種方式:
- 基于數組:適用于已知固定數量的選項。
- 基于 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
?默認支持)以提高性能。