[英]Prefuse Toolkit: dynamically adding nodes and edges
有沒有人有prefuse圖形工具包的經驗? 是否可以更改已顯示的圖形,即。 添加/刪除節點和/或邊緣,並使顯示正確適應?
例如,prefuse附帶了一個可視化朋友網絡的示例:
http://prefuse.org/doc/manual/introduction/example/Example.java
我想做的是這樣的事情:
// -- 7. add new nodes on the fly -------------------------------------
new Timer(2000, new ActionListener() {
private Node oldNode = graph.nodes().next(); // init with random node
public void actionPerformed(ActionEvent e) {
// insert new node //
Node newNode = graph.addNode();
// insert new edge //
graph.addEdge(oldNode, newNode);
// remember node for next call //
oldNode = newNode;
}
}).start();
但它似乎沒有用。 任何提示?
你應該知道幾層prefuse:
簡而言之,這三層可以通過這種方式鏈接:
Graph graph = new Graph(eg. yourXML_file);
Visualization viz = new Visualization();
viz.add(GRAPH, graph);
Display disp = new Display();
disp.setVisualization(viz);
顯示是您照常添加到面板的圖形組件。
在這里,您只需修改數據層。
Node newNode = graph.addNode();
graph.addEdge(oldNode, newNode);
您現在需要更新可視圖層:
viz.run("repaint");
必須定義重繪動作。
ActionList repaint = new ActionList();
repaint.add(new RepaintAction());
viz.putAction("repaint", repaint);
我真的建議你閱讀prefuse doc 。 你可以在官方論壇上找到很多資源
至少,我可以說,prefuse目前對於實時圖形更新並不是非常有效。
但它應該不夠,因為您修改了圖形結構,您必須在可視化中重新生成它(即重新計算節點放置等...)。 您的示例代碼中已經定義了兩個操作。 在actionPerformed結束時運行它們。
viz.run("color");
viz.run("layout");
這種方法效率不高,因為每次添加節點時都會增加大量的計算,但目前沒有其他的預處理。
正如我在另一篇文章中指出的那樣,原始示例中新節點和邊緣不可見的原因是節點的顏色等未正確設置。 解決這個問題的一種方法是明確調用vis.run(“color”); 每當添加節點或邊緣時。
或者,我們可以通過初始化我們添加它的ActionList(在原始示例中稱為“color”)稍微不同來確保顏色操作始終在運行:
代替
ActionList color = new ActionList();
我們可以寫
ActionList color = new ActionList(Activity.INFINITY);
這使動作列表無限期地運行,以便新的節點/邊緣將自動初始化為其視覺外觀。
然而,我不清楚這是否真的是首選的方法 - 對於像動態布局動作(例如ForceDirectedLayout)這樣的事情,這樣的聲明非常有意義,但對於顏色來說,在我看來,持續運行的着色操作主要是高架。
因此,也許之前發布的只是在圖表擴展時明確地(但僅一次)運行“顏色”動作的解決方案可能是更好的選擇......
好的,在通過預熔源挖掘了一下之后,我現在可以更好地了解工作原理。 我發現實際上我用上面的代碼創建的新節點不僅正確地添加到圖形中,可視化也注意到它!
因此,與傑羅姆建議的不同,沒有必要明確地調用vis.run(“布局”)。
- on white background that is. 我認為節點沒有正確添加的原因是它們在上繪制的 。 並不驚訝他們有點難以發現。
要修復,必須在插入新節點后調用顏色操作,如下所示:
// insert new edge //
graph.addEdge(oldNode, newNode);
vis.run("color"); // <- this is new
(請注意,此操作在// 4.下的Example.jar代碼中進一步定義。)
我現在最不確定的一件事是,調用此動作是否會使prefuse再次遍歷所有圖形節點並設置它們的顏色 - 當然,對於非常大的圖形來說是不希望的。
你需要告訴控件容器('d',在example.java中)重新繪制。 調用invalidate()應該足夠了(但不確定)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.