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

調色板「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 座標
}

ColumnPart 的 EditPolicy createChildEditPolicy() 返回自定義 DragRowEditPolicy (繼承 ResizableEditPolicy)RowMoveHandle extends MoveHandle,覆寫 getLocator() 返回整行矩形區域HeaderCellPart.getRowBound() 計算整行寬度 (列數 × 列寬 + 間距)DragRowEditPolicy.createSelectionHandles() 替換默認 8 個控制點為:RowMoveHandle (四周邊框) + RowResizeHandle (底部縮放控制點)
RowResizeHandle extends ResizeHandle:
setPreferredSize(new Dimension(rowWidth, 2)) 將控制點拉成 2px 高的線paintFigure() 填充矩形無描邊getLocator() 返回 RelativeHandleLocator(refFigure, SOUTH) 固定在行底部getFillColor() 始終返回黑色 (非主選中也可見)
在 DragRowEditPolicy 覆寫 getInitialFeedbackBounds() 返回 HeaderCellPart.getRowBound()。

操作 HeaderCell 產生的 Command (CreateHeaderCellCommand、MoveHeaderCellCommand、DeleteHeaderCellCommand、ChangeHeaderCellHeightCommand) 在 execute()/undo() 中同步操作所有 Column 對應位置的 Cell,保持表格結構一致。
曾考慮「Table + Cell」雙層模型 + 自定義 TableLayout,但行列均需自定義處理,工作量較大。列模型方案僅關注行處理,性價比更高。
通過「列模型 + HeaderCell 代理行操作 + 自定義 Handle/Feedback」技巧,在 GEF 3.1M6 缺乏表格支持的環境下實現了完整可用的表格編輯器。核心類:HeaderColumnPart、HeaderCellPart、DragRowEditPolicy、RowMoveHandle、RowResizeHandle。