java - 从 Prefuse 图中删除节点

标签 java graph prefuse

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

(请注意,显示更新正常;显示始终与图表内容匹配。这不是 Prefuse Toolkit: dynamically adding nodes and edges 的欺骗)

代码摘录:

// 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);

我得到的异常(exception)是:

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() 在删除节点后返回较小的数字。

有什么想法吗?

最佳答案

经过更多调查,这似乎是 prefuse 中的一个小错误。调用 addEdge 首先将源节点号和目标节点号初始化为 0,之后图尝试更新其度数计数,如果节点 0 不存在,则更新失败。请参阅错误报告 3529747在他们的 SF 页面上了解更多信息。

关于java - 从 Prefuse 图中删除节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10744240/

相关文章:

Java/Swing : reference a component from another class

java - 如何自定义Swing组件(标准化字体)?

java - 使用 Streams 获取每个子部门和部门的员工,

java - 如何从我的 Facebook 应用程序发送电子邮件

java - 用扭曲遍历一个无向、未加权的图 : minimum visits to each node

c++ - 如何在 boost 图形库中使用 `randomize_property` 和捆绑属性图?

c++ - 网络图可视化

java - 在 Prefuse 中以编程方式绘制有向边

java - 使用 prefuse 的图形可视化过于密集

java - 如何通过JAVA的PREFUSE可视化工具包显示节点的矩形形状?