在Jung中更改(重命名)顶点标签

时间:2018-08-19 05:28:50

标签: java vertex jung

是否可以更改顶点标签?
例如,在我的JUNG图形应用中,我有两个顶点A和B,
如何仅重命名特殊的顶点标签?

现在我使用此方法,但它会更改所有顶点名称。

vv.getRenderContext().setVertexLabelTransformer(new Transformer<String,String>() {
 @Override
 public String transform(String i) {
 return "test";
 }
 });

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这里有几件事要考虑。

对于某个类,Transformer<S, T>只是一个functional interface [1],给定类型为S的对象,它返回类型为T的对象。 transform方法的行为可以是您喜欢的任何返回类型T的对象。

由于它是一个功能性的接口,因此可以使用lambda表达式使语法更加清晰(假设您使用的是Java 8 +)。

这样一种简单的将“ A”重命名为“ B”(使用Java 8 lambda)的方法可能是:

vv.getRenderContext().setVertexLabelTransformer(i -> {
      return i.equals("A")
          ? "B"
          : i;  
    }

但是,这是一个糟糕的解决方案,因为它对映射进行了硬编码,并且不允许您更改其他节点的名称或再次更改名称(例如,响应用户输入),而无需进行进一步的代码更改。

一种更健壮的方法是让您的函数可以引用一个名为Map<S, T>的{​​{1}}:

labels

通过这种方式,您可以随意更新vv.getRenderContext().setVertexLabelTransformer(i -> labels.get(i));

您可能还想考虑您的节点是否应该由labels对象表示,或者它们是否应该是包含String字段(可用作标签)的对象。我通常会发现,将节点对象与其标签脱钩是一个好主意(除其他事项外,这允许标签是非唯一的,而节点对象不能如此)。

[1]实际上,JUNG的3.0版将只使用String来代替java.util.Function