2012-09-25 54 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