エッジの色を設定する

// エッジの色を設定する                                                         
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 java.awt.Color;

public class Sample04 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));

        // グラフの配置を FR レイアウト(Fruchterman-Reingold algorithm)に       
        // 従う                                                                 
        Layout layout = new FRLayout(graph);

        // Rendererインタフェース(頂点やエッジの描画を担当)                   
        PluggableRenderer renderer = new PluggableRenderer();

        // エッジの色を設定する.                                               
        //                                                                      
        // void setEdgePaintFunction(EdgePaintFunction epf) は                  
        // エッジの色を指定するため EdgePaintFunction を指定する.              
        // なお,EdgePaintFunction はインタフェースであり,その実装クラ         
        // スとして AbstractEdgePaintFunction, ConstantEdgePaintFunction が     
        // ある.                                                               
        ConstantEdgePaintFunction cepf =
            new ConstantEdgePaintFunction(Color.GREEN,  // 輪郭の色             
                                          null);        // 塗り潰し色           
        renderer.setEdgePaintFunction(cepf);

        // 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);
    }
}

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

頂点付近にマウスがある場合のみ,頂点を指定可能とする(エッジも同様)

// 頂点付近にマウスがある場合のみ,頂点を指定できる                             
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.visualization.control.PluggableGraphMouse;
import edu.uci.ics.jung.visualization.control.TranslatingGraphMousePlugin;
import edu.uci.ics.jung.visualization.control.ScalingGraphMousePlugin;
import edu.uci.ics.jung.visualization.control.ViewScalingControl;
import edu.uci.ics.jung.visualization.control.LayoutScalingControl;
import java.awt.Color;

// pickSupport のための import                                                  
import edu.uci.ics.jung.visualization.control.PickingGraphMousePlugin;
import edu.uci.ics.jung.visualization.ShapePickSupport;


public class Sample08 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));

	// グラフの配置を FR レイアウト(Fruchterman-Reingold algorithm)に       
	// 従う                                                                 
	Layout layout = new FRLayout(graph);

	// Rendererインタフェース(頂点やエッジの描画を担当)                   
	PluggableRenderer renderer = new PluggableRenderer();

	// VisualizationViewer(グラフを表示するパネル)                        
	// JPanel を継承しているため,JFrame に貼り付けることができる.         
	VisualizationViewer viewer = new VisualizationViewer(layout, renderer);

	// PluggableGraphMouse を用いて,マウスによる Zoom, Pan, Picking の     
	// 機能を追加                                                           
	//                                                                      
	// (メモ:その1)                                                       
	// 後述の setPickSupport() を機能させるためには                         
	//   graphMouse.add(new PickingGraphMousePlugin());                     
	// が必要である                                                         
	//                                                                      
	// (メモ:その2)                                                       
        // pick した後の頂点の移動は Ctrl または Shift キーを押しながら         
	// マウスをドラッグすればよい                                           
	PluggableGraphMouse graphMouse = new PluggableGraphMouse();
	graphMouse.add(new TranslatingGraphMousePlugin());      // 視点移動     

        graphMouse.add(new ScalingGraphMousePlugin(new LayoutScalingControl(), 0));     // 拡大・縮小                                                          
        graphMouse.add(new PickingGraphMousePlugin());

        viewer.setGraphMouse(graphMouse);

        // 4番目の引数 pickSize はエッジを指定する場合,その周辺をどこまで     
        // エッジとみなすか,を指定する                                         
        // なお,ShapePickSupport のコンストラクタは複数,存在し,              
        // pickSize = 2 でよければ                                              
        //    viewer.setPickSupport(new ShapePickSupport(2));                   
        // または                                                               
        //    viewer.setPickSupport(new ShapePickSupport());                    
        // としてもよい.                                                       
        viewer.setPickSupport(new ShapePickSupport(viewer, viewer, renderer, 2));

        // VisualizationViewer を JFrame へ貼り付ける                           
        window.add(viewer);

        // JFrame の各種設定                                                    
        window.setSize(600, 600);
        window.setLocationRelativeTo(null);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);
    }
}

ToolTip

// ToolTip の表示                                                               
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.visualization.control.PluggableGraphMouse;
import edu.uci.ics.jung.visualization.control.TranslatingGraphMousePlugin;
import edu.uci.ics.jung.visualization.control.ScalingGraphMousePlugin;
import edu.uci.ics.jung.visualization.control.ViewScalingControl;
import edu.uci.ics.jung.visualization.control.LayoutScalingControl;
import java.awt.Color;

// pickSupport のための import                                                  
import edu.uci.ics.jung.visualization.control.PickingGraphMousePlugin;
import edu.uci.ics.jung.visualization.ShapePickSupport;

