¿Cómo agregar etiquetas de vértice personalizadas en la visualización del gráfico Jung?
-
27-10-2019 - |
Pregunta
Cómo usar etiquetas de vértices personalizadas en Junk visualización de gráficos?
Estoy siguiendo Tutorial de Jung 2.0 donde encontré que setVertexLabelTransformer()
Se puede usar para etiquetar los vértices, pero estas etiquetas no se pueden personalizar, que yo sepa.
Por ejemplo, el siguiente código produce tres vértices, que tienen vértices 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);
}
}
¿Cómo agrego etiquetas como "Q0"?
Solución
Ya que ha definido los genéricos de SparseMultigraph<V, E>
como SparseMultigraph<Integer, String>
donde el genérico V
para el vértice como entero y el genérico e para borde como String
, por lo tanto, el valor de la etiqueta de cada vértice está en Integer
y la etiqueta de cada borde en String
. Entonces, si desea cada vértice por nombres como Q1, V2, etc., use String
para genérico V
, para que puedas pasar un nombre de vértice como este g.addVertex("q1");
Otros consejos
Si tiene una clase personalizada para nodos, daré un ejemplo de mi proyecto. Tengo un nodo de clase que es como:
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()
{
}
}
// Solo necesita anular la transformación como a continuación:
vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller() {
@Override
public String transform(Object v) {
return ((Node)v).screenName;
}});
// Mostrará la propiedad del nombre de pantalla como una etiqueta para cada nodo en el gráfico. // Espero que esto sea lo que estás buscando.