首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java Swing JList 列表框完全指南:靜態/動態操作、多選模式、滾動條與事件監聽實戰

     編輯:Java 綜合教學

Swing JList 列表組件深度解析

javax.swing.JList 是 Swing 中展示物件列表的核心組件。本文系統講解靜態初始化、動態數據模型、多選模式、滾動條集成、選中事件監聽等全方位用法。

兩種數據填充模式

1. 靜態模式:構造函數直接傳入數組/Vector

String[] days = {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
JList<String> list = new JList<>(days); // 僅展示,運行時不可增刪改
  • 優點:代碼簡潔,適合固定選項 (如下拉選單備選值)
  • 缺點:無法動態增刪、無法自定義渲染

2. 動態模式:DefaultListModel (推薦)

DefaultListModel<String> model = new DefaultListModel<>();
JList<String> list = new JList<>(model);

// 增
model.addElement("新項目");
model.add(0, "插入首位");

// 刪
model.remove(0);           // 按索引刪除
model.removeElement("值"); // 按值刪除
model.clear();             // 清空

// 改
model.set(0, "修改後");

// 查
String val = model.get(0);
int size = model.getSize();

核心原則:JList 負責視圖渲染與選中狀態,ListModel 負責數據存儲與變更通知,嚴格分離關注點。

多選模式與選中獲取

list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); // 默認模式

// 獲取選中值 (推薦 Java 8+)
List<String> selected = list.getSelectedValuesList(); // 返回不可變列表

// 獲取選中索引
int[] indices = list.getSelectedIndices();

// 程式化選中
list.setSelectedIndex(0);           // 單選
list.setSelectedIndices(new int[]{0,2,4}); // 多選

鍵盤交互行為

  • Ctrl + 點擊:切換單項選中狀態 (增減選)
  • Shift + 點擊:範圍選中 (從錨點到點擊項)
  • Ctrl + A:全選 (需自行實現)

選中事件監聽:ListSelectionListener

list.addListSelectionListener(e -> {
    // 關鍵:過濾「調整中」事件,避免拖拽選擇時重複觸發
    if (e.getValueIsAdjusting()) return; 
    
    List<String> selected = list.getSelectedValuesList();
    selected.forEach(System.out::println);
});

getValueIsAdjusting() 詳解:

  • true:選擇範圍正在擴展中 (如拖拽鼠標、按住 Shift 點擊)
  • false:選擇最終確定
  • 最佳實踐:if (e.getValueIsAdjusting()) return; 只在最終確定時處理

滾動條集成:JScrollPane (必須)

JList 不自帶滾動條,必須包裝在 JScrollPane 中:

JScrollPane scrollPane = new JScrollPane(list);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
scrollPane.setPreferredSize(new Dimension(200, 200));

進階:自定義單元格渲染器

list.setCellRenderer(new DefaultListCellRenderer() {
    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index,
            boolean isSelected, boolean cellHasFocus) {
        JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        if (value instanceof User) {
            User u = (User) value;
            label.setText(u.getName() + " (" + u.getEmail() + ")");
            label.setIcon(u.isOnline() ? onlineIcon : offlineIcon);
        }
        return label;
    }
});

完整可運行示例

public class JListDemo extends JFrame {
    private DefaultListModel<String> model = new DefaultListModel<>();
    private JList<String> list = new JList<>(model);
    private JTextArea logArea = new JTextArea(10, 30);
    
    public JListDemo() {
        // 初始化數據
        Stream.of("Apple", "Banana", "Cherry", "Date").forEach(model::addElement);
        
        // 事件監聽
        list.addListSelectionListener(e -> {
            if (e.getValueIsAdjusting()) return;
            logArea.append("選中: " + list.getSelectedValuesList() + "\n");
        });
        
        // 按鈕操作
        JButton btnAdd = new JButton("添加");
        btnAdd.addActionListener(e -> model.addElement("Item-" + (model.getSize()+1)));
        
        JButton btnDel = new JButton("刪除選中");
        btnDel.addActionListener(e -> {
            List<String> selected = list.getSelectedValuesList();
            selected.forEach(model::removeElement);
        });
        
        // 佈局
        setLayout(new BorderLayout());
        add(new JScrollPane(list), BorderLayout.WEST);
        add(new JScrollPane(logArea), BorderLayout.CENTER);
        JPanel btnPanel = new JPanel();
        btnPanel.add(btnAdd); btnPanel.add(btnDel);
        add(btnPanel, BorderLayout.SOUTH);
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack(); setLocationRelativeTo(null); setVisible(true);
    }
    public static void main(String[] args) { SwingUtilities.invokeLater(JListDemo::new); }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved