// 頂点付近にマウスがある場合のみ,頂点を指定できる
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);
}
}