Как инициализировать расположение вершин в пользовательском макете 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
,