View Javadoc
1   /*
2    * Copyright (c) 2003, The JUNG Authors
3    * All rights reserved.
4    *
5    * This software is open-source under the BSD license; see either "license.txt"
6    * or https://github.com/jrtom/jung/blob/master/LICENSE for a description.
7    *
8    * Created on May 10, 2004
9    */
10  
11  
12  package edu.uci.ics.jung.samples;
13  import java.awt.BorderLayout;
14  import java.awt.Color;
15  import java.awt.Dimension;
16  import java.awt.Font;
17  import java.awt.event.ActionEvent;
18  import java.awt.event.ActionListener;
19  import java.util.Timer;
20  import java.util.TimerTask;
21  
22  import javax.swing.JButton;
23  import javax.swing.JFrame;
24  import javax.swing.JRootPane;
25  
26  import com.google.common.base.Functions;
27  
28  import edu.uci.ics.jung.algorithms.layout.AbstractLayout;
29  import edu.uci.ics.jung.algorithms.layout.FRLayout;
30  import edu.uci.ics.jung.algorithms.layout.FRLayout2;
31  import edu.uci.ics.jung.algorithms.layout.SpringLayout;
32  import edu.uci.ics.jung.algorithms.layout.util.Relaxer;
33  import edu.uci.ics.jung.graph.DirectedSparseMultigraph;
34  import edu.uci.ics.jung.graph.Graph;
35  import edu.uci.ics.jung.graph.ObservableGraph;
36  import edu.uci.ics.jung.graph.event.GraphEvent;
37  import edu.uci.ics.jung.graph.event.GraphEventListener;
38  import edu.uci.ics.jung.graph.util.Graphs;
39  import edu.uci.ics.jung.visualization.VisualizationViewer;
40  import edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse;
41  import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
42  import edu.uci.ics.jung.visualization.renderers.Renderer;
43  
44  /**
45   * Demonstrates visualization of a graph being actively updated.
46   *
47   * @author danyelf
48   */
49  public class AddNodeDemo extends javax.swing.JApplet {
50  
51      /**
52  	 *
53  	 */
54  	private static final long serialVersionUID = -5345319851341875800L;
55  
56  	private Graph<Number,Number> g = null;
57  
58      private VisualizationViewer<Number,Number> vv = null;
59  
60      private AbstractLayout<Number,Number> layout = null;
61  
62      Timer timer;
63  
64      boolean done;
65  
66      protected JButton switchLayout;
67  
68  //    public static final LengthFunction<Number> UNITLENGTHFUNCTION = new SpringLayout.UnitLengthFunction<Number>(
69  //            100);
70      public static final int EDGE_LENGTH = 100;
71  
72      @Override
73      public void init() {
74  
75          //create a graph
76      	Graph<Number,Number> ig = Graphs.<Number,Number>synchronizedDirectedGraph(new DirectedSparseMultigraph<Number,Number>());
77  
78          ObservableGraph<Number,Number> og = new ObservableGraph<Number,Number>(ig);
79          og.addGraphEventListener(new GraphEventListener<Number,Number>() {
80  
81  			public void handleGraphEvent(GraphEvent<Number, Number> evt) {
82  				System.err.println("got "+evt);
83  
84  			}});
85          this.g = og;
86          //create a graphdraw
87          layout = new FRLayout2<Number,Number>(g);
88  //        ((FRLayout)layout).setMaxIterations(200);
89  
90          vv = new VisualizationViewer<Number,Number>(layout, new Dimension(600,600));
91  
92          JRootPane rp = this.getRootPane();
93          rp.putClientProperty("defeatSystemEventQueueCheck", Boolean.TRUE);
94  
95          getContentPane().setLayout(new BorderLayout());
96          getContentPane().setBackground(java.awt.Color.lightGray);
97          getContentPane().setFont(new Font("Serif", Font.PLAIN, 12));
98  
99          vv.getModel().getRelaxer().setSleepTime(500);
100         vv.setGraphMouse(new DefaultModalGraphMouse<Number,Number>());
101 
102         vv.getRenderer().getVertexLabelRenderer().setPosition(Renderer.VertexLabel.Position.CNTR);
103         vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
104         vv.setForeground(Color.white);
105         getContentPane().add(vv);
106         switchLayout = new JButton("Switch to SpringLayout");
107         switchLayout.addActionListener(new ActionListener() {
108 
109             public void actionPerformed(ActionEvent ae) {
110             	Dimension d = new Dimension(600,600);
111                 if (switchLayout.getText().indexOf("Spring") > 0) {
112                     switchLayout.setText("Switch to FRLayout");
113                     layout = new SpringLayout<Number,Number>(g,
114                         Functions.<Integer>constant(EDGE_LENGTH));
115                     layout.setSize(d);
116                     vv.getModel().setGraphLayout(layout, d);
117                 } else {
118                     switchLayout.setText("Switch to SpringLayout");
119                     layout = new FRLayout<Number,Number>(g, d);
120                     vv.getModel().setGraphLayout(layout, d);
121                 }
122             }
123         });
124 
125         getContentPane().add(switchLayout, BorderLayout.SOUTH);
126 
127         timer = new Timer();
128     }
129 
130     @Override
131     public void start() {
132         validate();
133         //set timer so applet will change
134         timer.schedule(new RemindTask(), 1000, 1000); //subsequent rate
135         vv.repaint();
136     }
137 
138     Integer v_prev = null;
139 
140     public void process() {
141 
142         try {
143 
144             if (g.getVertexCount() < 100) {
145             	layout.lock(true);
146                 //add a vertex
147                 Integer v1 = new Integer(g.getVertexCount());
148 
149                 Relaxer relaxer = vv.getModel().getRelaxer();
150                 relaxer.pause();
151                 g.addVertex(v1);
152                 System.err.println("added node " + v1);
153 
154                 // wire it to some edges
155                 if (v_prev != null) {
156                     g.addEdge(g.getEdgeCount(), v_prev, v1);
157                     // let's connect to a random vertex, too!
158                     int rand = (int) (Math.random() * g.getVertexCount());
159                     g.addEdge(g.getEdgeCount(), v1, rand);
160                 }
161 
162                 v_prev = v1;
163 
164                 layout.initialize();
165                 relaxer.resume();
166                 layout.lock(false);
167             } else {
168             	done = true;
169             }
170 
171         } catch (Exception e) {
172             System.out.println(e);
173 
174         }
175     }
176 
177     class RemindTask extends TimerTask {
178 
179         @Override
180         public void run() {
181             process();
182             if(done) cancel();
183 
184         }
185     }
186 
187     public static void main(String[] args) {
188     	AddNodeDemo and = new AddNodeDemo();
189     	JFrame frame = new JFrame();
190     	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
191     	frame.getContentPane().add(and);
192 
193     	and.init();
194     	and.start();
195     	frame.pack();
196     	frame.setVisible(true);
197     }
198 }