Может ли Jung Graphics появляться в одном и том же месте каждый раз?
Вопрос
Я использую Юнг ( http://jung.sourceforge.net/index.html ) нарисовать графику в Java. Программное обеспечение отличное, но у меня есть небольшой вопрос. Как я могу быть уверен, что отображаемый график каждый раз одинаково (без изменений - архитектура или положение)?
Чтобы быть более конкретным: модель графика (данные, которые должны быть представлены) не меняется, но ее представление меняется каждый раз, когда я нажимаю кнопку «Просмотр граф» :) [Некоторые вершины находятся в других местах, например: иногда в верхней части окна, иногда в нижней части
Спасибо,
Юлиан
Решение
А StaticLayout Позволяет указать вершину на Точка2d трансформатор. Это позволит вам контролировать, где расположены вершины, и должно делать то, что вы хотите. Вы должны использовать следующее конструктор:
public StaticLayout(Graph<V,E> graph,
org.apache.commons.collections15.Transformer<V,Point2D> initializer)
Вам нужно будет реализовать свой собственный трансформатор Это берет вершину и возвращает местоположение, где должна появляться вершина. Пример его использования:
package test;
import java.awt.Dimension;
import java.awt.geom.Point2D;
import java.io.IOException;
import javax.swing.JFrame;
import org.apache.commons.collections15.Transformer;
import edu.uci.ics.jung.algorithms.layout.StaticLayout;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.SparseMultigraph;
import edu.uci.ics.jung.visualization.VisualizationViewer;
/**
* Jung example - vertices appearing in same location
*
* @author Kah
*/
public class StaticLocation {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// Setup the example graph.
Graph<Integer, String> basis = new SparseMultigraph<Integer, String>();
basis.addVertex(Integer.valueOf(0));
basis.addVertex(Integer.valueOf(1));
basis.addVertex(Integer.valueOf(2));
basis.addEdge("Edge 1", Integer.valueOf(0), Integer.valueOf(1));
basis.addEdge("Edge 2", Integer.valueOf(0), Integer.valueOf(2));
basis.addEdge("Edge 3", Integer.valueOf(1), Integer.valueOf(2));
Transformer<Integer, Point2D> locationTransformer = new Transformer<Integer, Point2D>() {
@Override
public Point2D transform(Integer vertex) {
int value = (vertex.intValue() * 40) + 20;
return new Point2D.Double((double) value, (double) value);
}
};
StaticLayout<Integer, String> layout = new StaticLayout<Integer, String>(
basis, locationTransformer);
layout.setSize(new Dimension(250, 250));
VisualizationViewer<Integer, String> vv = new VisualizationViewer<Integer, String>(
layout);
vv.setPreferredSize(new Dimension(250, 250));
JFrame frame = new JFrame("Simple Graph View 2");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(vv);
vv.setOpaque(false);
frame.pack();
frame.setVisible(true);
}
}
Добавлен 20 февраля 2010:
Альтернативой является использование PersistentLayoutImpl Чтобы сохранить местоположения вершин в файл. Тем не менее, вам также необходимо каким -то образом сохранить график, чтобы получить, какие вершины и вершины были там (это необходимо сохранить отдельно). Есть количество классов для удержания графика в edu.uci.ics.jung.io. Анкет Это пример, который использует просто PersistentLayoutImpl:
package test;
import java.awt.Dimension;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JFrame;
import org.apache.commons.collections15.Transformer;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.algorithms.layout.SpringLayout2;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.SparseMultigraph;
import edu.uci.ics.jung.io.GraphMLReader;
import edu.uci.ics.jung.io.GraphMLWriter;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
import edu.uci.ics.jung.visualization.layout.PersistentLayoutImpl;
/**
* Jung example - vertices appearing in same location
*
* @author Kah
*/
public class PersistentVertices
{
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException
{
// Setup the example graph.
try
{
VisualizationViewer<Integer, String> vv = new VisualizationViewer<Integer, String>(
getLayout());
vv.setPreferredSize(new Dimension(250, 250));
JFrame frame = new JFrame("Simple Graph View 2");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(vv);
vv.setOpaque(false);
frame.pack();
frame.setVisible(true);
}
catch (Exception e)
{
e.printStackTrace();
}
}
private static Layout<Integer, String> getLayout() throws IOException,
ClassNotFoundException
{
Graph<Integer, String> graph = new SparseMultigraph<Integer, String>();
File source = new File("C:\\layout.dat");
SpringLayout2<Integer, String> backing = new SpringLayout2<Integer, String>(
graph);
PersistentLayoutImpl<Integer, String> layout = new PersistentLayoutImpl<Integer, String>(
backing);
layout.setSize(new Dimension(250, 250));
// Note that you also need to put the vertices and edges back before
// restoring.
graph.addVertex(Integer.valueOf(0));
graph.addVertex(Integer.valueOf(1));
graph.addVertex(Integer.valueOf(2));
graph.addEdge("Edge 1", Integer.valueOf(0), Integer.valueOf(1));
graph.addEdge("Edge 2", Integer.valueOf(0), Integer.valueOf(2));
graph.addEdge("Edge 3", Integer.valueOf(1), Integer.valueOf(2));
if (source.exists())
{
layout.restore(source.getAbsolutePath());
}
else
{
layout.persist(source.getAbsolutePath());
}
return layout;
}
}
Обратите внимание, что пример еще не сохраняет вершины и края, так как у меня не было времени, чтобы выяснить, как использовать классы в edu.uci.ics.jung.io пока что.