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

Java AWT List 列表框完全指南:多選模式、動作事件與 handleEvent 單擊修正

     編輯:Java 相關知識

List 核心特性

  • 固定顯示於畫面指定區域,不彈出 (異於 Choice)
  • 支援多重選擇:new List(rows, true) 第二參數 true 啟用多選
  • 單擊:切換項目選取狀態 (高亮/取消)
  • 雙擊:觸發 action() (Java 1.0) / ActionListener (Java 1.1+)
  • getSelectedItems() 取得所有選中項目陣列
  • 內建捲軸,項目超過可視行數自動顯示

範例一:List1 — action() 雙擊觸發

//: List1.java
public class List1 extends Applet {
    List lst = new List(6, true); // 6行可視,多選
    TextArea t = new TextArea(8, 30);
    Button b = new Button("test");
    String[] flavors = {...};
    int count = 0;

    public void init() {
        t.setEditable(false);
        for (int i=0; i<4; i++) lst.addItem(flavors[count++]);
        add(t); add(lst); add(b);
    }

    public boolean action(Event evt, Object arg) {
        if (evt.target.equals(lst)) { // 雙擊觸發
            t.setText("");
            for (String item : lst.getSelectedItems()) t.appendText(item + "\n");
        } else if (evt.target.equals(b)) { // 按鈕動態新增項目到頂部
            if (count < flavors.length) lst.addItem(flavors[count++], 0);
        } else return super.action(evt, arg);
        return true;
    }
}

痛點:使用者單選/多選時無即時回饋,必須雙擊才觸發 action()。

範例二:List2 — handleEvent() 攔截單擊即時回饋

//: List2.java (關鍵差異)
public boolean handleEvent(Event evt) {
    if (evt.id == Event.LIST_SELECT || evt.id == Event.LIST_DESELECT) {
        if (evt.target.equals(lst)) {
            t.setText("");
            for (String item : lst.getSelectedItems()) t.appendText(item + "\n");
        } else return super.handleEvent(evt);
    } else return super.handleEvent(evt);
    return true;
}

捕捉 LIST_SELECT/LIST_DESELECT 事件,單擊即更新 TextArea,體驗大幅提升。

關鍵方法速查

方法說明
addItem(String item)加入項目到尾部
addItem(String item, int index)插入項目到指定索引 (0=頂部)
getSelectedItem()單選模式取得選中項目
getSelectedItems()多選模式取得所有選中項目陣列
getSelectedIndex()單選模式取得索引
getSelectedIndexes()多選模式取得所有索引陣列
select(int index)程式化選中項目
deselect(int index)程式化取消選中
replaceItem(String newItem, int index)替換項目
remove(int index) / remove(String item)移除項目
removeAll()清空列表
getItemCount()項目總數
getItem(int index)取得指定索引項目

Windows 原生多選行為

  • 預設支援 Shift+單擊 範圍選取、Ctrl+單擊 離散增減選
  • Java 1.0 無法攔截修飾鍵狀態,Java 1.1+ MouseEvent.getModifiersEx() 完整支援

現代化對應

技術核心類別增強功能
SwingJList + ListModel + ListSelectionModelMVC 分離、自訂渲染器 (ListCellRenderer)、多選模式枚舉 (SINGLE, SINGLE_INTERVAL, MULTIPLE_INTERVAL)、鍵盤導航完整支援
JavaFXListView<T> + ObservableList + SelectionModel泛型型別安全、CellFactory 自訂 UI、CSS 樣式、屬性綁定、虛擬化大數據支援
Web<select multiple> / 自訂下拉/列表組件原生多選、或 React Select/Vue Multiselect 等豐富組件庫

最佳實踐

  1. 多選模式預設開啟 (true),符合使用者直覺 (Windows 標準行為)。
  2. 即時回饋 (單擊更新預覽/詳情) 遠優於雙擊觸發,Java 1.1+ 請用 ListSelectionListener (Swing) / SelectionModel (JavaFX)。
  3. 大量資料 (千項以上) 必須使用虛擬化/懶載入 (Swing JList 預設虛擬化、JavaFX ListView 預設虛擬化),避免記憶體/效能問題。
  4. 自訂項目外觀:Swing 實作 ListCellRenderer,JavaFX 實作 CellFactory。

總結

List 是「固定區域、多選、內建捲軸」的經典列表元件。Java 1.0 僅支援雙擊觸發 action(),需覆寫 handleEvent() 實現單擊即時回饋 (易出錯)。Java 1.1+ ItemListener/ListSelectionListener 徹底解決此問題。現代開發請直接使用 JList 或 ListView,獲得 MVC 架構、虛擬化、自訂渲染、完整鍵盤/滑鼠/觸控支援。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved