问题
How to use custom vertex labels in JUNG graph visualization?
I am following Jung 2.0 Tutorial where I found that setVertexLabelTransformer()
can be used to label the vertices, but these labels cannot be customized, to my knowledge.
For example, the below code produces three vertices, having vertex-labels 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);
}
}
How do I add labels like "q0"?
回答1:
Since you have defined the generics of SparseMultigraph<V, E>
as SparseMultigraph<Integer, String>
where the generic V
for vertex as Integer and the generic E for edge as String
, hence each vertex's label value is in Integer
and each edge's label in String
. So, if you want each vertex by names like q1, v2, etc., use String
for generic V
, so you can pass a vertex name like this g.addVertex("q1");
回答2:
If you have a custom class for nodes, I will give an example from my project. I have a class Node which is like :
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()
{
}
}
// You just need to override transform like below:
vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller() {
@Override
public String transform(Object v) {
return ((Node)v).screenName;
}});
// It will show the screenName property as a label for each node in the graph. // I hope this is what you are looking for.
来源:https://stackoverflow.com/questions/9350583/how-to-add-custom-vertex-labels-in-jung-graph-visualization