2013-06-22 93 views
2

我在JUNG中使用TreeLayout作爲我的圖。用戶可以對圖形進行更改,然後應該更新並顯示更改。JUNG樹佈局動態更新

要啓用一個更新,我重新創建圖形,並設置使用它的佈局:

graph = new DelegateForest<String, Integer>(
      new DirectedOrderedSparseMultigraph<String, Integer>()); 
createGraph() //adds the vertices and edges to the graph 
layout.setGraph(graph); 
vv.repaint(); 

這不更新樹給它應該是什麼,但樹的佈局都將丟失。

大多數節點確實出現在正確的位置,但葉節點出現在隨機的地方。是否有可能找回第一次創建圖形時得到的樹結構?

+0

我相信他們失序的原因是因爲JUNG的'TreeLayout'將頂點存儲在HashMap中(其中的順序不能保證)。如果你複製JUNG的'TreeLayout'代碼並用'TreeHashMaps'代替它,我相信它會起作用。 – sdasdadas

+0

sdasdadas,這是不正確的。見下文。 –

回答

1

您需要使用更新的圖創建一個新的TreeLayout實例,並使用新的TreeLayout實例更新可視化。你在隨機地方得到新節點,因爲你有的TreeLayout實例沒有爲它們計算位置。

對於某些類型的圖形更新(僅適用於添加),這可能會更有效。但是目前我們的清單並不高。

+0

我不太清楚我明白爲什麼'setGraph'不會更新'TreeLayout'。他們都分配字段'graph',他們都調用'buildTree()'。構造函數做的唯一事情是'setGraph'方法不做的是設置間距。 – sdasdadas

+0

我已經看了更多,你是對的。這是因爲'TreeLayout'維護已經定位的頂點的Set。如果你有第二個,你是否介意解釋爲什麼佈局需要'Set'? – sdasdadas