Изменение формы и положения ребер в Юнге - PullRequest
1 голос
/ 28 февраля 2011

Мне нужно расположить узлы определенным образом.Я пробовал со статическим макетом.Я могу изменить положение узлов, но не удается разместить края в определенных местах.В статическом макете есть метод setLocation, который я использовал для изменения положения узла, но для ребер я понятия не имею, как разместить их в определенных местах, чтобы вновь расположенные узлы были связаны с ребрами.

Еще один вопрос: как я могу изменить форму ребра в Юнге, переопределив метод преобразования.

Ответы [ 2 ]

1 голос
/ 27 сентября 2012

Я знаю, что эта ветка немного устарела, но я думаю, что ее нужно восстановить - надеясь, что на этот вопрос еще не ответили. Причина в том, что ответ мистера О'Мададейна мне не помог. (возможно из-за моего дефицита и воли понимания документации) После некоторой работы над техникой JUNG я был бы рад получить квалифицированный комментарий.

Существует два (казалось бы) простых способа преобразования ребер в статическом макете.

Первый способ - переопределить метод «преобразования» Transformer, напрямую влияющий на форму ребра:

Transformer<Graph<Context<String, String>, String>, Shape> edgeTransformer = new Transformer<Graph<Context<String,String>,String>,Shape>(){
        @Override
        public Shape transform(Graph<Context<String, String>, String> graphStringContext)
        {
            return (new Line2D.Double());
        }
    };

(если используется график "График")

Что касается чувствительных ребер, которые имеют (то есть соединяются), то простым примером будет возвращение отдельного Line2D (который будет состоять из центральных точек, которые имеют затронутые вершины) для рендера. Вызов метода, очевидно, таков:

vv.getRenderContext().setEdgeShapeTransformer(edgeTransform);

НО: это просто не работает. (возможно, потому что я сделал это неправильно; отсутствие руководств оправдывает это) Независимо от того, что кто-либо попытается вернуть метод «transform», средство визуализации просто получит нулевые значения.

2-ая возможность - разделить преобразование вершин на два преобразователя. Первый преобразователь установит только базовую позицию вершины, используя:

Transformer<String, Point2D> vertexPositionTransformer = new Transformer<String,Point2D>() {
            @Override
            public Point2D transform(String st) {
                return new Point2D.Double();
            };

2-й является необязательным. Это может быть использовано для изменения размера вершины или любой другой формы, которая будет выглядеть. Будут необходимы позиции вершин, преобразованных по местоположению, потому что этот преобразователь переопределит набор позиций.

Transformer<String, Shape> vertexShapeTransformer = new Transformer<String, Shape>() {
            @Override
            public Shape transform(String st) {
                return new Ellipse2D.Double();
            };

Теперь можно создать макет. Он не будет построен по умолчанию с помощью Graph в качестве одного параметра, но с дополнительным параметром: vertexPositionTransformer. Это будет выглядеть так:

StaticLayout<String, String> layout = new StaticLayout<String, String>(graph, vertexPositionTransformer);

Преобразование ребер при построении макета автоматически устанавливает конечные точки ребер в центр каждой включенной вершины.

В примерах кода я отказался от содержания методов "transform", которые, конечно, будут различаться от цели к цели. Использование классов / объектов «Трансформер» должно быть сделано после добавления вершин и ребер к графу, на который они влияют. Вот и все. Пожалуйста, исправьте плохой стиль и такие проблемы. Я рад получить обратную связь.

Привет

Лукас Кощине

1 голос
/ 18 марта 2011

JUNG в настоящее время не обеспечивает хорошей поддержки для размещения кромок.EdgeShape, в частности EdgeShape.Orthogonal, покажет вам, какая встроенная поддержка существует.

...