2012-09-25 53 views
0

如何初始化预先知道顶点位置新的布局?如何初始化一个自定义布局JUNG顶点位置?

我创建了一个自定义的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? 

    } 

} 

回答

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

+0

这是有道理的,但你能提供,我会传递到setInitializer()方法的样本?变压器只是一个界面,需要一些坚实的实施。 – sdasdadas

+0

JimN的实施将会很好。这就是说,实际上IIRC有一个在荣格将集合库内置MapTransformer类。 –

+0

谢谢你,这对我很好。 – sdasdadas