posts - 66, comments - 12, trackbacks - 0, articles - 0

          jgraph 開發( 轉帖)

          Posted on 2008-06-27 09:22 cyantide 閱讀(1043) 評論(0)  編輯  收藏 所屬分類: 其它
          Jgraph http://www.jgraph.com/ 是一個開源的,兼容Swing的基于MVC體系結構圖形組件,具有以下特點:
          1) 完全Swing兼容;
          2) 簡單、高效的設計;
          3) 時間效率高;
          4) 100 %純Java;
          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是一個對圖進行布局的軟件,但是目前要收費的,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修改的。
          二、JGraph設計
          1) MVC
          Swing是Java(Sun)提供的UI標準實現之一,Swing基于AWT(Abstract Windowing Toolkit)。JGraph完全兼容Swing,它的實現仍然基于MVC體系結構。
          JGraph MVC
          View:
          JGraph不包含實際的數據,它提供了數據的視;JGraph對象畫圖的機制是:
          將圖元定義為一個一個的 cell,每個cell可以是一個頂點(vertex)、邊(edge)或者節點(port)中的一種。頂點可以有鄰接的頂點,他們通過邊相聯系,邊聯接 的兩個端點稱為目標和源,每個目標或者源是一個節點。節點是頂點的孩子。每個cell都可以有自己的孩子。
          每個cell的外觀由相應的屬性定義,屬性序列是指一系列的鍵-值對,他們以Map形式組織,例如:
          Map cellAttrib = new Hashtable();
          // Set bounds
          Rectangle2D helloBounds = new Rectangle2D.Double(20, 20, 40, 20);
          GraphConstants.setBounds(cellAttrib, helloBounds);
          // Set black border
          GraphConstants.setBorderColor(cellAttrib, Color.black);
          一個cell有類似這樣一個cellAttrib的Map,來定義其外觀。
          外觀可以指定諸如一條邊的箭頭樣式等屬性。
          Model:
          數據對象可以看成是JGraph中兩個獨立結構 的鏈接點:grahp結構和group結構。Graph結構基于圖論中的頂點、邊定義。Group結構是cell的composition結構。 Graph結構中getSource()和getTarget()方法,獲得源和目標節點。而在group中通過getChild(), getParent()來獲得cell的組成結構。
          2) 低層基于圖論邏輯
          即:一個圖G包含一個非空的元 素集V(G)和一個E(G),其中,E(G)是V(G)中兩個無序元素組成的二元組。V(G)稱為圖G頂點的集合,如果任意集合V(G)中的頂點x/y, (x,y)在E(G)中,邊(x,y)可能以連接頂點x和y的邊(弧)所代表,X與y就被稱為鄰接的,否則x與y不鄰接。
          三、JGraph的應用
          以下是一個基于JGraph的Helloworld的分析:

        1. import省略   
        2. public class HelloWorld {   
        3. public static void main(String[] args) {   
        4. // Construct Model and Graph   
        5. GraphModel model = new DefaultGraphModel();   
        6. JGraph graph = new JGraph(model);   
        7. graph.setSelectNewCells(true);   
        8. // Create Nested Map (from Cells to Attributes)   
        9. // 此Map中記錄所有屬性,其中的鍵-值對是cell-cellAttribute   
        10. // 每個cellAttribute又是一個Map,其鍵-值對是具體一個cell的屬性-值   
        11. Map attributes = new Hashtable();   
        12. // 以下建立兩個頂點(cell)Hello和World,并分別設置他們的屬性Map   
        13. // Create Hello Vertex   
        14. DefaultGraphCell hello = new DefaultGraphCell("Hello");   
        15. // Create Hello Vertex Attributes   
        16. Map helloAttrib = new Hashtable();   
        17. attributes.put(hello, helloAttrib);   
        18. // Set bounds   
        19. Rectangle2D helloBounds = new Rectangle2D.Double(20204020);   
        20. GraphConstants.setBounds(helloAttrib, helloBounds);   
        21. // Set black border   
        22. GraphConstants.setBorderColor(helloAttrib, Color.black);   
        23. // Add a Port   
        24. // 每個頂點為了與其他頂點相鄰接,必須添加節點(cell)   
        25. DefaultPort hp = new DefaultPort();   
        26. hello.add(hp);   
        27. // Create World Vertex   
        28. DefaultGraphCell world = new DefaultGraphCell("World");   
        29. // Create World Vertex Attributes   
        30. Map worldAttrib = new Hashtable();   
        31. attributes.put(world, worldAttrib);   
        32. // Set bounds   
        33. Rectangle2D worldBounds = new Rectangle2D.Double(1401404020);   
        34. GraphConstants.setBounds(worldAttrib , worldBounds);   
        35. // Set fill color   
        36. GraphConstants.setBackground(worldAttrib, Color.orange);   
        37. GraphConstants.setOpaque(worldAttrib, true);   
        38. // Set raised border   
        39. GraphConstants.setBorder(worldAttrib,    
        40. BorderFactory.createRaisedBevelBorder());   
        41. // Add a Port   
        42. DefaultPort wp = new DefaultPort();   
        43. world.add(wp);   
        44. // 建立聯接兩個頂點的邊   
        45. // Create Edge   
        46. DefaultEdge edge = new DefaultEdge();   
        47. // Create Edge Attributes   
        48. Map edgeAttrib = new Hashtable();   
        49. attributes.put(edge, edgeAttrib);   
        50. // Set Arrow   
        51. int arrow = GraphConstants.ARROW_CLASSIC;   
        52. GraphConstants.setLineEnd(edgeAttrib , arrow);   
        53. GraphConstants.setEndFill(edgeAttrib, true);   
        54. // Connect Edge   
        55. // 邊的兩個端點就是兩個頂點的child節點(port)   
        56. ConnectionSet cs = new ConnectionSet(edge, hp, wp);   
        57. Object[] cells = new Object[]{edge, hello, world};   
        58. // Insert into Model   
        59. // model構件完成   
        60. model.insert(cells, attributes, cs, nullnull);   
        61. // Show in Frame   
        62. JFrame frame = new JFrame();   
        63. frame.getContentPane().add(new JScrollPane(graph));   
        64. //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
        65. frame.pack();   
        66. frame.setVisible(true);   
        67. }   
        68. }  

        69. 主站蜘蛛池模板: 丽水市| 双鸭山市| 宁城县| 新绛县| 罗定市| 托里县| 灌阳县| 麟游县| 新乡市| 长乐市| 阿拉善右旗| 尚志市| 德兴市| 稷山县| 遵义市| 普兰店市| 西和县| 阳信县| 临洮县| 屏南县| 清涧县| 涿鹿县| 安阳县| 寻甸| 柏乡县| 孙吴县| 郁南县| 墨脱县| 泽普县| 两当县| 韩城市| 合山市| 察隅县| 岑溪市| 昌乐县| 广灵县| 陆良县| 虞城县| 左权县| 米易县| 常山县|