有人有使用过保险丝图形工具包的经验吗?是否可以更改已经显示的图形,即。添加/删除节点和/或边缘,并正确调整显示?

例如,prefuse附带一个示例,该示例形象化了一个朋友网络:

http://prefuse.org/doc/manual/introduction/example/Example.java

我想做的事情与此类似:

// -- 7. add new nodes on the fly -------------------------------------
new Timer(2000, new ActionListener() {
    private Node oldNode = graph.nodes().next(); // init with random node

    public void actionPerformed(ActionEvent e) {
        // insert new node //
        Node newNode = graph.addNode();

        // insert new edge //
        graph.addEdge(oldNode, newNode);

        // remember node for next call //
        oldNode = newNode;
    }
}).start();

但这似乎不起作用。有什么提示吗?

最佳答案

您应该知道预灌注的几层:

  • 数据
  • 可视化
  • 显示

  • 简而言之,可以通过以下方式链接三层:
    Graph graph = new Graph(eg. yourXML_file);
    Visualization viz = new Visualization();
    viz.add(GRAPH, graph);
    Display disp = new Display();
    disp.setVisualization(viz);
    

    显示是您通常添加到面板中的图形组件。

    在这里,您仅修改数据层。
    Node newNode = graph.addNode();
    graph.addEdge(oldNode, newNode);
    

    您现在需要更新视觉层:
    viz.run("repaint");
    

    必须定义重画动作。
    ActionList repaint = new ActionList();
    repaint.add(new RepaintAction());
    viz.putAction("repaint", repaint);
    

    我真的建议您阅读prefuse doc
    您可以在官方forum上找到很多资源

    至少,我可以告诉您,目前对于实时图形更新而言,预填充并不十分有效。

    但这还不够,因为您修改了图形结构后,必须在可视化中重新生成它(即重新计算节点的位置等)。在示例代码中已经定义了两个动作。在actionPerformed结束时运行它们。
    viz.run("color");
    viz.run("layout");
    

    这种方法不是很有效,因为每次添加一个节点都会增加很多计算,但是目前还没有其他方法可以使用。

    07-23 16:24