0

事前にわかっている頂点位置で新しいレイアウトを初期化するにはどうすればよいですか?

カスタム 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?

    }

}
4

1 に答える 1

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

于 2012-09-25T23:21:30.540 に答える