2012-05-24 4 views
1

노드가 정기적으로 추가되고 삭제되는 동적으로 업데이트되는 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); 

가 내가 얻을 수는 예외입니다 : 에지 정보 WA 그 설정 어려워 보였다 때문에

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()는 노드 삭제 후 더 작은 숫자를 반환합니다.

아이디어가 있으십니까?

답변

1

더 많은 조사가 끝나면 이것은 프리 퓨즈의 사소한 버그 인 것처럼 보입니다. addEdge를 호출하면, 소스 노드와 타겟 노드의 번호를 0에 초기화 한 다음, 그래프가 그 정도 카운트를 갱신하려고합니다. 노드 0이 존재하지 않는 경우는 실패합니다. 자세한 내용은 해당 SF 페이지의 버그 보고서 3529747을 참조하십시오.