un StaticLayout vous permet de spécifier un sommet au transformateur Point2D. Cela vous permettra de contrôler où les sommets sont placés et devrait faire ce que vous voulez faire. Vous devez utiliser les éléments suivants constructor:
public StaticLayout(Graph<V,E> graph,
org.apache.commons.collections15.Transformer<V,Point2D> initializer)
Vous aurez besoin de mettre en œuvre votre propre transformer qui prend en un sommet et retourne l'emplacement où le sommet doit apparaître. Un exemple de son utilisation dans:
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);
}
}
Ajouté le 20 février 2010:
Une alternative est d'utiliser un PersistentLayoutImpl pour enregistrer les emplacements des sommets dans un fichier. Cependant, vous devez également persister d'une manière ou d'une autre dans le graphe pour obtenir quels sommets et sommets étaient présents (ceci doit être conservé séparément). Il existe un certain nombre de classes pour la persistance du graphique dans edu.uci.ics.jung.io. Ceci est un exemple qui utilise juste 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;
}
}
Notez que l'exemple ne persiste pas les sommets et arêtes encore, comme je l'ai pas eu le temps de comprendre comment utiliser les classes edu.uci.ics.jung.io encore.
Cela signifie que je dois repositionner tous les points par moi-même? J'ai une architecture graphique complexe qui doit être visualisée et je ne suis pas sûr de pouvoir "dire" la bonne position de chaque sommet. – INS
Non, vous n'avez pas à repositionner les points par vous-même. Vous pouvez utiliser PersistentLayout pour utiliser une autre mise en page, puis l'enregistrer. S'il vous plaît voir ma réponse révisée (j'ai ajouté quelque chose de nouveau). – Klarth
J'espérais éviter cela mais c'est la vie. Je pense vraiment que c'est le meilleur choix. Merci, Klarth. – INS