1
2
3
4
5
6
7
8
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
46
47
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
69
70 public static final int EDGE_LENGTH = 100;
71
72 @Override
73 public void init() {
74
75
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
87 layout = new FRLayout2<Number,Number>(g);
88
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
134 timer.schedule(new RemindTask(), 1000, 1000);
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
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
155 if (v_prev != null) {
156 g.addEdge(g.getEdgeCount(), v_prev, v1);
157
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 }