Как создать простой параллельный сетевой граф (Java, Swing & JUNG) - PullRequest
0 голосов
/ 24 марта 2012

Я работаю над сетевой программой для класса, и в ней есть несколько «узлов» (в настоящее время это просто разные порты на моей машине), которые выполняют некоторую обработку и общаются друг с другом. Я хочу визуализировать соединения, и некоторое время назад я построил простой «монитор» визуализации с JUNG2. Я хочу обновить его сейчас, когда мое приложение работает. Я выбрал JUNG в первую очередь потому, что у него была отличная документация и учебные пособия, и я никогда не делал графики и графические интерфейсы с Java (никакой графической работы не было с Win32 и C ++ Builder:)).

Я опишу, как я это делаю, но мой вопрос, как правило: есть ли лучший способ? Это мои требования (AFAICT):

  1. Узлы не перемещаются при добавлении ребра (в настоящее время это происходит, и это действительно раздражает).
  2. Может обрабатывать (не сбивать), может быть, 50-100 обновлений в секунду.
  3. Краевые цвета (было бы очень приятно).
  4. Метки на узлах (я думаю, что это уже есть ...)

Мне не нужны направленные ребра, просто статическое / согласованное упорядочение узлов, чтобы вы могли определить, какой узел что делает, не пытаясь постоянно читать метки.

У меня есть SparseMultigraph с использованием FRLayout2 и VisualizationViewer. Всякий раз, когда узлы делают что-то интересное, они отправляют на монитор пакет UDP с небольшим количеством данных. Он получает и назначает ему объединенный поток, который проверяет пакет и добавляет ребро, узел и т. Д. На основе данных пакета. Этот поток вызывает один из них:

public void addVertex(String a) {
    if (!graph.containsVertex(a)) {
        System.out.println("Adding vertex "+a);
        graph.addVertex(a);
    }
    freshenVertex(a);
}

public void toggleEdge(Edge e) {
    EdgeTimer et = new EdgeTimer(e);
    Thread t = new Thread(et, "EdgeTimer");
    t.start();
}

(Я могу объединить этот последний достаточно легко.) EdgeTimer добавляет ребро, ждет и удаляет ребро:

graph.addEdge(edge.getName(), edge.getA(), edge.getB());
Thread.sleep(1500);
graph.removeEdge(edge.getName());

Каждую секунду поток обновлений обновляет график:

synchronized (graph) {
    relaxer.pause();
    layout.initialize();
    relaxer.resume();
}

И, наконец, поток Pruner удаляет старые вершины, если они не были услышаны в течение некоторого времени - хотя это может измениться, если они будут окрашены в красный цвет или что-то в этом роде.

Учитывая, что я новичок в JUNG2 и, по сути, взломал мой путь через это, я предполагаю, что это довольно плохо (я знаю, что мне нужно улучшить синхронизацию уже, просто посмотрев на это). Есть идеи, что я мог сделать? Хотелось бы просто изменить график без его повторной инициализации, поскольку я думаю, что именно поэтому он перемещает узлы, и он кажется медленным ... но я не знаю, что насчет JUNG, и у меня осталось около недели, чтобы поработать над ним , :) Я думал об изменении ConcurrentSomethingOrOther и обновлении viz, основанном на этом, вместо того, чтобы делать это прямо из пакетов ...

Спасибо, Джош

P.S .: Я оставил много кода, чтобы этот вопрос был коротким, но был бы рад добавить его, если это поможет.

...