頂点に文字列を付与する

// 頂点に文字列をくっつける                                                     
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);
        }
    }

}

実行結果を以下に示す.
f:id:ymuto109:20090709223325p:image