// 頂点に文字列をくっつける
import javax.swing.JFrame;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.UndirectedGraph;
import edu.uci.ics.jung.graph.Vertex;
import edu.uci.ics.jung.graph.impl.UndirectedSparseEdge;
import edu.uci.ics.jung.graph.impl.UndirectedSparseGraph;
import edu.uci.ics.jung.graph.impl.UndirectedSparseVertex;
import edu.uci.ics.jung.visualization.Layout;
import edu.uci.ics.jung.visualization.PluggableRenderer;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.FRLayout;
import edu.uci.ics.jung.graph.decorators.ConstantEdgePaintFunction;
import edu.uci.ics.jung.graph.decorators.VertexStringer;
import edu.uci.ics.jung.graph.ArchetypeVertex;
import edu.uci.ics.jung.utils.UserData;
import java.awt.Color;
public class Sample05 extends JFrame {
public static void main(String[] args) {
JFrame window = new JFrame("Sample01");
// 疎な無向グラフの作成
Graph graph = new UndirectedSparseGraph();
// 頂点を作成し,グラフに追加
Vertex vertex1 = graph.addVertex(new UndirectedSparseVertex());
Vertex vertex2 = graph.addVertex(new UndirectedSparseVertex());
Vertex vertex3 = graph.addVertex(new UndirectedSparseVertex());
Vertex vertex4 = graph.addVertex(new UndirectedSparseVertex());
// エッジを作成し,グラフに追加
graph.addEdge(new UndirectedSparseEdge(vertex1, vertex2));
graph.addEdge(new UndirectedSparseEdge(vertex2, vertex3));
graph.addEdge(new UndirectedSparseEdge(vertex3, vertex1));
graph.addEdge(new UndirectedSparseEdge(vertex1, vertex4));
// 各頂点に名前をつける
// (疑問)キーと値を結びつけて組とするが,同一のキーを使いまわして
// よいのかしら?
vertex1.addUserDatum(NameVertexStringer.VERTEX_NAME_KEY, "v1", UserData\
.SHARED);
vertex2.addUserDatum(NameVertexStringer.VERTEX_NAME_KEY, "v2", UserData\
.SHARED);
vertex3.addUserDatum(NameVertexStringer.VERTEX_NAME_KEY, "v3", UserData\
.SHARED);
vertex4.addUserDatum(NameVertexStringer.VERTEX_NAME_KEY, "v4", UserData\
.SHARED);
// グラフの配置を FR レイアウト(Fruchterman-Reingold algorithm)に
// 従う
Layout layout = new FRLayout(graph);
// Rendererインタフェース(頂点やエッジの描画を担当)
PluggableRenderer renderer = new PluggableRenderer();
// 各頂点に対する名前を登録した VertexStringer を登録
renderer.setVertexStringer(new NameVertexStringer());
// VisualizationViewer(グラフを表示するパネル)
// JPanel を継承しているため,JFrame に貼り付けることができる.
VisualizationViewer viewer = new VisualizationViewer(layout, renderer);
// VisualizationViewer を JFrame へ貼り付ける
window.add(viewer);
// JFrame の各種設定
window.setSize(600, 600);
window.setLocationRelativeTo(null);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
// 頂点と関連付けられた名前を返す VertexStringer インタフェース
static class NameVertexStringer implements VertexStringer {
// キー
public static final Object VERTEX_NAME_KEY = new Object();
// 頂点に対応する文字列を返す
// (注) ArchetypeVertex : Vertex の上位インタフェース
public String getLabel(ArchetypeVertex vertex){
return (String)vertex.getUserDatum(VERTEX_NAME_KEY);
}
}
}
実行結果を以下に示す.