JUNG, изменение ссылки на график в средстве просмотра визуализаций

Вместе с Юнгом мы разработали небольшой графический редактор, в котором вы можете рисовать графики/сети с помощью мыши. Мы используем VisualizationViewer в качестве панели, на которой рисуем. VisualizationViewer содержит график, который он должен отображать, через содержащийся в нем GraphLayout. У нас также есть функция сохранения, которая сохраняет график в текстовый файл:

public void saveGraph(){
    Graph<V, E> g = visualizationviewer.getGraphLayout.getGraph();
    // save g into text file
}

Теперь я написал класс, который генерирует мне новый объект графа, используя некоторые алгоритмы:

public Graph<V, E> generateGraph(){
    Graph<V, E> g = new DirectedSparseGraph<V, E>();
    // do some algorithms on g
    return g
}

Если теперь я хочу отобразить сгенерированный график через:

...
visualisationviewer.getGraphLayout.setGraph(generateGraph());
...

Новый график прекрасно отображается, и на нем можно рисовать еще дальше.

Но функции сохранения (и все другие функции, которые хотят использовать базовый объект Graph VisualizationViewer) больше не работают должным образом. Либо распознается только один узел, либо нет узлов (что приводит к исключению NullPointerException). Каждый раз, когда мы хотим получить базовую структуру данных Graph, мы используем:

visualizationviewer.getGraphLayout.getGraph();

Я что-то пропустил здесь? Или есть известная ошибка в рамках, которая не была исправлена? Кажется странным, что оптическая часть работает отлично, а программное извлечение базовых объектов — нет.


person user283494    schedule 27.11.2011    source источник
comment
Я не полностью изучаю JUNG2, использую только то, что мне нужно больше всего, но JUNG2 предоставляет постоянный механизм для сохранения/загрузки графика/макета, который я не использую в своем проекте... попробуйте проверить пример кода в edu.uci.ics.jung.samples.PersistentLayoutDemo.java, действительно ли он соответствует вашим требованиям или нет.   -  person ecle    schedule 28.11.2011
comment
Извлечение также используется во многих других частях нашего редактора, я просто использовал функцию сохранения в качестве примера. Проблема всегда одна и та же.   -  person user283494    schedule 28.11.2011


Ответы (1)


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

Node node;           
g.addVertex(node = nodefactory.create());
nodes.add(node);

Таким образом, вы все еще можете использовать свой arrayList(nodes), но избегаете ошибок!

Вторая ошибка заключается в том, что средство просмотра визуализации не распознает узлы из нового графа, поэтому вам нужно сравнить имена узлов и взять позицию из старого узла, чтобы получить ее правильно.

Я не думаю, что это вообще полезно..
Просто имейте в виду, что нужно добавлять PDEEdges и Nodes напрямую, а не через ArrayList ;-)

person OttoWalkes    schedule 29.11.2011