是否可以更改顶点标签?
例如,在我的JUNG图形应用中,我有两个顶点A和B,
如何仅重命名特殊的顶点标签?
现在我使用此方法,但它会更改所有顶点名称。
vv.getRenderContext().setVertexLabelTransformer(new Transformer<String,String>() {
@Override
public String transform(String i) {
return "test";
}
});
感谢您的帮助。
答案 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
。