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

GEF 入門系列(十一):基於 Draw2D TreeExample 實現樹形編輯器

     編輯:Java 相關知識

引言

GEF 3.1M7 未直接提供樹支持,但 Draw2D 示例 org.eclipse.draw2d.examples.tree.TreeExample 包含成熟的樹佈局與渲染代碼 (TreeRoot、TreeBranch、TreeLayout、NormalLayout、HangingLayout、PageNode 等)。直接復用可節省數天開發時間。

Draw2D TreeExample 縱向樹示例

Draw2D 樹實現原理

  • TreeBranch:樹節點圖形,包含 PageNode (帶折角矩形) 與透明容器 contentsPane (Layer,承載子節點)
  • 佈局策略:
    • TreeBranch 自身用 NormalLayout 將 PageNode 放在子節點正上方
    • contentsPane 用 TreeLayout 計算每個子節點位置
  • 整棵樹由多層子樹疊加,非葉節點尺寸等於其子樹佔用區域大小
  • 支持橫向/縱向、壓縮間隙、子節點橫向/縱向排列、展開/收起

模型設計

  • TreeNode:基礎節點,屬性 nodes (子節點列表)、text (顯示文本)、expanded (展開狀態)
  • TreeRoot extends TreeNode:根節點,額外屬性控制整樹外觀 (horizontal, majorSpacing 等),對應編輯器 contents,圖形為 TreeRoot (畫布)
  • 無 Connection 模型:連線由佈局管理器繪製,無需手動調整

EditPart 映射

public IFigure getContentPane() {
    return ((TreeBranch) getFigure()).getContentsPane();
}
protected List getModelChildren() {
    return ((TreeNode) getModel()).getNodes();
}
protected IFigure createFigure() {
    return new TreeBranch();
}

關鍵 EditPolicy 實現

TreeNodeLayoutEditPolicy —— 佈局與創建/移動

  • 繼承 ConstrainedLayoutEditPolicy
  • 實現 createAddCommand() (改變父節點)、getCreateCommand() (創建節點)
  • createChildEditPolicy() 返回自定義 NonResizableEditPolicy

選中反饋優化:單控制點替代邊框

protected List createSelectionHandles() {
    List list = new ArrayList();
    list.add(new ResizeHandle((GraphicalEditPart) getHost(), PositionConstants.NORTH));
    return list;
}

避免邊框包裹整棵子樹,多選時界面更清晰。

多選效果

ContainerHighlightEditPolicy —— 拖放目標高亮

  • 繼承 GraphicalEditPolicy
  • showHighlight() 設置容器 Figure setSelected(true)
  • eraseTargetFeedback() 設置 setSelected(false)

源碼參考 Logic 示例改造。

運行效果與擴展

樹編輯器運行界面

  • Node1 收起狀態
  • Node6 縱向排列子節點 (節省橫向空間)
  • 支持展開/收起、橫向/縱向切換、拖拽調整父子關係

經驗總結

開發前先檢查 GEF/Draw2D 示例代碼,理解並復用成熟實現,可將開發周期從 4-6 天壓縮至 1 天,且缺陷更少、功能更完善。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
模型EditPart關鍵實現
TreeNodeTreeNodePartgetContentPane() 返回 contentsPane;getModelChildren() 返回 nodes;createFigure() 返回 TreeBranch;refreshVisuals() 同步 expanded 狀態
TreeRootTreeRootPart繼承 TreeNodePart,覆寫 createFigure() 返回 TreeRoot 實例