Draw2D 是 Eclipse GEF(Graphical Editing Framework)的繪圖渲染層,一個建構在 SWT Composite 之上的輕量級圖形元件系統。它不處理編輯邏輯(由 GEF 負責),專注於模型的視覺化呈現:佈局管理、連線路由、圖形渲染、事件分派。理解 Draw2D 的設計模式,是開發基於 Eclipse 的圖形化編輯器、建模工具、流程圖編輯器的關鍵。
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.SWT;
import org.eclipse.draw2d.*;
public class HelloWorld {
public static void main(String[] args) {
Shell shell = new Shell();
shell.setText("Draw2D Hello World");
shell.open();
LightweightSystem lws = new LightweightSystem(shell);
IFigure label = new Label("Hello World");
lws.setContents(label);
Display display = Display.getDefault();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
}
}
關鍵三件事:Shell(SWT 視窗)→ LightweightSystem(橋接器)→ IFigure(根圖形)。
Canvas(SWT 繪圖面)引用IFiguresetContents() 設定)IFigure:介面,定義繪圖(paint())、佈局(LayoutManager)、事件處理、父子關係、座標轉換等契約Figure:IFigure 預設實作,採用 Composite 模式,支援任意深度巢狀int,無浮點數(像素精確、效能考量、避免抗鋸齒模糊)EditPart、EditPolicy 實現)Draw2D 大量使用「模型-視圖」分離,但刻意不包含控制器:
EditPart 扮演控制器,同步模型變更到 Figure,處理使用者互動修改模型經典範例:RangeModel 與 ScrollBar
RangeModel:介面,封裝 min/max/value/extent/increment,可註冊監聽器ScrollBar(Figure):持有 RangeModel,註冊為監聽器IFigure = Component 抽象Figure = Composite 實作,含 List children ,實作 add/remove/getChildren()Label、RectangleFigure、Polyline 等Panel、Toolbar、Viewport、ScrollPane 等RootFigure 的唯一子節點),整個場景為一棵樹EventListenerList、EventObject 支援FigureEvent、MouseEvent 等),監聽器註冊/移除RangeModel、Viewport、LayoutManager 皆為可觀察主體EditPart 大量註冊為 Figure/Model 監聽器,實現雙向同步LayoutManager 介面,Figure.setLayoutManager() 設定XYLayout(絕對座標)、FlowLayout、ToolbarLayout、BorderLayout、StackLayout、GridLayoutConnection、ConnectionAnchor、ConnectionRouter(ManhattanRouter、FanRouter、ShortestPathRouter)ChopboxAnchor、FixedAnchor),路由器計算折線路徑Viewport:可捲動視窗,內含水平/垂直 RangeModel,對應兩個 ScrollBarScrollPane:組合 Viewport + 兩個 ScrollBar 的便利容器UpdateManager:收集損壞區域(Rectangle),合併重疊區域,排程重繪BufferedImage),減少閃爍| 層級 | 框架 | 核心類別 | 職責 |
|---|---|---|---|
| 模型 | 應用自定 | Domain Model (EMF/POJO) | 業務資料、拓撲關係、屬性 |
| 控制器 | GEF | EditPart, EditPolicy, Command | 模型↔視圖同步、編輯行為、Undo/Redo |
| 視圖 | Draw2D | Figure, LayoutManager, UpdateManager | 渲染、佈局、事件分派、捲動、連線 |
| 平台 | SWT/JFace | Canvas, Display, Shell | 原生視窗、圖形上下文、事件迴路 |
Draw2D 以輕量級、模式驅動、純視圖三大特徵,構建了極具擴展性的圖形渲染基礎設施。其對 Composite、MVC、Observer 三大模式的教科書級應用,配合精心設計的佈局、連線、視口、更新子系統,使開發者能專注於領域模型與編輯邏輯(GEF 層),而無需重造繪圖輪子。掌握 Draw2D 核心架構,是開發高品質 Eclipse 圖形化工具的必修課。