Java 如何在JUNG graph可视化中添加自定义顶点标签?

Java 如何在JUNG graph可视化中添加自定义顶点标签?,java,swing,jung,visualizer,Java,Swing,Jung,Visualizer,如何在图形可视化中使用自定义顶点标签 我发现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

如何在图形可视化中使用自定义顶点标签

我发现
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);       
    }
}
导入edu.uci.ics.jung.algorithms.layout.CircleLayout;
导入edu.uci.ics.jung.algorithms.layout.layout;
导入edu.uci.ics.jung.graph.graph;
导入edu.uci.ics.jung.graph.sparsemultraph;
导入edu.uci.ics.jung.visualization.basicvisualization服务器;
导入java.awt.Dimension;
导入javax.swing.JFrame;
公共类SimpleGraphView{
图g;
公共SimpleGraphView(){
g=新的SparseMultraph();
g、 addVertex((整数)1);
g、 addVertex((整数)2);
g、 addVertex((整数)4);
}
公共静态void main(字符串[]args){
SimpleGraphView sgv=新的SimpleGraphView();
布局=新的环形布局(sgv.g);
布局。设置尺寸(新尺寸(800800));
基本可视化服务器=
新的基本可视化服务器(布局);
vv.setPreferredSize(新尺寸(850850));
JFrame=新JFrame(“简单图形视图”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(vv);
frame.pack();
frame.setVisible(true);
}
}

如何添加像“q0”这样的标签?

因为您已将
SparsMultigraph
的泛型定义为
SparsMultigraph
,其中顶点的泛型
V
为整数,边的泛型E为
字符串,因此,每个顶点的标签值在
整数中,每个边的标签在
字符串中。因此,如果您希望每个顶点按名称命名,如q1、v2等,请将
String
用于generic
V
,这样您就可以像下面这样传递一个顶点名称
g.addVertex(“q1”)

如果您有用于节点的自定义类,我将从我的项目中给出一个示例。我有一个类节点,类似于:

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

请引用您正在学习的教程。另请参见。由于您已将
SparsMultigraph
的泛型定义为
SparsMultigraph
,其中顶点的泛型V为整数,边的泛型E为字符串,因此每个顶点的标签值为整数,边的标签为字符串。所以,如果您希望每个顶点都有q1、v2等名称,请将字符串用于泛型V,这样您就可以传递这样的顶点名称
g.addVertex(“q1”)
要更改JUNG渲染上下文中的默认顶点标签转换器,请在SO中搜索关键字
getRenderContext()。setVertexLabelTransformer
详细信息:。请注意,这取决于顶点和边的泛型定义。如果示例不适用于您,请检查示例中使用的泛型类型,并根据您的修改。@eee在
SparsMultigraph
中使用
String
for
V
解决了问题。非常感谢。