JGraph開發(fā)經(jīng)驗(yàn)談
發(fā)表時(shí)間:2024-05-28 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]契子 本來一直很少有機(jī)會(huì)接觸swing或AWT的,只是最近公司要做一個(gè)工作流定制界面,所以才終于得償所愿。我知道,如果一切從底層做起的話,恐怕時(shí)間、精力都不允許,而現(xiàn)成的一些工作流產(chǎn)品又不能滿足公司特定行業(yè)工作流的需求,所以只好找一個(gè)開源的中間件進(jìn)行修改了。就這樣,慢慢的認(rèn)識(shí)了JGraph……...
契子 本來一直很少有機(jī)會(huì)接觸swing或AWT的,只是最近公司要做一個(gè)工作流定制界面,所以才終于得償所愿。我知道,如果一切從底層做起的話,恐怕時(shí)間、精力都不允許,而現(xiàn)成的一些工作流產(chǎn)品又不能滿足公司特定行業(yè)工作流的需求,所以只好找一個(gè)開源的中間件進(jìn)行修改了。就這樣,慢慢的認(rèn)識(shí)了JGraph……
關(guān)于JGraph,open-open上是這樣介紹的:JGraph,純Java開發(fā)的圖形組件,支持拖,放,縮放,合并等其它操作。它可以被結(jié)合到任何的Swing應(yīng)用程序當(dāng)中。
在JGraph的網(wǎng)站上可以看到,它分為Free、Pro和Layout Pro版本,作為廣大的“勞苦民眾”來說,當(dāng)然首選Free版了,呵呵~~
JGraph的畫圖機(jī)制 參照了JGraph的example和源代碼,發(fā)現(xiàn):
JGraph將圖元定義為一個(gè)一個(gè)的cell,每個(gè)cell可以是一個(gè)頂點(diǎn)(Vertex)、邊(Edge)或者節(jié)點(diǎn)(Port)中的一種。頂點(diǎn)可以有鄰接的頂點(diǎn),他們通過邊相聯(lián)系,邊聯(lián)接的兩個(gè)端點(diǎn)稱為目標(biāo)和源,每個(gè)目標(biāo)或者源是一個(gè)節(jié)點(diǎn)。節(jié)點(diǎn)是頂點(diǎn)的孩子。每個(gè)cell都可以有自己的孩子。
每個(gè)cell的外觀由相應(yīng)的屬性定義,屬性序列是指一系列的鍵-值對(duì),他們以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的擴(kuò)展 JGraph只是提供單純的圖形繪制功能,不包含實(shí)際的數(shù)據(jù),所以要想辦法把自己的數(shù)據(jù)“加”進(jìn)去才行,這恐怕就得考慮擴(kuò)展JGraph了。
頂點(diǎn)(Vertex)對(duì)應(yīng)的類為org.jgraph.graph.DefaultGraphCell
邊(Edge)對(duì)應(yīng)的類為org.jgraph.graph.DefaultEdge
節(jié)點(diǎn)(Port)對(duì)應(yīng)的類為org.jgraph.graph.DefaultPort
我們要做的,僅僅是分別繼承相應(yīng)的類,并把自己的數(shù)據(jù)對(duì)象放進(jìn)去而已。當(dāng)然,還可以改變相應(yīng)的外觀屬性。不過如果你對(duì)繪圖事件也感興趣的話(呵呵,十有八九應(yīng)該有用的),還要留意一下org.jgraph.graph.BasicMarqueeHandler和org.jgraph.graph.GraphUndoManager這兩個(gè)類呢。BasicMarqueeHandler中包括了在畫布上點(diǎn)擊鼠標(biāo)、增加連線、合并等等事件的處理,而GraphUndoManager則主管撤銷、回復(fù)事件
如果仔細(xì)操作,你也許回發(fā)現(xiàn),點(diǎn)擊邊(Edge)的端點(diǎn)進(jìn)行移動(dòng)的事件并不由GraphUndoManager來處理,這時(shí)候就要再關(guān)注一個(gè)類了:org.jgraph.graph.EdgeView.EdgeHandle,這是一個(gè)內(nèi)部類,如果需要的話,自己重寫一個(gè)類繼承它吧。這樣,大部分需要的事件都盡在自己的掌握中了
嘿嘿~~~~
總結(jié) 其實(shí)也沒什么好總結(jié)的,寫本文也是猶豫再三才開鍵盤的,本來準(zhǔn)備在上個(gè)月就寫呢。一直拖到現(xiàn)在,因?yàn)橛X得只是簡單的應(yīng)用而已,全是基本功,沒有一點(diǎn)“高級(jí)”的“新意”,好像實(shí)在沒什么好寫的。
今天在BlogJava上看了一篇帖子,感觸頗深,其中一句“整天口若懸河新技術(shù),不如將經(jīng)典的舊技術(shù)爛醉于心”,一語解開了困惑我很長時(shí)間的一個(gè)疑團(tuán)!從基本功做起,不是高手,唯手熟而……
后記 如果有朋友對(duì)類似的項(xiàng)目感興趣,歡迎指點(diǎn),共同研究討論。