Как добавить пользовательские метки вершин в графическую визуализацию JUNG?

Как использовать пользовательские метки вершин в визуализации графа JUNG?

Я следую учебнику Jung 2.0, где обнаружил, что setVertexLabelTransformer() можно использовать для пометить вершины, но, насколько мне известно, эти метки нельзя настроить.

Например, приведенный ниже код создает три вершины с метками вершин 1,2,4:

import edu.uci.ics.jung.algorithms.layout.CircleLayout;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.SparseMultigraph;
import edu.uci.ics.jung.visualization.BasicVisualizationServer;
import java.awt.Dimension;
import javax.swing.JFrame;

public class SimpleGraphView {
    Graph<Integer, String> g;

    public SimpleGraphView() {       
        g = new SparseMultigraph<Integer, String>();
        g.addVertex((Integer)1);
        g.addVertex((Integer)2);
        g.addVertex((Integer)4); 
    }

    public static void main(String[] args) {
        SimpleGraphView sgv = new SimpleGraphView(); 
        Layout<Integer, String> layout = new CircleLayout(sgv.g);
        layout.setSize(new Dimension(800,800));  
        BasicVisualizationServer<Integer,String> vv =
            new BasicVisualizationServer<Integer,String>(layout);
        vv.setPreferredSize(new Dimension(850,850)); 

        JFrame frame = new JFrame("Simple Graph View");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(vv); 
        frame.pack();
        frame.setVisible(true);       
    }
}

Как добавить метки типа "q0"?


person Dilini    schedule 19.02.2012    source источник
comment
Пожалуйста, укажите учебник, которому вы следуете. См. также Начальные потоки.   -  person trashgod    schedule 19.02.2012
comment
Поскольку вы определили универсальные элементы SparseMultigraph<V, E> как SparseMultigraph<Integer, String>, где общий V для вершины как Integer и общий E для ребра как String, следовательно, значение метки каждой вершины находится в Integer, а метка каждого ребра - в String. Итак, если вам нужны имена каждой вершины, такие как q1, v2 и т. д., используйте String для общего V, чтобы вы могли передать имя вершины, подобное этому g.addVertex("q1");   -  person ecle    schedule 19.02.2012
comment
Чтобы изменить преобразователь меток вершин по умолчанию в контексте рендеринга JUNG, выполните поиск по ключевому слову getRenderContext().setVertexLabelTransformer   -  person ecle    schedule 19.02.2012
comment
Подробнее в SO: stackoverflow.com/questions/ 3288886/. Обратите внимание, что это зависит от вашего определения дженериков для вершин и ребер. Если образец не работает для вас, проверьте универсальные типы, используемые в образце, и измените его в соответствии с вашими.   -  person ecle    schedule 19.02.2012
comment
@eee Использование String вместо V в SparseMultigraph<V, E> решило проблему. Спасибо.   -  person Dilini    schedule 19.02.2012
comment
См. ответ на заголовок stackoverflow.com/questions/9352531/. Это также относится к меткам вершин.   -  person Joshua O'Madadhain    schedule 20.02.2012
comment
@JoshuaO'Madadhain Спасибо.   -  person Dilini    schedule 20.02.2012
comment
@eee Не могли бы вы опубликовать свой ответ, который указан выше в качестве комментария, чтобы я мог его принять?   -  person Dilini    schedule 05.03.2012


Ответы (2)


Поскольку вы определили обобщения SparseMultigraph<V, E> как SparseMultigraph<Integer, String>, где общее значение V для вершины равно Integer, а общее значение E для ребра равно String, следовательно, значение метки каждой вершины находится в Integer, а метка каждого ребра - в String. Итак, если вы хотите, чтобы каждая вершина имела имена, такие как q1, v2 и т. д., используйте String для общего V, чтобы вы могли передать имя вершины, подобное этому g.addVertex("q1");

person ecle    schedule 04.03.2012

Если у вас есть собственный класс для узлов, я приведу пример из своего проекта. У меня есть класс Node, который выглядит так:

public class Node 
{

public long tweetId = 0L;
public long nodeId = 0L;
public String screenName = "";
public Date reTweetDate = new Date();
public boolean isMainNode = false;
public int size = 0;

public Node()
{
}

}

// Вам просто нужно переопределить преобразование, как показано ниже:

vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller() {
                @Override
                public String transform(Object v) {

                    return ((Node)v).screenName;
                }});

// Он покажет свойство screenName как метку для каждого узла на графике. // Надеюсь, это то, что вы ищете.

person mgokhanbakal    schedule 16.10.2013