new List(rows, true) 第二參數 true 啟用多選action() (Java 1.0) / ActionListener (Java 1.1+)getSelectedItems() 取得所有選中項目陣列//: 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.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) | 取得指定索引項目 |
MouseEvent.getModifiersEx() 完整支援| 技術 | 核心類別 | 增強功能 |
|---|---|---|
| Swing | JList + ListModel + ListSelectionModel | MVC 分離、自訂渲染器 (ListCellRenderer)、多選模式枚舉 (SINGLE, SINGLE_INTERVAL, MULTIPLE_INTERVAL)、鍵盤導航完整支援 |
| JavaFX | ListView<T> + ObservableList + SelectionModel | 泛型型別安全、CellFactory 自訂 UI、CSS 樣式、屬性綁定、虛擬化大數據支援 |
| Web | <select multiple> / 自訂下拉/列表組件 | 原生多選、或 React Select/Vue Multiselect 等豐富組件庫 |
true),符合使用者直覺 (Windows 標準行為)。ListSelectionListener (Swing) / SelectionModel (JavaFX)。JList 預設虛擬化、JavaFX ListView 預設虛擬化),避免記憶體/效能問題。ListCellRenderer,JavaFX 實作 CellFactory。List 是「固定區域、多選、內建捲軸」的經典列表元件。Java 1.0 僅支援雙擊觸發 action(),需覆寫 handleEvent() 實現單擊即時回饋 (易出錯)。Java 1.1+ ItemListener/ListSelectionListener 徹底解決此問題。現代開發請直接使用 JList 或 ListView,獲得 MVC 架構、虛擬化、自訂渲染、完整鍵盤/滑鼠/觸控支援。