// toolTip のための import                                                      
import edu.uci.ics.jung.graph.decorators.ToolTipFunctionAdapter;
import edu.uci.ics.jung.graph.Edge;
import java.awt.event.MouseEvent;



public class Sample09 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));

        // グラフの配置を FR レイアウト(Fruchterman-Reingold algorithm)に       
        // 従う                                                                 
        Layout layout = new FRLayout(graph);

        // Rendererインタフェース(頂点やエッジの描画を担当)                   
        PluggableRenderer renderer = new PluggableRenderer();

        // VisualizationViewer(グラフを表示するパネル)                        
        // JPanel を継承しているため,JFrame に貼り付けることができる.         
        VisualizationViewer viewer = new VisualizationViewer(layout, renderer);

        // PluggableGraphMouse を用いて,マウスによる Zoom, Pan, Picking の     
        // 機能を追加                                                           
        PluggableGraphMouse graphMouse = new PluggableGraphMouse();
	graphMouse.add(new TranslatingGraphMousePlugin());      // 視点移動     
	graphMouse.add(new ScalingGraphMousePlugin(new LayoutScalingControl(), 0));     // 拡大・縮小                                                          
	graphMouse.add(new PickingGraphMousePlugin());
	viewer.setGraphMouse(graphMouse);

        // 頂点やエッジの pinking を可能とする                                  
        viewer.setPickSupport(new ShapePickSupport(viewer, viewer, renderer, 2)\
);

        // マウスオーバの際,表示する文字列を返す関数を指定する.               
        // (注) VisualizationViewer.ToolTipListener インタフェースの            
        // 実体クラスは ToolTipFunctionAdapter である.                         
        viewer.setToolTipListener(new MyToolTipFunction());

        // VisualizationViewer を JFrame へ貼り付ける                           
        window.add(viewer);

        // JFrame の各種設定                                                    
        window.setSize(600, 600);
        window.setLocationRelativeTo(null);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);
    }

    // ToolTipFunctionAdapter                                                   
    static class MyToolTipFunction extends ToolTipFunctionAdapter {
        public String getToolTipText(Vertex vertex) { return "Vertex"; }

        public String getToolTipText(Edge edge) { return "Edge"; }

        public String getToolTipText(MouseEvent event) { return "Others"; }
    }
}

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

レイアウトに関する実験

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.contrib.CircleLayout;
import edu.uci.ics.jung.visualization.SpringLayout;
import edu.uci.ics.jung.visualization.FRLayout;

public class Sample01 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));

        // グラフの配置を SpringLayout(ばねモデル)とする                      
        Layout layout = new SpringLayout(graph);

        // グラフの配置を CircleLayout(頂点を円形に配置)とする                
        // Layout layout = new CircleLayout(graph);                             

        // グラフの配置を FR レイアウト(Fruchterman-Reingold algorithm)に       
        // 従う                                                                 
        //Layout layout = new FRLayout(graph);                                  

        // Rendererインタフェース(頂点やエッジの描画を担当)                   
        PluggableRenderer renderer = new PluggableRenderer();

        // 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);
    }
}

レイアウトには SpringLayout, CircleLayout, FRLayout があるようなので,それぞれ試してみた結果を以下に示す.

SpringLayout の場合
f:id:ymuto109:20090708204951p:image

CircleLayout の場合
f:id:ymuto109:20090708205255p:image

FRLayout の場合
f:id:ymuto109:20090708205438p:image

選択時の頂点の色を変える

// 頂点が選択された場合,その色を変化させる                                     
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.PickableVertexPaintFunction;
import java.awt.Color;

public class Sample02 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));

        // グラフの配置を FR レイアウト(Fruchterman-Reingold algorithm)に       
        // 従う                                                                 
        Layout layout = new FRLayout(graph);

        // Rendererインタフェース(頂点やエッジの描画を担当)                   
        PluggableRenderer renderer = new PluggableRenderer();

        // 頂点が選択された場合の塗りつぶし色を設定する.                       
        //                                                                      
        // void setVertexPaintFunction(VertexPaintFunction vpf) は              
        // ノードの周囲,テキストおよび内部の色を指定するための                 
        // VertexPaintFunction を指定する.                                     
        // なお VertexPaintFunction はインタフェースであり,その実装クラスと    
        // して ConstantVertexPaintFunction, PickableVertexPaintFunction,       
        // ShortestPathDemo.MyVertexPaintFunction がある.                      
        //                                                                      
        // PickableVertexPaintFunction() の第1引数は PickedInfo だが,         
        // これはインタフェースであり,そ実装クラスのひとつが PluggableRenderer
        // である.                                                             
        PickableVertexPaintFunction pvpf =
            new PickableVertexPaintFunction(renderer,         // 頂点が選択され\
ているかどうかを判別するための PickedInfo                                       
                                            Color.DARK_GRAY,  // 輪郭の色       
                                            Color.MAGENTA,    // 非選択時の色   
                                            Color.GREEN);     // 選択時の色     
	renderer.setVertexPaintFunction(pvpf);

        // 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);
    }
}

