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 回答