JUNG, изменение ссылки на график в средстве визуализации - PullRequest
2 голосов
/ 27 ноября 2011

Мы разработали небольшой редактор графиков с помощью 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();

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

1 Ответ

1 голос
/ 29 ноября 2011

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

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

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

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

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

...