Как сделать так, чтобы подмножество узлов в JUNG отображалось в виде линейной линии?

Я пытаюсь построить граф в JUNG таким образом, чтобы некоторые узлы в графе отображались и располагались по-разному.

Это код, который у меня есть до сих пор:

package example.ordering;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;

import org.apache.commons.collections15.Transformer;
import org.apache.commons.collections15.functors.ChainedTransformer;

import edu.uci.ics.jung.algorithms.layout.FRLayout;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.SparseGraph;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.renderers.VertexLabelAsShapeRenderer;

public class Main {

    public static void main(String[] args) {

        final JFrame frame = new JFrame();

        frame.add(createGraph());
        frame.setLocationRelativeTo(null);

        frame.pack();

        EventQueue.invokeLater(new Runnable() {

            public void run() {
                frame.setVisible(true);
            }
        });
    }

    private static JPanel createGraph() {

        // TODO fill in the code to create a graph with nodes and order them.
        Graph<GraphNode, String> g1 = new SparseGraph<GraphNode, String>();

        GraphNode A = new GraphNode("A", "u");
        GraphNode B = new GraphNode("B", "u");
        GraphNode a = new GraphNode("a", "l");
        GraphNode b = new GraphNode("b", "l");

        g1.addEdge("AB", A, B);
        // g1.addEdge("CD", "C", "D");

        g1.addEdge("Aa", A, a);
        g1.addEdge("Bb", B, b);

        FRLayout<GraphNode, String> layout = new FRLayout<GraphNode, String>(g1);
        VisualizationViewer<GraphNode, String> vv = new VisualizationViewer<GraphNode, String>(
                layout);

        VertexLabelAsShapeRenderer<GraphNode, String> vlasr = new VertexLabelAsShapeRenderer<GraphNode, String>(
                vv.getRenderContext());

        vv.getRenderContext().setVertexShapeTransformer(vlasr);
        vv.getRenderContext().setVertexLabelTransformer(
                new ChainedTransformer<GraphNode, String>(
                        new Transformer[] { new MyLabeller() }));
        vv.getRenderer().setVertexLabelRenderer(vlasr);

        return vv;
    }

}

class GraphNode {
    public String value;
    public String type;

    public GraphNode(String value, String type) {
        this.value = value;
        this.type = type;
    }

    @Override
    public String toString() {
        return value;
    }

}

class MyLabeller implements Transformer<GraphNode, String> {

    public String transform(GraphNode arg0) {
        if (arg0.type.equals("u")) {
            return arg0.value;
        } else {
            return "";
        }
    }

}

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

Теперь A и B отображаются как правильные прямоугольники с метками, тогда как a и b в нижнем регистре отображаются как маленькие тире, как у них нет этикетки.

Я хотел бы, чтобы все маленькие узлы case (с типом «l») отображались на одном уровне, отсортированные по алфавиту.


person Ankit    schedule 17.11.2012    source источник
comment
Поздравляем! Вы задали вопрос №4,000,000   -  person Sergey Kalinichenko    schedule 18.11.2012
comment
Что значит на том же уровне? Вы говорите о расположении графика (конкретное положение каждого узла) или о внешнем виде узлов?   -  person sdasdadas    schedule 25.11.2012
comment
@sdasdadas Под одним уровнем (и только в этом случае) я подразумеваю, что у них одинаковая координата y (как таковая). Я знаю, что могу заблокировать абсолютную позицию узла, но это работает только при небольшом количестве узлов. В противном случае это становится грязным и нелинейным.   -  person Ankit    schedule 27.11.2012
comment
@sdasdadas Как правило, я ищу, что я могу, скажем, иметь FRLayout для «a» и «b», где ISOMLayout для «A» и «B»   -  person Ankit    schedule 27.11.2012
comment
Вы можете изменить существующие макеты с помощью оператора if и обрабатывать только подмножество узлов, которые вам нравятся. Однако проблема с применением FRLayout к половине узлов и ISOMLayout к другой половине заключается в том, что расположение узлов между двумя группами может перекрываться. Два макета не смогут взаимодействовать друг с другом. Лучшим решением было бы написать собственный макет (что не так уж сложно). Можете ли вы описать правила, которым должны следовать ваши вершины? (например, вершины в нижнем регистре всегда отображаются на 30 градусов слева от...) Это упростит настройку.   -  person sdasdadas    schedule 27.11.2012


Ответы (1)


Используйте AggregateLayout, как показано в этом примере: http://jung.sourceforge.net/site/jung-samples/xref/edu/uci/ics/jung/samples/SubLayoutDemo.html

person Joshua O'Madadhain    schedule 09.01.2013