伴隨着前期的基礎積累,翻過API,讀過一些Demo,總以爲本身已經摸透了Prefuse,小打小鬧彷佛已經沒法知足心裏膨脹的本身。還記得兒時看的《武狀元蘇乞兒》中降龍十八掌最後一張竟然是空白頁,在危在旦夕之際覺得本身要嗝屁了,一陣東風讓蘇乞兒明白了,最後一章要作的原來是——整合。沒錯,今天咱們就來好好談談整合!html
看懂API不表明你會靈活運用某個類,會用一些類不表明能實現小功能,耍的了小功能不必定會作可視化工具整合,整合之道,奧妙無窮!算法
前篇回顧:上篇《漫談可視化Prefuse(四)---被玩壞的Prefuse API》主要從Prefuse API角度,單線條的依據API之道,對部分類進行剖析,經過coding實現小功能並輔之於圖爲證,大體提供了一條學習Prefuse的路線。期間也有衆多志同道合之友前來了解Prefuse到底爲什麼物、能作什麼,問答之間着實讓人興奮不已。數據庫
本篇做爲在博客園裏漫談可視化Prefuse系列的收尾篇,主要看看本身對於Prefuse的粗劣的整合,重點介紹下本身在整合期間印象較爲深入的片斷和coding瞬間。其中包括有對於單例模式、匿名內部類、源碼改動等認識。編程
1.理想與現實——總會有差距微信
需求催生產品,產品老是滯後不斷更新的需求。函數
需求:一款visualization tool,像Gephi那樣炫酷,像i2那樣流暢強大;工具
產品:不斷更迭中佈局
問題:須要全手工搭建,瞭解Swing,熟悉Prefuse,學會借鑑,深諳拼湊整合之道學習
功能(目前):數據導入+鏈接數據庫+圖片另存爲+佈局算法切換+節點標籤顯示+節點形狀改變+適合屏幕顯示+高亮近鄰顯示+控制圖形佈局開關 等等spa
產品部分截圖:
(1)主界面
界面頂部是實現功能的菜單欄(固然還有裹在各個菜單欄裏面的菜單選項);
界面左邊是信息提示框,用於顯示導入圖形的節點和邊的相關信息,信息提示面板中還有一個隱藏的Label用於顯示有向/無向/混合圖信息以及一個控制佈局的開關(初始狀態爲灰,不可用);
界面的核心部分是一個JSplitPanel,用於圖形的展現;
整個圖形的佈局採用GridBagLayout,無需爲工具由於縮放以及最大化最小化而致使控件大小不能動態調整而煩惱
(2)文件菜單欄
其中功能有"打開...":用於打開指定文件並導入數據
鏈接數據庫:用於鏈接Sql server2005數據庫,從中讀取點和邊信息並展現圖形,詳情點擊這裏。
存儲爲:初始狀態爲灰不可用,由於此時沒有導入圖形,當圖形導入並展示後即可變爲正常可用。用於存儲展現圖形
退出:exit tool
其餘菜單欄不一一展現,在圖形爲加載到面板時,大多數爲灰不可用狀態。
佈局算法菜單欄:力導向佈局、圓形佈局、隨機佈局、網格佈局、FruchtermanReingold佈局
標籤配置菜單欄:不顯示、顯示文本、顯示文本與圖片
節點配置菜單欄:圓形、矩形、圓角矩形
控制器菜單欄:適應屏幕顯示
2.源碼動一動——讓不可能成爲可能
做爲老產品,想要與Gephi等同臺競技,不只要拼實力,更要拼靈活應對,經過讀爛API都沒法解決的問題,換個思惟,動一動源碼就會豁然開朗。
(1)節點形狀
源碼中,Prefuse圖形展現的節點是矩形或是圓角矩形,怎麼看怎麼以爲有點突兀,不柔和,相比之下Gephi中的圓形看上去要舒服得多。那麼問題來了……如何完成這個功能,僅僅經過傳參等手段已經不夠用了,因此順藤摸瓜,找到LabelRenderer類
從該類的紅色代碼能夠發現,這裏只有兩種形狀RoundRectangle2D和Rectangle2D,因此須要修改源碼,添加第三種形狀圓形即Arc2D。
改動以下:
這樣就能夠完成以下的轉變:
(2)節點與標籤無關聯顯示
雖然(1)實現了圖形的圓形節點顯示,可是存在一個問題:節點的大小會由於節點上標籤的不一樣而不一樣,顯然這個節點大小是不具有任何意義的,因此,源碼要改。咱們要作的就是下降節點與標籤的大小形狀依賴,同時讓節點的形狀具備本身的意義,這裏經過按照每一個節點度數來決定節點的大小,爲了提升健壯性,這裏採用log函數對度數進行歸一化處理,另外還對於節點添加邊框顯示。最終獲得的結果以下:
從以上兩個例子,咱們能夠發現源碼並非不可撼動,源碼隨着時代的變遷也會有力不從心的那一天,
3.三思而行——設計很重要 基礎要紮實
(1)單例模式:
在Prefuse講求一個數據中心Visualization的概念,全部的約束和效果都會添加到Visualization中,那麼如何保證在不一樣類中還能得到到具備相同配置參數的數據中心對象。咱們知道,不一樣的對象會有不一樣的參數、成員,因此,這裏咱們採用單例模式。關於什麼是單例模式想必你們都不陌生,有餓漢式和懶漢式,不清楚的,網上能夠找資料瞭解下。採用單例模式的好處是,在任何地方咱們只要建立某個類的對象都是同一對象,從而保證了該對象的一致性,好比在可視化工具中要向一個已有的數據可視化中心對象visualization中添加一個佈局Action效果,若是不採用傳值等方法而是新建一個對象,則會形成新建的數據中心對象中只有這個新添加的佈局Action,從而"丟失"了前面的全部參數。
該工具中的數據中心對象就是採用單例模式,部分代碼以下:
1
2
3
4
5
6
7
8
|
private
static
Visualization visInstance;
public
static
Visualization getVisualization(){
if
(visInstance ==
null
){
visInstance =
new
Visualization();
}
return
visInstance;
}
|
(2)匿名內部類:
之前只是知道匿名內部類有其特有的優越性和方便性,簡約,有其在Swing編程中常常被使用,可是一些使用細節未曾注意。
在實際功能編寫中,遇到相似於添加監聽器這樣的操做,常常出如今匿名內部類中的變量報錯,提示信息也不清楚,後來網上一查,才知道原來在匿名內部類中使用的外部變量都須要爲final類型,瞭解後對於匿名內部類與外部類之間的關係與生命週期又有了新的認識。關於匿名內部類與final的淵源詳見這裏。
4.工具概覽
下面從一個圖形的導入開始,經過圖形大體瞭解工具的一些功能:
(1)點擊"打開..."菜單項後
(2)選擇socialnet.xml並點擊'"打開"
(3)點擊"肯定",圖形展現
能夠看到左邊信息提示面板顯示了圖的節點和邊的數量以及圖的性質,同時將鼠標放在節點"Jeff"上,會有高亮顯示和近鄰節點顯示
(4)點擊"FruchtermanReingold佈局"
(5)點擊標籤設置中的"不顯示"
(6)點擊節點設置中的"矩形"
(7)數據量稍大時展示不吃力
雖然只是一個簡單的工具,雖然這個工具還不成氣候,雖然還有太多的體會沒有及時說起,可是卻真真實實的檢驗了本身也清醒的認識了本身。
做爲一名碼農,應該恪守"知行合一"的鐵律,沒作整合以前不要說本身能作到如何狂拽炫酷,也不用說本身如何舉步維艱。作好可行性分析,踏踏實實寫好每一行代碼,不斷思考是否有新的思路和更高效的設計和方法纔是王道。
若是以爲有用,記得點贊哦^_^
本文連接:《漫談可視化Prefuse(五)---一款屬於我本身的可視化工具》
若是您以爲閱讀本文對您有幫助,請點一下「推薦」按鈕,您的「推薦」將是我最大的寫做動力!若是您想持續關注個人文章,請掃描二維碼,關注JackieZheng的微信公衆號,我會將個人文章推送給您,並和您一塊兒分享我平常閱讀過的優質文章。
友情贊助
若是你以爲博主的文章對你那麼一點小幫助,恰巧你又有想打賞博主的小衝動,那麼事不宜遲,趕忙掃一掃,小額地贊助下,攢個奶粉錢,也是讓博主有動力繼續努力,寫出更好的文章^^。
1. 支付寶 2. 微信