簡體   English   中英

從Prefuse圖中刪除節點

[英]Removing nodes from a Prefuse graph

我正在嘗試創建動態更新的Prefuse圖,其中定期添加和刪除節點。 我已經能夠很好地添加節點和邊,然后刪除它們,但是當我嘗試將邊添加到下一組節點時,我得到了例外。 有人知道從Prefuse圖中刪除節點有什么陷阱嗎? 或者,沒有人知道更好的與Prefuse圖動態交互的方法嗎?

(請注意,顯示正在良好地更新;在任何時候,顯示似乎都與圖的內容匹配。這並不是Prefuse Toolkit復制品:動態添加節點和邊

代碼摘錄:

// Set up edge and node tables
Schema node_schema = new Schema();
Schema edge_schema = new Schema();
node_schema.addColumn("node_info", NodeInfo.class);
edge_schema.addColumn("source", int.class, 0);
edge_schema.addColumn("target", int.class, 0);
edge_schema.addColumn("edge_info", EdgeInfo.class);
graph_nodes = node_schema.instantiate();
graph_edges = edge_schema.instantiate();

...

// Set up visualization
graph = new Graph(graph_nodes, graph_edges, false);
vis_panel = new MyVisPanel(graph);

...

// Add nodes & edges
int new_node_1 = graph_nodes.addRow();
graph_nodes.set(new_node_1, "node_info", new NodeInfo());
int new_node_2 = graph_nodes.addRow();
graph_nodes.set(new_node_2, "node_info", new NodeInfo());
int new_edge = graph_edges.addRow();
graph_edges.set(new_edge, "target", new_node_1);
graph_edges.set(new_edge, "source", new_node_2);

... 

// Remove nodes
TupleSet nodes = graph.getNodes();
Iterator iter = nodes.tuples(my_predicate);
while(iter.hasNext())
{
    int row_to_delete = ((Tuple) iter.next()).getRow();
    if(graph.removeNode(row_to_delete))
    {
        System.out.println("Removed row " + row_to_delete);
    }
}

...

// Add nodes & edges again
int new_node_1 = graph_nodes.addRow();
graph_nodes.set(new_node_1, "node_info", new NodeInfo());
int new_node_2 = graph_nodes.addRow();
graph_nodes.set(new_node_2, "node_info", new NodeInfo());
int new_edge = graph_edges.addRow(); // <<-- Exception is thrown here
graph_edges.set(new_edge, "target", new_node_1);
graph_edges.set(new_edge, "source", new_node_2);

我得到的異常是:

java.lang.IllegalArgumentException: Row index out of bounds: -1
    at prefuse.data.column.IntColumn.getInt(Unknown Source)
    at prefuse.data.Table.getInt(Unknown Source)
    at prefuse.data.Graph.updateDegrees(Unknown Source)
    at prefuse.data.Graph.updateDegrees(Unknown Source)
    at prefuse.data.Graph$Listener.tableChanged(Unknown Source)
    at prefuse.data.Table.fireTableEvent(Unknown Source)
    at prefuse.data.Table.addRow(Unknown Source)
    at my_pkg.addSomeNodesFunction(my_code.java:99)

我沒有使用標准的Graph.addNode()和addEdge()方法,因為用這種方法設置邊緣信息似乎更加困難。 (如果有更好的方法,請告訴我!)刪除成功,因為在刪除節點之后,graph.getNodeCount()和graph.getEdgeCount()返回的數字較小。

有任何想法嗎?

經過更多調查后,這似乎是一個很小的錯誤。 調用addEdge首先將源和目標節點號初始化為0,此后圖形嘗試更新其度數計數,如果節點0不存在則失敗。 有關更多信息,請參見其 SF頁面上的錯誤報告3529747

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM