如何使用事先已知的顶点位置初始化新布局?
我创建了一个自定义的JUNG布局类:
public class CustomLayout extends AbstractLayout {
AbstractLayout subLayout = null;
final int WIDTH = 500;
final int HEIGHT = 500;
public CustomLayout(Graph<Vertex, Edge> graph, Transformer<Vertex, Point2D> init) {
super(graph, init);
for (Vertex v : this.getGraph().getVertices()) {
// Assign each vertex a random initial position.
setLocation(v, new Point2D.Double(random * WIDTH, random * HEIGHT);
}
subLayout = new FRLayout(this.getGraph(), ...?, null);
// How do I pass each vertices prior positions?
}
}
答案 0 :(得分:1)
这就是初始值设定项(Transformer<V,Point2D>
)的用途。此变换器应返回您传入其中的任何顶点的初始位置。我看到FRLayout在其构造函数中不接受初始值设定项,但看起来您可以调用setInitializer()
。
在回答您的问题时,Transformer
是一个通用接口,当给定输入时,会产生相应的输出。实现可以是您想要的任何内容。它可以提供一组静态定义的位置,或者动态计算位置。这为您提供了很大的灵活性。
您可能会注意到该接口与Map<K,V>
具有相似的传递,并且实际上可以按如下方式实现非常简单的包装器实现:
public class MapTransformer<K,V> implements Transformer<K,V> {
private final Map<K,V> map;
public MapTransformer(Map<K,V> map) {
this.map = map;
}
public V transform(K key) {
return map.get(key);
}
}
因此,您可以将您的位置放在地图中,然后将该地图包装在上面的MapTransformer
中。