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 的同一图表在单击后折叠:
我是否可以使用 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 的同一图表在单击后折叠: