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

開發 Eclipse 自定義控件:從 Canvas 打造專業色彩選單的完整實戰

     編輯:Java 相關知識

前言:超越標準 List 的圖形化選擇需求

SWT 標準 List 僅支持字串選擇,實務上常需圖形化列表(如色彩選單)。本文以開發自定義色彩列表控件為完整範例,系統講解自定義控件涉及的 9 大核心技術點,讀者可舉一反三打造專屬列表控件。

目標讀者:熟悉 Java 開發、具備 Eclipse 開發經驗。

自定義控件的 9 大核心課題

  1. 繪製:自繪形狀/圖案
  2. 鍵盤事件:焦點內響應鍵盤操作(如上下鍵切換選項)
  3. 滑鼠事件:點擊、雙擊等交互響應
  4. 焦點事件:獲得/失去焦點時視覺回饋(如虛線框)
  5. TAB 鍵導航:支持焦點進出
  6. 捲動條事件:響應捲動重繪可見區域
  7. 事件監聽機制:對外發布選擇變更等事件
  8. 無障礙支持:螢幕閱讀器識別角色、值、狀態
  9. 功能性 API:方便程式員獲取/設置控件狀態

基類選擇:Canvas

因屬基礎控件,繼承 Canvas 而非 Composite。核心欄位含顏色/名稱向量、當前/上次選中行、尺寸、行高、捲動偏移 cx/cy。

核心技術實戰解析

1. 高效繪製:PaintListener + 區域性重繪

掛載 PaintListener,在 paintControl 中根據 PaintEvent 的損壞區域(x,y,width,height)計算需重繪行範圍,逐行調用 onPaint,避免全量重繪提升效能。onPaint 負責單行繪製:背景、文字、色塊、焦點虛框。

2. 鍵盤導航:KeyDown Listener + 捲動聯動

監聽 SWT.KeyDown,處理 ARROW_UP/DOWN:更新選中行、重繪新舊行、必要時聯動垂直捲動條(ScrollBar.setSelection + scrollVertical),最後發送 selectionChanged 事件。

3. 滑鼠選擇:MouseListener + 座標換算

mouseDown 中依 e.y - cy 計算行號(扣除捲動偏移),重繪新舊選中行並發送事件。

4. 焦點視覺回饋:FocusListener

focusGained/Lost 僅重繪當前選中行;onPaint 末尾判斷 isFocusControl() && isSelected 繪製虛框(gc.drawFocus)。

5. TAB 鍵支持:TraverseListener

Canvas 預設不支持 TAB,添加 TraverseListener 在 TRAVERSE_TAB_NEXT/PREVIOUS 時設 e.doit = true 即可啟用。

6. 捲動條聯動:SelectionAdapter

掛載 SelectionAdapter 於垂直捲動條 widgetSelected,調用 scrollVertical:計算目標 Y、邊界修正、行高對齊、調用 scroll(cx, y, cx, cy, maxX, maxY, false) 觸發區域重繪,更新 cy。

7. 事件監聽機制:自訂 SelectionListener

  • 成員 Vector selectionListeners 保存監聽器
  • addSelectionListener(SelectionListener) 註冊
  • selectionChanged() 建構 SelectionEvent 逐個回調 widgetSelected

8. 無障礙支持:AccessibleControlAdapter 完整實作

關鍵在 getRole(返回 ACC.ROLE_LIST/LISTITEM 讓螢幕閱讀器識別為列表)、getValue(返回項目文字)、getState(返回 SELECTABLE/FOCUSED/SELECTED 等狀態組合)、getLocation/ChildAtPoint/ChildCount 提供空間資訊。完整代碼見文中長片段。

9. 便利 API

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 大技術點,從簡單色彩列表延伸至任意圖形化列表控件皆不在話下。完整代碼結構清晰,可直接作為自定義控件開發的範本。

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