Java 如何在JUNG中添加具有相同标签(但端点不同)的两条边?

Java 如何在JUNG中添加具有相同标签(但端点不同)的两条边?,java,swing,jung,visualizer,Java,Swing,Jung,Visualizer,如何添加具有相同标签但端点不同的两条边 例如,我想添加两条具有相同标签“label1”的边,一条从顶点v-1到顶点v-2,另一条从顶点v-2到v-3 守则的一部分是: g.addEdge("label1","v-1","v-2"); g.addEdge("label1","v-2","v-3"); 但JUNG不允许使用同一标签添加两条边。它给出了一个错误: 此图形中已存在端点为[v-1,v-2]的边标签1,因此无法删除 添加端点[v-2,v-3] 如何添加具有相同标签的两条边 谢谢 编辑: 我

如何添加具有相同标签但端点不同的两条边

例如,我想添加两条具有相同标签“label1”的边,一条从顶点v-1到顶点v-2,另一条从顶点v-2到v-3

守则的一部分是:

g.addEdge("label1","v-1","v-2");
g.addEdge("label1","v-2","v-3");
但JUNG不允许使用同一标签添加两条边。它给出了一个错误:

此图形中已存在端点为[v-1,v-2]的边标签1,因此无法删除 添加端点[v-2,v-3]

如何添加具有相同标签的两条边

谢谢

编辑:
我刚刚读到,有一种方法可以为边指定权重值,即使用,但这些权重值应该是整数。因此,它似乎无法解决问题

标签不需要是边缘的toString();这只是默认值。查看PluggableRendererContext,了解如何提供一个转换器,为图形的每个元素提供属性


我还想查看JUNG 2手册(wiki上)中关于用户数据的部分:

当我遇到这个问题时,我会制作标签字符串(您的标签已经是字符串)并将其值设置为:“第一个顶点的ID\u:第二个顶点的ID\u:EDGE\u值”。然后,为了只显示一个值,我使用了转换。很简单,它只是从edge的名称中获取edge_值

在这个示例中,我使用了一个分隔符“:”

VisualizationViewer vv=新的VisualizationViewer(布局,尺寸);
//其他业务
vv.getRenderContext().setEdgeLabelTransformer(新的Transformer()){
@凌驾
公共字符串转换(字符串c){
返回StringUtils.substringAfterLast(c,“:”);
}
});
当然,您不必使用来自ApacheCommons的StringUtils,一个普通的String.subString在这里也可以使用

希望能有帮助

下面是一个例子

包堆栈溢出;
导入javax.swing.JFrame;
导入org.apache.commons.collections15.Transformer;
导入edu.uci.ics.jung.algorithms.layout.FRLayout;
导入edu.uci.ics.jung.graph.DirectedSparseMultraph;
导入edu.uci.ics.jung.graph.graph;
导入edu.uci.ics.jung.visualization.VisualizationViewer;
公共类网络{
公共静态图getGraph()
{
图g=新的DirectedSparMultigraph();
g、 addVertex(“v1”);
g、 addVertex(“v2”);
g、 addVertex(“v3”);
g、 附录(“标签1”、“v1”、“v2”);
g、 附录(“标签2”、“v2”、“v3”);
g、 附录(“标签3”、“v3”、“v1”);
返回g;
}
公共静态void main(字符串[]args)
{
JFrame f=新的JFrame();
最终图形g=getGraph();
VisualizationViewer vv=新的VisualizationViewer(新的FRLayout(g));
最终变压器edgeLabel=新变压器(){
@凌驾
公共字符串转换(字符串边缘){
//TODO自动生成的方法存根
if(edge.equals(“label1”)| | edge.equals(“label2”)){
返回“label1”;
}否则
返回“label3”;
}
};
vv.getRenderContext().setLabelOffset(15);
vv.getRenderContext().setEdgeLabelTransformer(edgeLabel);
f、 getContentPane().add(vv);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 包装();
f、 setVisible(真);
}
}
结果是:


能否在第二条边上添加一个空格<代码>“label1”谢谢Joop Eggen。这真是个好主意!它解决了两条边的问题,这就是我在这里要问的:)但是为了简单起见,我要了两条边。事实上,我会得到很多这样的优势。因此,如果我为每个这样的边标签添加一个空间,我不知道我的图形会是什么样子。无论如何,再次感谢您的想法。仅凭名称搜索顶点或边将很困难。如果需要两个以上具有相同标签名称的顶点,会发生什么情况?你能多加一些空格吗?我不这么认为。如何定义一个自定义Java类(用户数据),其中包含几个字段;一个字段表示唯一id,一个字段表示其名称;将此类应用为常规顶点零件(可以对常规边零件执行相同的操作,但可以使用另一个自定义类)。使用
vertexLabelTransformer()
显示类实例的名称部分,但使用唯一id进行搜索等。谢谢Joshua!我很高兴有一种方法。我还在学习这些变压器。我会试试你的建议。
VisualizationViewer vv = new VisualizationViewer(layout, dim);
//other operations
vv.getRenderContext().setEdgeLabelTransformer(new Transformer<String, String>() {
    @Override
    public String transform(String c) {
        return StringUtils.substringAfterLast(c, ":");
    }
});
package stackoverflow;

import javax.swing.JFrame;
import org.apache.commons.collections15.Transformer;
import edu.uci.ics.jung.algorithms.layout.FRLayout;
import edu.uci.ics.jung.graph.DirectedSparseMultigraph;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.visualization.VisualizationViewer;


public class JungNetwork {

public static Graph<String, String> getGraph() 
{
    Graph<String, String> g = new DirectedSparseMultigraph<String, String>();

    g.addVertex("v1");
    g.addVertex("v2");
    g.addVertex("v3");
    g.addEdge("label1", "v1", "v2");
    g.addEdge("label2", "v2", "v3");
    g.addEdge("label3", "v3", "v1");
    return g;
}


public static void main(String[] args) 
{
    JFrame f = new JFrame();
    final Graph<String, String> g = getGraph();
    VisualizationViewer<String, String> vv =    new VisualizationViewer<String, String>(new FRLayout<String, String>(g));

    final Transformer <String, String> edgeLabel = new Transformer<String, String>(){

        @Override
        public String transform(String edge) {
            // TODO Auto-generated method stub
            if (edge.equals("label1")|| edge.equals("label2")){
                return "label1";
            }else
            return "label3";
        }

    };


    vv.getRenderContext().setLabelOffset(15);
    vv.getRenderContext().setEdgeLabelTransformer(edgeLabel);

    f.getContentPane().add(vv);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.pack();
    f.setVisible(true);
}


}