頂点に文字列を付与する

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

エッジのストローク(太さ)を変化させる

// エッジのストローク(太さ)を変化させる                                       
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.ConstantEdgeStrokeFunction;
import java.awt.Color;

public class Sample03 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));

        // グラフの配置を FR レイアウト(Fruchterman-Reingold algorithm)に       
        // 従う                                                                 
        Layout layout = new FRLayout(graph);

        // Rendererインタフェース(頂点やエッジの描画を担当)                   
        PluggableRenderer renderer = new PluggableRenderer();

        // void setEdgeStrokeFunction(EdgeStrokeFunction esf) は                
        // エッジのストロークを指定するため EdgeStrokeFunction を指定する.     
        // なお,EdgeStrokeFunction はインタフェースであり,その実装クラ        
        // スとして ConstantEdgeStrokeFunction,                                 
        // EdgeThicknessToEdgeStrokeFunctionConverter,                          
        // ShortestPathDemo.MyEdgeStrokeFunction がある.                       
        ConstantEdgeStrokeFunction cesf =
            new ConstantEdgeStrokeFunction(5);
        renderer.setEdgeStrokeFunction(cesf);

        // 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);
    }
}

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

マウスイベントのリスナ

// Zoom(ホイールによる拡大・縮小)と Pan(左ボタンによる視点移動)の機能を追加
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.visualization.ZoomPanGraphMouse;
import java.awt.Color;

public class Sample06 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));

        // グラフの配置を FR レイアウト(Fruchterman-Reingold algorithm)に       
        // 従う                                                                 
        Layout layout = new FRLayout(graph);

        // Rendererインタフェース(頂点やエッジの描画を担当)                   
        PluggableRenderer renderer = new PluggableRenderer();

        // VisualizationViewer(グラフを表示するパネル)                        
        // JPanel を継承しているため,JFrame に貼り付けることができる.         
        VisualizationViewer viewer = new VisualizationViewer(layout, renderer);

        // マウスによる Zoom と Pan の機能を追加                                
        viewer.setGraphMouse(new ZoomPanGraphMouse());

        // VisualizationViewer を JFrame へ貼り付ける                           
        window.add(viewer);

        // JFrame の各種設定                                                    
        window.setSize(600, 600);
        window.setLocationRelativeTo(null);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);
    }
}

PluggableGraphMouse を用いた,マウスによる Zoom と Pan の実現

// PluggableGraphMouse を用いて,マウスによる Zoom と Pan の機能を追加           
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.visualization.control.PluggableGraphMouse;
import edu.uci.ics.jung.visualization.control.TranslatingGraphMousePlugin;
import edu.uci.ics.jung.visualization.control.ScalingGraphMousePlugin;
import edu.uci.ics.jung.visualization.control.ViewScalingControl;
import edu.uci.ics.jung.visualization.control.LayoutScalingControl;
import java.awt.Color;

public class Sample07 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));

        // グラフの配置を FR レイアウト(Fruchterman-Reingold algorithm)に        
        // 従う                                                                  
        Layout layout = new FRLayout(graph);

        // Rendererインタフェース(頂点やエッジの描画を担当)                    
        PluggableRenderer renderer = new PluggableRenderer();

        // VisualizationViewer(グラフを表示するパネル)                         
        // JPanel を継承しているため,JFrame に貼り付けることができる.          
        VisualizationViewer viewer = new VisualizationViewer(layout, renderer);

        // PluggableGraphMouse を用いて,マウスによる Zoom と Pan の機能を追加   
        //                                                                       
        // (メモ)                                                                
        // ScalingGraphMousePlugin() の第1引数について:                        
        //   LayoutScalingControl : 頂点の大きさを変えず,グラフを拡大縮小       
        //   ViewScalingControl : 頂点の大きさも含めて,グラフを拡大縮小         
        // viewer.setGraphMouse(new ZoomPanGraphMouse());と同じ機能を            
        // 提供したいならば LayoutScalingControl を用いる.                      
        PluggableGraphMouse graphMouse = new PluggableGraphMouse();
        graphMouse.add(new TranslatingGraphMousePlugin());      // 視点移動      
        graphMouse.add(new ScalingGraphMousePlugin(new LayoutScalingControl(), 0));     // 拡大・縮小                                                            
        // graphMouse.add(new ScalingGraphMousePlugin(new ViewScalingControl(), 0));                                                                             
        viewer.setGraphMouse(graphMouse);

        // VisualizationViewer を JFrame へ貼り付ける                            
        window.add(viewer);

        // JFrame の各種設定                                                     
        window.setSize(600, 600);
        window.setLocationRelativeTo(null);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);
    }
}