首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Prefuse图中删除节点

从Prefuse图中删除节点
EN

Stack Overflow用户
提问于 2012-05-25 03:43:20
回答 1查看 881关注 0票数 1

我正在尝试创建一个动态更新的Prefuse图,其中节点会定期添加和删除。我已经能够很好地添加节点和边,然后删除它们,但是当我尝试向下一组节点添加边时,我得到了异常。有没有人知道从Prefuse图中删除节点会有什么陷阱?或者,有没有人知道更好的方法来动态地与Prefuse图进行交互?

(请注意,显示正在正常更新;显示似乎始终与图形的内容相匹配。这不是对Prefuse Toolkit: dynamically adding nodes and edges的愚弄)

代码摘录:

代码语言:javascript
复制
// 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);

我得到的例外是:

代码语言:javascript
复制
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()在删除节点后返回较小的数字。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-25 21:05:32

经过更多的调查,这似乎是prefuse中的一个小错误。对addEdge的调用首先将源节点和目标节点编号初始化为0,然后该图尝试更新其度数,如果节点0不存在,则更新将失败。有关更多信息,请参阅SF页面上的bug report 3529747

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10744240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档