2012-02-19 8 views
5

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

Я следую Jung 2.0 Tutorial, где обнаружил, что 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"?

+1

Просьба привести учебник, за которым вы следуете. См. Также [* Начальные потоки *] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). – trashgod

+1

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

+0

Чтобы изменить стандартный вершинный трансформатор метки в контексте рендеринга JUNG, найдите ключевое слово 'getRenderContext(). setVertexLabelTransformer' – ecle

ответ

5

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

3

Если у вас есть пользовательский класс для узлов, я дам пример из моего проекта. У меня есть класс 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 в качестве метки для каждого узла в граф. // Надеюсь, это то, что вы ищете.