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

Java Swing JList 列表框完整使用指南

     編輯:Java 相關知識

基本特性

  • 固定顯示行數,支持多選(Ctrl/Shift)
  • getSelectedValuesList() 返回選中元素列表
  • 無內置滾動,需包裹 JScrollPane

兩種數據操作模式

1. 靜態模式(不可變)

String[] data = {"Mon", "Tue", "Wed"};
JList<String> list = new JList<>(data); // 構造時一次性注入
// 運行後無法增刪改

2. 動態模式(推薦)

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

// 增
model.addElement("Thu");
// 刪
model.remove(0); // 或 model.removeElement("Mon")
// 改
model.set(1, "Tue2");
// 查
model.getElementAt(0);

事件監聽最佳實踐

list.addListSelectionListener(e -> {
    if (e.getValueIsAdjusting()) return; // 忽略調整過程中的中間事件
    List<String> selected = list.getSelectedValuesList();
    for (String s : selected) {
        textArea.append(s + "\n");
    }
});

關鍵點:getValueIsAdjusting() 為 true 表示選擇尚在變化中(如拖拽),應直接返回避免重複觸發。

完整示例:可增刪的列表

public class ListDemo extends JFrame {
    private DefaultListModel<String> model = new DefaultListModel<>();
    private JList<String> list = new JList<>(model);
    private JTextArea area = new JTextArea(10, 20);

    public ListDemo() {
        model.addElement("Item 1");
        model.addElement("Item 2");

        JButton btnAdd = new JButton("添加");
        btnAdd.addActionListener(e -> model.addElement("New " + (model.size()+1)));

        JButton btnDel = new JButton("刪除選中");
        btnDel.addActionListener(e -> {
            List<String> sel = list.getSelectedValuesList();
            for (String s : sel) model.removeElement(s);
        });

        list.addListSelectionListener(e -> {
            if (!e.getValueIsAdjusting()) {
                area.setText(String.join("\n", list.getSelectedValuesList()));
            }
        });

        setLayout(new BorderLayout());
        add(new JScrollPane(list), BorderLayout.WEST);
        add(new JScrollPane(area), BorderLayout.CENTER);
        add(btnAdd, BorderLayout.NORTH);
        add(btnDel, BorderLayout.SOUTH);
        pack(); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true);
    }
    public static void main(String[] args) { new ListDemo(); }
}

常見問題

  • 忘記 JScrollPane 導致數據超出可視區無法查看
  • 未判斷 getValueIsAdjusting() 導致選擇事件重複觸發
  • 直接操作 JList 而非 Model 導致異常
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved