Я работаю над сетевой программой для класса, и в ней есть несколько «узлов» (в настоящее время это просто разные порты на моей машине), которые выполняют некоторую обработку и общаются друг с другом. Я хочу визуализировать соединения, и некоторое время назад я построил простой «монитор» визуализации с JUNG2. Я хочу обновить его сейчас, когда мое приложение работает. Я выбрал JUNG в первую очередь потому, что у него была отличная документация и учебные пособия, и я никогда не делал графики и графические интерфейсы с Java (никакой графической работы не было с Win32 и C ++ Builder:)).
Я опишу, как я это делаю, но мой вопрос, как правило: есть ли лучший способ? Это мои требования (AFAICT):
- Узлы не перемещаются при добавлении ребра (в настоящее время это происходит, и это действительно раздражает).
- Может обрабатывать (не сбивать), может быть, 50-100 обновлений в секунду.
- Краевые цвета (было бы очень приятно).
- Метки на узлах (я думаю, что это уже есть ...)
Мне не нужны направленные ребра, просто статическое / согласованное упорядочение узлов, чтобы вы могли определить, какой узел что делает, не пытаясь постоянно читать метки.
У меня есть 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 .: Я оставил много кода, чтобы этот вопрос был коротким, но был бы рад добавить его, если это поможет.