Graphstream 中的折叠节点

Collapsing nodes in Graphstream

我是否可以使用 graphstream 折叠图中一定数量的节点?我尝试添加 ui.hide 属性,但这不是我想要的。理想情况下,我希望在折叠的第一个节点上有一个 + 号,然后当我单击 + 号时,其余节点应该会出现。谁能帮我这个? TIA

不太确定我做对了,但我想你想要 fold/unfold 一棵树,有点像 IDE 上的 package/file 系统视图(eclipse,netbean。 ..).

如果我是对的,那么在 GraphStream 中有一些技巧可以帮助您做到这一点。

  • 如您所述,ui.hide 属性用于节点和边。
  • layout.frozen 属性阻止所选节点上的布局算法并允许您控制其位置。您可能希望将 "folded" 的位置设置在单击节点的位置,以提供 "folding" 的视觉感受。
  • ui.class 属性允许您将 CSS 类 分配给节点,从而为节点 folded/unfolded 节点赋予特定样式(例如添加 "plus" 标志图标)。
  • 为了在单击节点时得到通知,您需要从查看器检索 ProxyPipe 并监听来自该查看器的修改。特别是 ui.clicked 属性自动分配给被点击的节点。

    ProxyPipe fromViewer = viewer.newViewerPipe();
    fromViewer.addSink(new SinkAdapter(){
        @Override
        public void nodeAttributeAdded(String sourceId, long timeId, String nodeId, String attribute, Object value) {
            if(attribute.equals("ui.clicked")){
                // Being notified that a node was clicked...
            }
        }
    });
    
  • 最后,您必须决定折叠哪个节点。我想您需要一个以单击节点为根的简单迭代器。

    // let n be the clicked node...
    Iterator<Node> it = n.getBreadthFirstIterator(true);
    while(it.hasNext()){
        Node m  =  it.next();
        for(Edge e : m.getLeavingEdgeSet()) {
            e.setAttribute("ui.hide");
        }
        if(n != m) {
            m.setAttribute("ui.hide");
        }
    }
    

那么Layout算法在节点位置和稳定限制方面会很麻烦,但这并不重要。

您将在此要点中找到一个工作示例,其中单击的节点会折叠其子树:

https://gist.github.com/pigne/2d4c0cbe8583f8a8f6b03309becaff3f

这是折叠子树之前的示例树图:

具有节点 13 和 15 的同一图表在单击后折叠: