6

如何在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”之类的标签?

4

2 回答 2

5

由于您已经定义了SparseMultigraph<V, E>as的泛型,SparseMultigraph<Integer, String>其中V顶点的泛型为 Integer ,边的泛型 E 为String,因此每个顶点的标签值在 in Integer,每个边的标签在String。因此,如果您希望每个顶点的名称为 q1、v2 等,请使用Stringfor generic V,这样您就可以像这样传递一个顶点名称g.addVertex("q1");

于 2012-03-04T23:09:07.950 回答
4

如果您有节点的自定义类,我将举一个我项目中的示例。我有一个类节点,就像:

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 属性显示为图中每个节点的标签。// 我希望这就是你要找的。

于 2013-10-16T17:08:47.827 回答