Несколько лет назад (2007?) Я использую prefuse для визуализации записей данных вызовов. Я рассмотрел prefuse, jung, jgraph и несколько других и выбрал prefuse. Сначала немного сложно обернуть голову вокруг префузии, но как только я с ней ознакомился, ее очень легко (расширить) и интересно использовать. Я думаю, то же самое можно сказать и о ЮНГ, но я никогда не пробовал.
1) В prefuse очень легко добавить собственный пользовательский рендер для рисования параллельных краев - вы можете создать подкласс EdgeRenderer по умолчанию и переопределить метод render (). Не требуется никаких «базовых изменений уровня данных». Это все в части представления, если вы хотите думать об этом как о MVC.
2) Это вообще не проблема. Существует более одного способа сделать это: 1) У вас может быть два средства визуализации - один для рисования направленных ребер и один для рисования неориентированных ребер, и они будут работать очень хорошо, и сгруппировать ребра соответствующим образом. 2) Поставьте флаг (добавьте логический столбец в кортеж таблицы поддержки в речи перед вводом), чтобы указать, направлен ли край, и пропустите часть рисования стрелок в EdgeRender соответственно этому флагу.
3) Это супер просто
4) То же самое
5) Последним выпуском prefuse является «prefuse beta release 2007.10.21». Я использовал тот, который был до этого, у которого есть возможное состояние гонки при динамическом добавлении или удалении узлов - я думаю, в нем отсутствовало несколько синхронизированных ключевых слов. Я решил это, убедившись, что при добавлении или удалении узлов все анимации и действия (цвет, размер, макет) прекращаются - также не забудьте обновить и свои индексы Lucene (если вы используете его встроенную поисковую систему Lucene). ). Предполагается, что последний из них решит эту проблему гонки, но у меня никогда не было возможности попробовать ее.
6) Поскольку вы упомянули «множественную маркировку», я думаю, что это не вопрос «изменения графика и его перерисовки» - это просто вопрос настройки средств визуализации меток / краев для отображения только соответствующих меток, так что это не совсем так. большая проблема. Кроме того, я не думаю, что это вообще связано с 5.
7) Я не удивлен, что prefuse и рендеринг JUNG FruchtermanReingoldLayout различаются - есть несколько факторов, которые могут повлиять на этот один из них - начальный узел, где каждая реализация запускает вычисление, поэтому я не буду сильно беспокоиться о Эта проблема. Довольно просто опробовать различные встроенные алгоритмы построения графиков в prefuse, чтобы вы могли проверить, какой из них ближе всего к тому, что вы хотели бы иметь. Проверьте RadialLayout и BalloonTreeLayout для расположения звезды. ForceDirectedLayout требуется немало итераций, чтобы размещение узлов было «стабильным». Обратите внимание, что эти итерации не нужно показывать, поэтому вы можете запустить их в фоновом режиме и отобразить окончательный результат.
Я не использовал JUNG, поэтому я не могу много комментировать.
Основываясь на моем опыте с предварительной смазкой, я настоятельно рекомендую его из-за очень хорошо продуманного (ИМХО) продуманного дизайна и разделения ответственности между компонентами. Джеффри Хир (автор префузии) действительно проделал там хорошую работу.
На что следует обратить внимание, если вы используете prefuse (это две «болячки», которые я хорошо помню при работе с prefuse):
1) Существует ошибка, когда при уменьшении масштаба метки узла не уменьшаются соответствующим образом, так что он выходит за ограничивающий прямоугольник узла, который оставляет артефакты рисования шрифта при перемещении узла, потому что средство визуализации только очищает и перерисовывает вещи внутри ограничивающая рамка узла. IIRC это вызвано ошибкой в самой метрике шрифта AWT. Обходной путь должен оставить достаточный запас между меткой и ограничивающим прямоугольником узла.
2) При расширении встроенных макетов вы можете столкнуться с одной или двумя «проблемами с областями видимости», когда члену суперкласса, к которому вы хотите иметь доступ, дается закрытый атрибут вместо защищенного, поэтому решениелибо изменить саму библиотеку, либо создать новый класс без наследования (это может быть немного болезненно!).Я думаю, вы можете сказать то же самое для некоторых других библиотек Java.Разве не у всех задним числом нет пользы?:)
Поскольку вы задавали этот вопрос около месяца назад (на момент написания этой статьи), я хотел бы знать, каким было ваше решение и как оно оказалось для вас, если вы приступили к реализации.