[轉]初識jGraph



        在爲老師寫項目的時候我急需一個基於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調用。
 
發佈了22 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章