ノードが定期的に追加および削除される、動的に更新される 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() がより小さい数値を返すという点で、削除は成功しています。
何か案は?