使用 "always-on" 自动布局的图形流
graphstream using "always-on" autolayout
我正在使用我正在编写的小型编译器来玩弄 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();
您可以在 website 中找到一些文档。
如果自动布局工作但突然停止,可能是布局算法的参数不适合您ui。布局算法被编写为在达到稳定点时停止,但您可以更改此设置。
您只需定义一个您喜欢的布局算法的新实例并使用它:
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);
我正在使用我正在编写的小型编译器来玩弄 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();
您可以在 website 中找到一些文档。
如果自动布局工作但突然停止,可能是布局算法的参数不适合您ui。布局算法被编写为在达到稳定点时停止,但您可以更改此设置。
您只需定义一个您喜欢的布局算法的新实例并使用它:
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);