程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 在Java中使用JGraph實現圖形繪制

在Java中使用JGraph實現圖形繪制

編輯:JAVA編程入門知識
  本來一直很少有機會接觸swing或AWT的,只是最近公司要做一個工作流定制界面,所以才終於得償所願。我知道,假如一切從底層做起的話,恐怕時間、精力都不答應,而現成的一些工作流產品又不能滿足公司特定行業工作流的需求,所以只好找一個開源的中間件進行修改了。 <!-- frame contents --> <!-- /frame contents --> 就這樣,慢慢的熟悉了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上看了一篇帖子,感慨頗深,其中一句“整天口若懸河新技術,不如將經典的舊技術爛醉於心”,一語解開了困惑我很長時間的一個疑團!從基本功做起,不是高手,唯手熟而……進入討論組討論。
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved