A StaticLayout позволяет указать вершину для преобразователя Point2D . Это позволит вам контролировать расположение вершин и делать то, что вы хотите. Вы должны использовать следующий конструктор :
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 . 1030 *