使用"always-on"自动布局的图形流



我正在用一个小编译器玩graphstream,我正在写一个抽象语法树可视化,像这样:

// ASTNode is the root to to the AST tree. Given that node, this just displays
// the AST on-screen.
public static void visualize(ASTNode ast) throws IOException, URISyntaxException {
Path file = Path.of(VisualizeAbstractSyntaxTree.class.getResource("graph.css").toURI());
String css = Files.readString(file);
System.setProperty("org.graphstream.ui.renderer", "org.graphstream.ui.j2dviewer.J2DGraphRenderer");
Graph graph = new SingleGraph("AST");
graph.addAttribute("ui.stylesheet", css);
construct(ast, "0", graph);  // construct the tree from the AST root node.
Viewer viewer = graph.display();
}

运行该程序显示了自动定位的魔力。但是,当鼠标拖动某个节点时,其他节点将保持静止。如果用鼠标拖动节点,是否有一种简单的方法可以让其他节点做出反应(也被拖动(?

这必须得到支持,但我似乎找不到任何例子或API对此的引用?

我不知道函数背后的代码,但通常使用默认查看器是自动的。您可以尝试使用强制激活自动布局

viewer.enableAutoLayout();

你可以在网站上找到一些文档。

如果自动布局有效,但只是突然停止,那么布局算法的参数可能不适合您。布局算法是为了在达到稳定点时停止而编写的,但您可以更改这一点。

你只需要定义一个你喜欢的布局算法的新实例并使用它:

SpringBox l = new SpringBox();

然后可以定义参数,例如力或稳定点。惯例是,值0意味着控制布局的过程不会停止布局(因此不会考虑稳定极限(。换句话说,布局将无休止地计算

l.setStabilizationLimit(0);

但请记住,如果你想使用布局算法的实例,你需要在显示之前创建你的查看器。这意味着要建立自己的ui。这里有一个简单的例子,你可以在官方github:上找到更多

SpringBox l = new SpringBox(); // The layout algorithm
l.setStabilizationLimit(0);
Viewer viewer = new Viewer(graph, Viewer.ThreadingModel.GRAPH_IN_GUI_THREAD);
viewer.enableAutoLayout(l); // Add the layout algorithm to the viewer
// Build your UI
add(viewer.addDefaultView(false), BorderLayout.CENTER); // Your class should extends JFrame
setSize(800, 600);
setVisible(true);

相关内容

  • 没有找到相关文章

最新更新