JGraph開發經驗談
JGraph開發經驗談[@more@] 契子
本來一直很少有機會接觸swing或AWT的,只是最近公司要做一個工作流定製介面,所以才終於得償所願。我知道,如果一切從底層做起的話,恐怕時間、精力都不允許,而現成的一些工作流產品又不能滿足公司特定行業工作流的需求,所以只好找一個開源的中介軟體進行修改了。就這樣,慢慢的認識了JGraph……
關於JGraph,open-open上是這樣介紹的:JGraph,純Java開發的圖形元件,支援拖,放,縮放,合併等其它操作。它可以被結合到任何的Swing應用程式當中。
在JGraph的網站上可以看到,它分為Free、Pro和Layout Pro版本,作為廣大的“勞苦民眾”來說,當然首選Free版了,呵呵~~
JGraph的畫圖機制
參照了JGraph的example和原始碼,發現:
JGraph將圖元定義為一個一個的cell,每個cell可以是一個頂點(Vertex)、邊(Edge)或者節點(Port)中的一種。頂點可以有鄰接的頂點,他們透過邊相聯絡,邊聯接的兩個端點稱為目標和源,每個目標或者源是一個節點。節點是頂點的孩子。每個cell都可以有自己的孩子。
每個cell的外觀由相應的屬性定義,屬性序列是指一系列的鍵-值對,他們以Map形式組織,例如:
//定義Edge的外觀
Map map = new Hashtable();
GraphConstants.setLineEnd(map, GraphConstants.ARROW_CLASSIC);
GraphConstants.setEndFill(map, true);
GraphConstants.setLabelAlongEdge(map, true);
getAttributes().applyMap(map);
而“畫布”(類JGraph,不妨如此理解吧)也可以有自己的外觀屬性。例如:
//定義畫布的屬性
setBackground(Color.decode("#C0C0C0"));
setEditable(false);
setCloneable(false);
setInvokesStopCellEditing(true);
setJumpToDefaultPort(true);
setPortsVisible(false);
setGridEnabled(false);
setGridVisible(false);
setGridMode(JGraph.CROSS_GRID_MODE);
setGridColor(Color.decode("#808080"));
setGridSize(10);
JGraph的擴充套件
JGraph只是提供單純的圖形繪製功能,不包含實際的資料,所以要想辦法把自己的資料“加”進去才行,這恐怕就得考慮擴充套件JGraph了。
頂點(Vertex)對應的類為org.jgraph.graph.DefaultGraphCell
邊(Edge)對應的類為org.jgraph.graph.DefaultEdge
節點(Port)對應的類為org.jgraph.graph.DefaultPort
我們要做的,僅僅是分別繼承相應的類,並把自己的資料物件放進去而已。當然,還可以改變相應的外觀屬性。不過如果你對繪圖事件也感興趣的話(呵呵,十有八九應該有用的),還要留意一下org.jgraph.graph.BasicMarqueeHandler和org.jgraph.graph.GraphUndoManager這兩個類呢。BasicMarqueeHandler中包括了在畫布上點選滑鼠、增加連線、合併等等事件的處理,而GraphUndoManager則主管撤銷、回覆事件
如果仔細操作,你也許回發現,點選邊(Edge)的端點進行移動的事件並不由GraphUndoManager來處理,這時候就要再關注一個類了:org.jgraph.graph.EdgeView.EdgeHandle,這是一個內部類,如果需要的話,自己重寫一個類繼承它吧。這樣,大部分需要的事件都盡在自己的掌握中了
嘿嘿~~~~
總結
其實也沒什麼好總結的,寫本文也是猶豫再三才開鍵盤的,本來準備在上個月就寫呢。一直拖到現在,因為覺得只是簡單的應用而已,全是基本功,沒有一點“高階”的“新意”,好像實在沒什麼好寫的。
今天在BlogJava上看了一篇帖子,感觸頗深,其中一句“整天口若懸河新技術,不如將經典的舊技術爛醉於心”,一語解開了困惑我很長時間的一個疑團!從基本功做起,不是高手,唯手熟而……
後記
如果有朋友對類似的專案感興趣,歡迎指點,共同研究討論。
本來一直很少有機會接觸swing或AWT的,只是最近公司要做一個工作流定製介面,所以才終於得償所願。我知道,如果一切從底層做起的話,恐怕時間、精力都不允許,而現成的一些工作流產品又不能滿足公司特定行業工作流的需求,所以只好找一個開源的中介軟體進行修改了。就這樣,慢慢的認識了JGraph……
關於JGraph,open-open上是這樣介紹的:JGraph,純Java開發的圖形元件,支援拖,放,縮放,合併等其它操作。它可以被結合到任何的Swing應用程式當中。
在JGraph的網站上可以看到,它分為Free、Pro和Layout Pro版本,作為廣大的“勞苦民眾”來說,當然首選Free版了,呵呵~~
JGraph的畫圖機制
參照了JGraph的example和原始碼,發現:
JGraph將圖元定義為一個一個的cell,每個cell可以是一個頂點(Vertex)、邊(Edge)或者節點(Port)中的一種。頂點可以有鄰接的頂點,他們透過邊相聯絡,邊聯接的兩個端點稱為目標和源,每個目標或者源是一個節點。節點是頂點的孩子。每個cell都可以有自己的孩子。
每個cell的外觀由相應的屬性定義,屬性序列是指一系列的鍵-值對,他們以Map形式組織,例如:
//定義Edge的外觀
Map map = new Hashtable();
GraphConstants.setLineEnd(map, GraphConstants.ARROW_CLASSIC);
GraphConstants.setEndFill(map, true);
GraphConstants.setLabelAlongEdge(map, true);
getAttributes().applyMap(map);
而“畫布”(類JGraph,不妨如此理解吧)也可以有自己的外觀屬性。例如:
//定義畫布的屬性
setBackground(Color.decode("#C0C0C0"));
setEditable(false);
setCloneable(false);
setInvokesStopCellEditing(true);
setJumpToDefaultPort(true);
setPortsVisible(false);
setGridEnabled(false);
setGridVisible(false);
setGridMode(JGraph.CROSS_GRID_MODE);
setGridColor(Color.decode("#808080"));
setGridSize(10);
JGraph的擴充套件
JGraph只是提供單純的圖形繪製功能,不包含實際的資料,所以要想辦法把自己的資料“加”進去才行,這恐怕就得考慮擴充套件JGraph了。
頂點(Vertex)對應的類為org.jgraph.graph.DefaultGraphCell
邊(Edge)對應的類為org.jgraph.graph.DefaultEdge
節點(Port)對應的類為org.jgraph.graph.DefaultPort
我們要做的,僅僅是分別繼承相應的類,並把自己的資料物件放進去而已。當然,還可以改變相應的外觀屬性。不過如果你對繪圖事件也感興趣的話(呵呵,十有八九應該有用的),還要留意一下org.jgraph.graph.BasicMarqueeHandler和org.jgraph.graph.GraphUndoManager這兩個類呢。BasicMarqueeHandler中包括了在畫布上點選滑鼠、增加連線、合併等等事件的處理,而GraphUndoManager則主管撤銷、回覆事件
如果仔細操作,你也許回發現,點選邊(Edge)的端點進行移動的事件並不由GraphUndoManager來處理,這時候就要再關注一個類了:org.jgraph.graph.EdgeView.EdgeHandle,這是一個內部類,如果需要的話,自己重寫一個類繼承它吧。這樣,大部分需要的事件都盡在自己的掌握中了
嘿嘿~~~~
總結
其實也沒什麼好總結的,寫本文也是猶豫再三才開鍵盤的,本來準備在上個月就寫呢。一直拖到現在,因為覺得只是簡單的應用而已,全是基本功,沒有一點“高階”的“新意”,好像實在沒什麼好寫的。
今天在BlogJava上看了一篇帖子,感觸頗深,其中一句“整天口若懸河新技術,不如將經典的舊技術爛醉於心”,一語解開了困惑我很長時間的一個疑團!從基本功做起,不是高手,唯手熟而……
後記
如果有朋友對類似的專案感興趣,歡迎指點,共同研究討論。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10901326/viewspace-965475/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 談談Ilog的開發經驗
- kotlin開發經驗談3Kotlin
- kotlin開發經驗談4Kotlin
- kotlin開發經驗談5Kotlin
- kotlin開發經驗談2Kotlin
- kotlin開發經驗談1Kotlin
- Android SDK 開發經驗淺談Android
- 銀行系統開發 經驗談
- 九年遊戲開發經驗談遊戲開發
- iOS開發經驗談:如何提高應用開發效率?iOS
- Linus 談軟體開發管理經驗
- 經驗之談:八種Docker容器開發模式Docker模式
- Linus Torvalds談軟體開發管理經驗
- 經驗分享:談談如何多快好省地開發獨立遊戲遊戲
- 開發經驗漫談 -- Git在開發流程中的運用Git
- 淺談前端業務開發中的經驗與感想前端
- 經驗談
- 必看!網際網路開發模式的經驗之談模式
- GitHub工程師談GitHub Pages服務開發經驗Github工程師
- 移動應用開發十大經驗之談
- 經驗談集
- DBA 經驗談
- 爆破經驗談
- 三年開發程式設計師的職場經驗談程式設計師
- 開發十年經驗之談:如何構建自己的Java開發體系Java
- PHP開發提升經驗PHP
- 開發踩坑經驗
- Apple Watch應用開發經驗談:我遇到的那些坑APP
- Linux程式應用開發環境和工具經驗談(轉)Linux開發環境
- 使用nfs經驗談NFS
- 大學打架經驗談
- Lotus 經驗談(轉)
- iOS開發經驗總結iOS
- PHP開發經驗總結PHP
- 後臺開發面試經驗面試
- 一個破 1K Stars 的 side project 開發經驗談IDEProject
- 開發者經驗談:如何一天時間搞定iOS遊戲開發?iOS遊戲開發
- FIFO設計驗證經驗談