graphstream с использованием всегда включенного автомакета

Я играл с graphstream с небольшим компилятором, который я пишу, чтобы создать визуализацию Abstract-Syntax-Tree, например:

     // 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?


person Jaco Van Niekerk    schedule 20.08.2020    source источник


Ответы (1)


Я не знаю кода вашей функции, но обычно это происходит автоматически со средством просмотра по умолчанию. Вы можете попытаться принудительно активировать автомакет с помощью:

viewer.enableAutoLayout();

Некоторую документацию можно найти на веб-сайте.

Если авторазметка работает, но сразу останавливается, возможно, вам не подходит параметр алгоритма раскладки. Алгоритмы макета написаны так, чтобы останавливаться, когда они достигают точки стабилизации, но вы можете изменить это.

Вам просто нужно определить новый экземпляр алгоритма макета, который вы предпочитаете, и использовать его:

SpringBox l = new SpringBox();

Затем вы можете определить параметр, например силу или точку стабилизации. Соглашение состоит в том, что значение 0 означает, что процесс, управляющий компоновкой, не будет останавливать компоновку (поэтому не будет учитывать предел стабилизации). Другими словами, макет будет вычисляться бесконечно. :

l.setStabilizationLimit(0);

Но имейте в виду, что если вы хотите использовать свой экземпляр алгоритма макета, вам нужно создать средство просмотра перед отображением. И это подразумевает создание собственного пользовательского интерфейса. Вот простой пример, вы можете найти больше на официальном 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);
person H.Brahimi    schedule 31.08.2020
comment
Я прочитал этот сайт сверху донизу. Я ищу способ включить enableAutoLayout() всегда. Таким образом, когда узел перетаскивается, другие узлы, которые не перетаскиваются, также автоматически размещаются с некоторой эластичностью по краям. Пока не повезло. Я подозреваю, что нет поддержки для этого, и это нужно сделать вручную. - person Jaco Van Niekerk; 01.09.2020
comment
Может просто параметр алгоритма раскладки вас не устраивает. Алгоритмы макета написаны так, чтобы останавливаться, когда они достигают точки стабилизации, но вы можете изменить это. Я отредактировал свой ответ выше. - person H.Brahimi; 02.09.2020