Автоматический макет для графика (JGraphX)

У меня проблемы с отображением JGraphX ​​с автоматическим макетом.

Моя программа (код ниже) создает такой вывод: введите здесь описание изображения

Достаточный результат мог бы выглядеть так (я перемещал их вручную): введите описание изображения здесь

Мне не нужно придерживаться JGraphX. Я также тестировал JUNG и JGraphT. Но это был мой лучший результат на данный момент. Что мне нужно, так это представление моих данных с направленными краями и некоторыми метками на нем.

Я сделал пример кода, который показывает, как он создается. Он похож на http://forum.jgraph.com/questions/4810/how-to-layout-nodes-automatically-using-fast-organic-layout. Есть комментарий от 2012 года, в котором упоминается та же проблема: «[...] Однако я заметил, что узлы иногда перекрываются, знаете ли вы способ исправить это, я играл со свойствами, и это кажется довольно случайным. Есть ли какие-нибудь советы, как улучшить внешний вид в целом?»

public class Test extends JFrame {

        public static void main(String[] args) {
                JFrame f = new JFrame();
                f.setSize(800, 800);
                f.setLocation(300, 200);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                final mxGraph graph = new mxGraph();

                mxGraphComponent graphComponent = new mxGraphComponent(graph);
                f.getContentPane().add(graphComponent, BorderLayout.CENTER);

                f.setVisible(true);
                Object parent = graph.getDefaultParent();

                graph.getModel().beginUpdate();
                try {
                        Object start = graph.insertVertex(parent, "start", "start", 100,
                                        100, 80, 30);
                        for (int i = 0; i < 10; i++) {
                                Object a = graph.insertVertex(parent, "A" + i, "A" + i, 100,
                                                100, 80, 30);
                                graph.insertEdge(parent, null, "E" + i, start, a);

                                Object b = graph.insertVertex(parent, "B" + i, "B" + i, 100,
                                                100, 80, 30);
                                graph.insertEdge(parent, null, "E" + i, a, b);
                                start = a;
                        }
                } finally {
                        graph.getModel().endUpdate();
                }

                morphGraph(graph, graphComponent);
        }

        private static void morphGraph(mxGraph graph,
                        mxGraphComponent graphComponent) {
                // define layout
                mxIGraphLayout layout = new mxFastOrganicLayout(graph);

                // layout using morphing
                graph.getModel().beginUpdate();
                try {
                        layout.execute(graph.getDefaultParent());
                } finally {
                        mxMorphing morph = new mxMorphing(graphComponent, 20, 1.5, 20);

                        morph.addListener(mxEvent.DONE, new mxIEventListener() {

                                @Override
                                public void invoke(Object arg0, mxEventObject arg1) {
                                        graph.getModel().endUpdate();
                                        // fitViewport();
                                }

                        });

                        morph.startAnimation();
                }

        }
}

График сгенерирован из примера:

введите здесь описание изображения


person froehli    schedule 19.03.2015    source источник
comment
Я использовал graphstream-project.org, и вы можете установить координаты для узлов вашего графика. Вот подробности о моем программном обеспечении dachb.com/softwares/itacm . Проверьте четвертый скриншот. Это репозиторий клиентского кода bitbucket.org/vishrantg/dachb.git .   -  person Vishrant    schedule 16.04.2018


Ответы (1)


вместо использования вашего метода morphGraph попробуйте использовать что-то вроде этого:

new mxHierarchicalLayout(graph).execute(graph.getDefaultParent());

Это будет использовать менеджер компоновки по умолчанию в mxGraph (версия 3.9.3)

person Benvorth    schedule 22.04.2018