无论如何我可以使用graphstream在图中折叠一定数量的节点吗?我试过添加 ui.hide 属性,但这不是我想要的。理想情况下,我希望在折叠的第一个节点上有一个 + 号,然后当我单击 + 号时,其余节点应该会出现。谁能帮我这个?TIA
问问题
642 次
1 回答
1
不完全确定我做对了,但我希望你想要折叠/展开一棵树,有点像 IDE 上的包/文件系统视图(eclipse,netbean ...)。
如果我是对的,那么有一些技巧可以帮助您在 GraphStream 中做到这一点。
- 正如您所提到的,该
ui.hide
属性用于节点和边。 layout.frozen
阻止所选节点上的布局算法并允许您控制其位置的属性。您可能希望将“折叠”的位置设置在单击节点的位置,以提供“折叠”的视觉感觉。- 该
ui.class
属性允许您将 CSS 类分配给节点,从而为节点折叠/展开节点赋予特定样式(例如,添加“加号”符号图标)。 为了在单击节点时得到通知,您需要从查看器中检索 a
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"); } }
那么布局算法在节点位置和稳定性限制方面会很麻烦,但这并不重要。
您将在此要点中找到一个工作示例,其中单击的节点折叠其子树:
https://gist.github.com/pigne/2d4c0cbe8583f8a8f6b03309becaff3f
于 2016-08-13T15:08:55.817 回答