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

GEF 入門系列(十):基於列模型實現可編輯表格編輯器

     編輯:Java 相關知識

模型設計抉擇

傳統「表-行-列-單元格」四層模型導致 RowFigure/ColumnFigure 交叉佈局困難。採用列模型:僅三類對象 —— Table、Column、Cell。Column 子類 HeaderColumn 代表第一列;Cell 子類 HeaderCell 代表首列單元格。行操作轉化為 HeaderCell 操作:新增行 = 在 HeaderColumn 增加 HeaderCell,同步在其他 Column 增加 Cell。

表格編輯器演示

四大界面一致性挑戰與解決方案

1. 插入提示線寬度 = 表格寬度

調色板「Row」工具實際創建 HeaderCell。覆寫 HeaderColumnPart 的 Layout EditPolicy (FlowLayoutEditPolicy 子類) 中的 showLayoutTargetFeedback():

protected void showLayoutTargetFeedback(Request request) {
    super.showLayoutTargetFeedback(request);
    Diagram diagram = (Diagram) getHost().getParent().getModel();
    Column column = (Column) getHost().getModel();
    Point p2 = getLineFeedback().getPoints().getPoint(1);
    p2.x = p2.x + (diagram.getColumns().size() - 1) * (column.getWidth() + IConstants.COLUMN_SPACING);
    getLineFeedback().setPoint(p2, 1);  // 延伸右端點 x 座標
}

全寬插入線

2. 點擊 HeaderCell 顯示整行選中

  • 在 ColumnPart 的 EditPolicy createChildEditPolicy() 返回自定義 DragRowEditPolicy (繼承 ResizableEditPolicy)
  • 自定義 RowMoveHandle extends MoveHandle,覆寫 getLocator() 返回整行矩形區域
  • HeaderCellPart.getRowBound() 計算整行寬度 (列數 × 列寬 + 間距)
  • DragRowEditPolicy.createSelectionHandles() 替換默認 8 個控制點為:RowMoveHandle (四周邊框) + RowResizeHandle (底部縮放控制點)

整行選中效果

3. 拖動底部邊框調整行高

RowResizeHandle extends ResizeHandle:

  • 構造器中 setPreferredSize(new Dimension(rowWidth, 2)) 將控制點拉成 2px 高的線
  • 覆寫 paintFigure() 填充矩形無描邊
  • getLocator() 返回 RelativeHandleLocator(refFigure, SOUTH) 固定在行底部
  • getFillColor() 始終返回黑色 (非主選中也可見)

調整行高提示

4. 拖動/縮放時 Ghost 回顯為整行

在 DragRowEditPolicy 覆寫 getInitialFeedbackBounds() 返回 HeaderCellPart.getRowBound()。

整行 Ghost 回顯

Command 層同步多列

操作 HeaderCell 產生的 Command (CreateHeaderCellCommand、MoveHeaderCellCommand、DeleteHeaderCellCommand、ChangeHeaderCellHeightCommand) 在 execute()/undo() 中同步操作所有 Column 對應位置的 Cell,保持表格結構一致。

替代方案對比

曾考慮「Table + Cell」雙層模型 + 自定義 TableLayout,但行列均需自定義處理,工作量較大。列模型方案僅關注行處理,性價比更高。

總結

通過「列模型 + HeaderCell 代理行操作 + 自定義 Handle/Feedback」技巧,在 GEF 3.1M6 缺乏表格支持的環境下實現了完整可用的表格編輯器。核心類:HeaderColumnPart、HeaderCellPart、DragRowEditPolicy、RowMoveHandle、RowResizeHandle。

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