Java 从预使用图中删除节点
我正在尝试创建一个动态更新的预使用图,其中定期添加和删除节点。我可以很好地添加节点和边,然后删除它们,但是当我尝试将边添加到下一组节点时,会出现异常。有人知道从预使用图中删除节点有什么陷阱吗?或者,有人知道一种更好的方法来动态地与预使用图交互吗 (请注意,显示更新良好;始终显示似乎与图形内容匹配。这不是重复) 代码摘录:Java 从预使用图中删除节点,java,graph,prefuse,Java,Graph,Prefuse,我正在尝试创建一个动态更新的预使用图,其中定期添加和删除节点。我可以很好地添加节点和边,然后删除它们,但是当我尝试将边添加到下一组节点时,会出现异常。有人知道从预使用图中删除节点有什么陷阱吗?或者,有人知道一种更好的方法来动态地与预使用图交互吗 (请注意,显示更新良好;始终显示似乎与图形内容匹配。这不是重复) 代码摘录: // Set up edge and node tables Schema node_schema = new Schema(); Schema edge_schema = n
// 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);
我没有使用标准的Graph.addNode()和addEdge()方法,因为这样设置边信息似乎比较困难。(如果有更好的方法,请告诉我!)删除成功,在该图中。getNodeCount()和graph.getEdgeCount()在删除节点后返回较小的数字
有什么想法吗?经过进一步调查,这似乎是使用前的一个小错误。对addEdge的调用首先将源节点和目标节点编号初始化为0,然后图形尝试更新其度数计数,如果节点0不存在,则更新失败。更多信息,请参见SF页面上的错误报告。经过更多调查,这似乎是使用前的一个小错误。对addEdge的调用首先将源节点和目标节点编号初始化为0,然后图形尝试更新其度数计数,如果节点0不存在,则更新失败。更多信息,请参见SF页面上的错误报告
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)