| 類 | 職責 | 擴展切入點 |
BasicMarqueeHandler | 滑鼠點擊、框選、連線創建、合併、移動等 UI 交互 | 覆寫 mousePressed, mouseDragged, mouseReleased 注入業務規則 (如禁止特定類型節點連線) |
GraphUndoManager | 撤銷/重做管理 | 自定義 UndoableEdit 封裝業務狀態變更 (如屬性修改、拓撲變更) |
EdgeView.EdgeHandle (內部類) | 邊端點拖拽移動 (重新連接) | **關鍵**:繼承並覆寫 handleMouseReleased 攔截重新連接邏輯,驗證目標 Port 合法性 |
2. 實戰:攔截邊端點重新連接
// 自定義 EdgeHandle
public class WorkflowEdgeHandle extends EdgeView.EdgeHandle {
public WorkflowEdgeHandle(EdgeView view) { super(view); }
@Override
public void handleMouseReleased(MouseEvent e, Point pt) {
// 1. 獲取目標 Port
PortView targetPortView = getTargetPortView(pt);
if (targetPortView == null) { super.handleMouseReleased(e, pt); return; }
// 2. 業務規則驗證
WorkflowPort targetPort = (WorkflowPort) targetPortView.getCell();
WorkflowTransitionEdge edge = (WorkflowTransitionEdge) getEdgeView().getCell();
if (!edge.isValidTargetPort(targetPort)) {
// 3. 非法:顯示提示、還原、不調用 super
JOptionPane.showMessageDialog(null, "不允許連接到該類型端口");
return; // 取消重新連接
}
// 4. 合法:委託父類完成視圖更新
super.handleMouseReleased(e, pt);
// 5. 同步業務模型
edge.setTargetPort(targetPort);
workflowModel.onTransitionReconnected(edge);
}
}
3. 註冊自定義 Handle
// 在自定義 GraphView 或 GraphUI 中
graph.getGraphLayoutCache().setEdgeViewFactory(new EdgeViewFactory() {
public EdgeView createEdgeView(Object cell, GraphLayoutCache cache) {
EdgeView view = new EdgeView(cell, cache);
view.setHandleFactory(new HandleFactory() {
public Handle createHandle(EdgeView view, int index) {
return new WorkflowEdgeHandle(view); // 注入自定義 Handle
}
});
return view;
}
});
五、版本選擇建議
- Free 版:核心繪圖、編輯、事件機制完整,**足夠 90% 場景**
- Pro 版:自動佈局算法 (有向圖、層次、樹)、高級路由、SVG 導出
- Layout Pro:專業佈局引擎獨立授權
六、結語
JGraph 以 **Cell/Vertex/Edge/Port** 四元模型 + **Map 屬性驅動渲染** + **可擴展事件處理鏈**,提供了極佳的「白盒畫布」。通過繼承注入業務數據、攔截 EdgeHandle 控制拓撲合法性、定制 UndoableEdit 實現業務級撤銷,我們在兩周內交付了滿足行業嚴格規範的工作流設計器。**基礎功夫決定上限**——深入理解 JGraph 核心模型與事件分發,比盲目追逐新框架更具長期價值。
- 上一篇文章: Eclipse 3.1 泛型支持全解析:編譯器設置、錯誤警告配置與重構工具實戰
- 下一篇文章: Java 遊戲開發常見異常排查手冊:空指針、數組越界、參數非法與類加載失敗全解析
Copyright ©
程式碼之家 All Rights Reserved