SWT 標準 List 僅支持字串選擇,實務上常需圖形化列表(如色彩選單)。本文以開發自定義色彩列表控件為完整範例,系統講解自定義控件涉及的 9 大核心技術點,讀者可舉一反三打造專屬列表控件。
目標讀者:熟悉 Java 開發、具備 Eclipse 開發經驗。
因屬基礎控件,繼承 Canvas 而非 Composite。核心欄位含顏色/名稱向量、當前/上次選中行、尺寸、行高、捲動偏移 cx/cy。
掛載 PaintListener,在 paintControl 中根據 PaintEvent 的損壞區域(x,y,width,height)計算需重繪行範圍,逐行調用 onPaint,避免全量重繪提升效能。onPaint 負責單行繪製:背景、文字、色塊、焦點虛框。
監聽 SWT.KeyDown,處理 ARROW_UP/DOWN:更新選中行、重繪新舊行、必要時聯動垂直捲動條(ScrollBar.setSelection + scrollVertical),最後發送 selectionChanged 事件。
mouseDown 中依 e.y - cy 計算行號(扣除捲動偏移),重繪新舊選中行並發送事件。
focusGained/Lost 僅重繪當前選中行;onPaint 末尾判斷 isFocusControl() && isSelected 繪製虛框(gc.drawFocus)。
Canvas 預設不支持 TAB,添加 TraverseListener 在 TRAVERSE_TAB_NEXT/PREVIOUS 時設 e.doit = true 即可啟用。
掛載 SelectionAdapter 於垂直捲動條 widgetSelected,調用 scrollVertical:計算目標 Y、邊界修正、行高對齊、調用 scroll(cx, y, cx, cy, maxX, maxY, false) 觸發區域重繪,更新 cy。
Vector selectionListeners 保存監聽器addSelectionListener(SelectionListener) 註冊selectionChanged() 建構 SelectionEvent 逐個回調 widgetSelected關鍵在 getRole(返回 ACC.ROLE_LIST/LISTITEM 讓螢幕閱讀器識別為列表)、getValue(返回項目文字)、getState(返回 SELECTABLE/FOCUSED/SELECTED 等狀態組合)、getLocation/ChildAtPoint/ChildCount 提供空間資訊。完整代碼見文中長片段。
setSelection(index) / getSelectionIndex()
getItemHeight() / setItemHeight()
getItemCount()
add(colorIndex, colorName)
CustomList list = new CustomList(parent, SWT.V_SCROLL | SWT.H_SCROLL);
list.add(SWT.COLOR_BLACK, "BLACK");
list.add(SWT.COLOR_BLUE, "BLUE");
list.setSelection(1);
list.setSize(400, 400);
list.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
掌握這 9 大技術點,從簡單色彩列表延伸至任意圖形化列表控件皆不在話下。完整代碼結構清晰,可直接作為自定義控件開發的範本。