Come aggiungere etichette di vertice personalizzate nella visualizzazione del grafico Jung?
-
27-10-2019 - |
Domanda
Come utilizzare le etichette del vertice personalizzato in Jung Visualizzazione del grafico?
Sto seguendo Tutorial Jung 2.0 dove l'ho trovato setVertexLabelTransformer()
Può essere usato per etichettare i vertici, ma queste etichette non possono essere personalizzate, per quanto ne sappia.
Ad esempio, il codice seguente produce tre vertici, con il parto di vertice 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);
}
}
Come posso aggiungere etichette come "Q0"?
Soluzione
Dato che hai definito i generici di SparseMultigraph<V, E>
come SparseMultigraph<Integer, String>
dove il generico V
per Vertex come intero e il generico e per bordo come String
, quindi il valore dell'etichetta di ogni vertice è in Integer
e ogni etichetta di Edge in String
. Quindi, se si desidera ogni vertice con nomi come Q1, V2, ecc. String
per generico V
, quindi puoi passare un nome di vertice come questo g.addVertex("q1");
Altri suggerimenti
Se hai una classe personalizzata per i nodi, darò un esempio dal mio progetto. Ho un nodo di classe che è come:
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()
{
}
}
// Devi solo sovrascrivere la trasformazione come sotto:
vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller() {
@Override
public String transform(Object v) {
return ((Node)v).screenName;
}});
// Mostrerà la proprietà ScreenName come etichetta per ciascun nodo nel grafico. // Spero che sia ciò che stai cercando.