在爲老師寫項目的時候我急需一個基於java的圖形組件,第一次搜索就搜索到了jGraph。總體感覺還是挺容易上手的,是一套能夠應對多種圖形用途的工具。雖然我對其中一些編程的風格有些不是很滿意。不過能做出來就是好的!而且效果十分出色,感謝jGraph社團帶給我們的強大工具。
最令我欣賞的是,jGraph在對需要使用jGraph Layout Pro的學術應用只收半價,這表現了國外對於學術研究的重視,是中國需要學習的。
jGraph簡介
jGraph具有相當高的交互性和自動化,是一套爲圖定做的組件。其主要用途是在一些需要表示圖結構的應用中,比如流程圖、UML、交通線路、網絡等等。
jGraph在本文撰寫時版本爲5.8.0.0,可以在鏈接出找到jGraph的主頁。
jGraph主要包括以下一些產品:
JGraph - The Java Open Source Graph Drawing Component ( 有Open Source )
JGraph Layout Pro - The Java Graph Layout Solution
JGraphpad Pro Diagram Editor Framework
MxGraph Thin Client - JGraph in a browser!
咱們只是學習嘛,當然只用jGraph咯。jGraph Layout Pro是一個對圖進行佈局的軟件,看過DEMO後感覺好酷。jGraphed Pro 現在有WEB START的演示,似乎是拿來做jGraph的演示用,我在Solaris上也看到過jGraphed Pro的身影,是一套巨牛叉的圖形編輯軟件。 MxGraph Thin Client是利用Javascript 和 SVG 在XML通訊協議下的瀏覽器端的瘦客戶軟件,感覺也好厲害呀。
jGraph對圖的操作包括:圖顯示、圖交互、圖佈局、圖分析等。
JGraph 的基本SWING 組件如下:
org.jgraph Basic JGraph 類
org.jgraph.event Graph 事件模型
org.jgraph.graph Graph 結構及結點
org.jgraph.plaf Graph UI 委託組件
org.jgraph.util 常用的工具類
補充一下,與jGraph類似的可用於繪圖的還有eclipse的GEF。
jGraph模型
一張圖——JGraph 類 的主要結構:
JGraph extends JComponent {
org.jgraph.graph.GraphModel model; (DefaultGraphModel)
org.jgraph.plaf.GraphUI ui; (BasicGraphUI)
org.jgraph.graph.GraphLayoutCache cache;
}
JGraph 除了SWING的MVC結構,即引用了MODEL和UI外,他還保持着一個奇怪的應用GraphLayoutCache。GraphLayoutCache 可以被看作是MODEL的一個擴展,它的作用是保證圖中各結點的狀態以及一些外觀等。因爲圖的複雜性,使用一個GraphLayoutCache 可以用來處理這些複雜問題。
配置JGraph可以使用一系列的set方法,有許多很有用的功能可以開關。
圖的邏輯結構——GraphModel 類:
滿足MVC的要求,GraphModel保存着所有的圖中的對象,它的默認實現DefaultGraphModel能夠滿足一般的需求。
GraphModel包含三個基本操作:insert() , edit() , remove() 。這些操作會起到與GraphLayoutCache相同的效果,但與GraphLayoutCache略微不同的是它的參數比較多,乍看下去比較麻煩。其實GraphModel所要求的只是結點的邏輯結構,對於結點的細節它並不關心。所以可以在初始化圖時使用GraphModel,不要常常用它的方法來對細節做修改,這既不方便,也沒必要。
另外,就是GraphModel提供了許多get方法,可以很方便檢索相應的結點。
Cells
JGraph 的單位(Cells) 有三種:Vertex、 Edge、 Port。
Vertex 可以攜帶對象,由於JGraph是隻負責表示的,並不真正負責數據的操作。那麼在圖形和數據間就需要一個使者,這就是Vertex ,Vertex 可以是文字、圖形等對象。
Port 是一般比較陌生的單位,在圖的算法中並不設計Port,但在圖形表示中它十分有用。如同它的名字,他是Vertex上的一個端口,可以通過端口連接其他Vertex,而在JGraph中Port還可以用於改變Edge的形狀等等。
Edge 與圖算法中的邊也有一點不同,Edge 是隻能連接Port而不是Vertex的。這樣,因爲多了Port單元,使得Edge更加靈活、更加豐富了。
默認單元——DefaultCell:
它是DefaultEdge和DefaultPort的父類,又是DefaultMutableTreeNode的子類,其地位可以相當於Vertex。一個DefaultCell可以攜帶一個UserObject。每個DefaultCell還有一個AttributeMap,負責它的屬性(顏色、大小等等)。用一套set方法可以修改AttributeMap。
邊和端口單元——Edge、Port:
除了繼承DefaultCell,Edge、Port還有一些獨有的方法。
Edge有getSource() 和 getTarget() 方法,用以獲得邊的兩端的對象(一般爲Port)。還一個路由類,定義了一些路由方法。
Port 主要任務是承載Edge,所以有一些關於獲得Edge的方法。另外,Port還定義了獲得錨(比如一個Vertex中包含一個Port)的方法。
Cell的處理:
每個Cell包括Cell Object、Cell Renderer、Cell Editor、Cell Handle。其中Renderer負責Cell的表示,包括形狀等等。Editor 做Cell的修改用,當雙擊Cell後則調用Editor來編輯Cell。以上都是類似與JTable 和 JTree的。
Handle 是SWING的組件中沒有的,它的任務是處理Cell的大小與移動。可以重寫paint()方法來指定經過鼠標拖動所導致的Cell大小和位置變化。
對於這些單元的屬性的控制,可以仔細看看GraphConstants這個類的set方法,基本上所有的屬性都是用這個類的set修改的。
小結
- 通過GraphConstants可以設置大部分的屬性(我個人不喜歡這種方式)
- 一個Cell類型的實體,可以設置view、 renderer、 editor、 handler。
- 定製個性化的Cell ,需要繼承DefaultCell 後增加新的屬性和方法並實現他們,記得修改attributeMap,會有幫助的,以及引用UserObject。
- 還有一點,對於Cells只能調用插入、刪除、修改方法,無法對view調用。