Jungグラフィックスは毎回同じ場所に表示できますか?
質問
私はジョンを使用しています( http://jung.sourceforge.net/index.html )Javaでグラフィックを描く。ソフトウェアは素晴らしいですが、小さな質問があります。表示されたグラフが同じ時に同じ時間であることを確認するにはどうすればよいですか(アーキテクチャまたは位置は変更されていません)。
より具体的には:グラフモデル(表現するデータ)は変更されませんが、「表示グラフを表示」ボタンを押すたびに表現が変更されます:) [一部の頂点は他の場所にあります。窓の、時には下部にある
ありがとうございました、
イウリアン
解決
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);
}
}
2010年2月20日追加:
別の方法は、aを使用することです 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 まだ。
所属していません StackOverflow