Случайное размещение вершин в jgraph

Я создал приложение с помощью jgraph для визуализации. У меня есть пара проблем, касающихся этого.

1: мне нужно изменить имена вершин в соответствии с атрибутом объекта вершины. Когда я запускаю приложение с настройками по умолчанию, имена вершин печатаются как Vertex@c8191c (изменения основаны на вершине). Я хочу изменить это имя на значение атрибута вершины.

2: это самый важный. Количество генерируемых вершин не является статичным. Число зависит от различных других факторов приложения и может меняться при каждом запуске приложения. Когда я запускаю это приложение с настройками по умолчанию, узлы перекрываются, и на первом месте отображается только один. Мне нужно распределить узлы случайным образом внутри jgraph.

Может кто-нибудь, пожалуйста, помогите мне с этими двумя проблемами. Если вам нужна дополнительная информация, пожалуйста, укажите. Ниже приведен мой код для визуализации графика.

public void randomizeLocations(JGraph jgraph) {
    System.out.println("Visualization 1");
    GraphLayoutCache cache = jgraph.getGraphLayoutCache();
    System.out.println("Visualization 2");
    Random r = new Random();
    for (Object item : jgraph.getRoots()) {
        System.out.println("Visualization 3");
        GraphCell cell = (GraphCell) item;
        CellView view = cache.getMapping(cell, true);
        Rectangle2D bounds = view.getBounds();
        System.out.println("next double"+r.nextDouble()*400);
        bounds.setRect(r.nextDouble() * 400, r.nextDouble() * 5,
                bounds.getWidth(), bounds.getHeight());

    }
    System.out.println("Visualization 4");
    cache.reload();
    System.out.println("Visualization 5");
    jgraph.repaint();
    System.out.println("Visualization 6");

}

Заранее спасибо.

1 ответ

1) Переопределите метод toString вашего объекта Vertices.

@Override
public String toString() {
  return "Whatever attribute you want to display here";
}

2) Поместите свои вершины в HashSet. Это обеспечит добавление уникальных вершин только в ваш список. Более того, вам необходимо переопределить методы.equals() и.hashCode() вашего объекта Vertices, чтобы обеспечить уникальность. (См. Здесь /questions/17627416/kakie-problemyi-sleduet-uchityivat-pri-pereopredelenii-equals-i-hashcode-v-java/17627436#17627436). Продолжайте генерировать больше вершин, пока размер вашего HashSet не будет равен желаемому значению.

HashSet<Point2D.Double> unique = new HashSet<Point2D.Double>();
Random r = new Random();
for (Object item : jgraph.getRoots()) {
    System.out.println("Visualization 3");
    GraphCell cell = (GraphCell) item;
    CellView view = cache.getMapping(cell, true);
    Rectangle2D bounds = view.getBounds();
    int currentSize = unique.size();
    double x;
    double y;
    while (unique.size() == currentSize) {
      x = r.nextDouble() * 400;
      y = r.nextDouble() * 5;
      unique.add(new Point2D.Double(x,y));
    }
    bounds.setRect(x, y, bounds.getWidth(), bounds.getHeight());
}
Другие вопросы по тегам