0

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

4

1 回答 1

1

不完全确定我做对了,但我希望你想要折叠/展开一棵树,有点像 IDE 上的包/文件系统视图(eclipse,netbean ...)。

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

  • 正如您所提到的,该ui.hide属性用于节点和边。
  • layout.frozen阻止所选节点上的布局算法并允许您控制其位置的属性。您可能希望将“折叠”的位置设置在单击节点的位置,以提供“折叠”的视觉感觉。
  • ui.class属性允许您将 CSS 类分配给节点,从而为节点折叠/展开节点赋予特定样式(例如,添加“加号”符号图标)。
  • 为了在单击节点时得到通知,您需要从查看器中检索 aProxyPipe并收听来自该查看器的修改。特别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");
        }
    }
    

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

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

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

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

单击后与节点 13 和 15 相同的图形折叠: 节点 13 和 15 折叠的同一张图

于 2016-08-13T15:08:55.817 回答