エッジの色を設定する
// エッジの色を設定する 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); } }
頂点付近にマウスがある場合のみ,頂点を指定可能とする(エッジも同様)
// 頂点付近にマウスがある場合のみ,頂点を指定できる 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"; } } }
レイアウトに関する実験
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 があるようなので,それぞれ試してみた結果を以下に示す.
選択時の頂点の色を変える
// 頂点が選択された場合,その色を変化させる 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); } } }
エッジのストローク(太さ)を変化させる
// エッジのストローク(太さ)を変化させる 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); } }
マウスイベントのリスナ
// 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); } }