Перекрытие ребер с помощью JGraphx

Я строю график с JgraphX. Ориентированный граф изображает дороги и перекрестки. Для каждого маршрута я определяю два ребра, по одному для каждого направления.

В результате на изображении графа два ребра (представляющие дорогу) перекрываются. Как я могу этого избежать? Есть ли у вершины некоторые вещи, такие как опорные точки для ребер? Если да, то как я могу их определить?

Это код, который я использую для отображения графика

package it.rex.view;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import org.jgrapht.ListenableGraph;
import org.jgrapht.ext.JGraphXAdapter;
import org.jgrapht.graph.ListenableDirectedGraph;

import com.mxgraph.layout.mxCircleLayout;
import com.mxgraph.layout.mxIGraphLayout;
import com.mxgraph.swing.mxGraphComponent;

//import grafotest1.DemoWeightedGraph.MyEdge;
import it.rex.model.Incrocio;
import it.rex.model.Strada;
import javax.swing.JScrollPane;
public class StradarioView extends JFrame {



    /**
     * Create the frame.
     */
    public StradarioView(ListenableGraph<Incrocio, Strada> listenableGraph) {

        // Graph come from JgraphT
        JGraphXAdapter<Incrocio, Strada> graphAdapter = 
                new JGraphXAdapter<Incrocio, Strada>(listenableGraph);

        mxIGraphLayout layout = new mxCircleLayout(graphAdapter);
        layout.execute(graphAdapter.getDefaultParent());

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

        setTitle("Stradario");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        pack();


        add(graphComponent);
    }
}

Это результат с перекрывающимися краями:

перекрывающиеся края


person Fabrizio R.    schedule 25.01.2017    source источник
comment
Посмотрите на mxParallelEdgeLayout   -  person F. Lumnitz    schedule 14.02.2017
comment
@F.Lumnitz в моем случае дает мне `java.lang.IllegalArgumentException: image == null!´   -  person Gewure    schedule 01.12.2020


Ответы (2)


Здесь вы использовали макет круга.

mxIGraphLayout layout = new mxCircleLayout(graphAdapter);

Макет круга помещает узлы в круг, но он перекрывает края между двумя узлами, которые находятся в противоположном направлении. Вместо этого вы можете попробовать использовать mxParallelEdgeLayout. Это разделит два края, если они перекрываются.

Попробуй это:

mxParallelEdgeLayout layout = new mxParallelEdgeLayout(graphAdapter);

На следующем рисунке показаны два соединенных узла, у которых есть два ребра между e и b, которые находятся в противоположных направлениях. Именно так mxParallelEdgeLayout отображает два ребра между одними и теми же двумя узлами в противоположных направлениях.

Надеюсь это поможет !

person Hasal    schedule 11.04.2019

Вы можете решить эту проблему, добавив следующее:

new mxCircleLayout(graph).execute(graph.getDefaultParent());
new mxParallelEdgeLayout(graph).execute(graph.getDefaultParent());
person James Adamson    schedule 04.10.2017
comment
StackOverflow — это англоязычный сайт, а не русский. Также как добавление этого кода устраняет проблему с пользователями. Ответы, содержащие только код, считаются низкокачественными. - person Dijkgraaf; 05.10.2017
comment
Я перевел ваш ответ, пожалуйста, пишите только на английском языке в следующий раз. - person Oleg; 05.10.2017