Java: поместите стрелку в центр краев в сети Jung2.

У меня есть сеть с направленными ребрами. Стрелки указывают направление края в GUI. Но, как показано на рисунке, когда стрелки находятся на концах краев, это становится довольно запутанным. Можно ли изменить расположение стрелки на центр или любое другое положение на краю? введите здесь описание изображения

РЕДАКТИРОВАТЬ:

AffineTransform getArrowTransform(RenderContext<V,E> rc, Shape edgeShape, Shape vertexShape)

Я обнаружил, что этот метод можно использовать для установки стрелок в определенное положение, но я все еще не смог найти ни одного примера того, как использовать этот метод. Ссылка


person 2c00L    schedule 23.10.2014    source источник


Ответы (1)


Вы можете назначить CenterEdgeArrowRenderingSupport на Renderer.Edge, которые вы получили от Renderer из VisualizationViewer. Он не обязательно попадет в точный центр края (и, если взглянуть на код, он может полностью потерпеть неудачу, если край прямой, но это должно быть быть проверенным).

В любом случае, вот MCVE:

import edu.uci.ics.jung.algorithms.layout.FRLayout;
import edu.uci.ics.jung.graph.DirectedSparseMultigraph;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.renderers.CenterEdgeArrowRenderingSupport;
import edu.uci.ics.jung.visualization.renderers.Renderer;

public class JUNGEdgeCenterArrows 
{
    public static void main(String[] args) 
    {
        JFrame f = new JFrame();
        final Graph<String, String> g = getGraph();
        VisualizationViewer<String, String> vv = 
            new VisualizationViewer<String, String>(
                new FRLayout<String, String>(g));
        Renderer.Edge<String, String> edgeRenderer = 
            vv.getRenderer().getEdgeRenderer();
        edgeRenderer.setEdgeArrowRenderingSupport(
            new CenterEdgeArrowRenderingSupport<String, String>());
        f.getContentPane().add(vv);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setVisible(true);
    }


    public static Graph<String, String> getGraph() 
    {
        Graph<String, String> g = 
            new DirectedSparseMultigraph<String, String>();
        g.addVertex("v0");
        g.addVertex("v1");
        g.addEdge("e0", "v0", "v1");
        g.addEdge("e1", "v0", "v1");
        g.addEdge("e2", "v0", "v1");
        return g;
    }
}
person Marco13    schedule 28.10.2014
comment
Поэтому добавил эти две строки: enderer.Edge‹Node, Link› edgeRenderer = vv.getRenderer().getEdgeRenderer(); edgeRenderer.setEdgeArrowRenderingSupport (новый CenterEdgeArrowRenderingSupport‹String, String›()); И это сработало как по волшебству. Спасибо! - person 2c00L; 28.10.2014