1
2
3
4
5
6
7
8
9 package edu.uci.ics.jung.samples;
10
11 import java.awt.BorderLayout;
12 import java.awt.Color;
13 import java.awt.Container;
14 import java.awt.event.ActionEvent;
15 import java.awt.event.ActionListener;
16 import java.awt.event.ItemEvent;
17 import java.awt.event.ItemListener;
18 import java.util.HashMap;
19 import java.util.Map;
20
21 import javax.swing.Icon;
22 import javax.swing.ImageIcon;
23 import javax.swing.JButton;
24 import javax.swing.JCheckBox;
25 import javax.swing.JFrame;
26 import javax.swing.JPanel;
27
28 import com.google.common.base.Function;
29 import com.google.common.base.Functions;
30
31 import edu.uci.ics.jung.algorithms.layout.FRLayout;
32 import edu.uci.ics.jung.graph.DirectedSparseGraph;
33 import edu.uci.ics.jung.graph.Graph;
34 import edu.uci.ics.jung.graph.util.EdgeType;
35 import edu.uci.ics.jung.visualization.GraphZoomScrollPane;
36 import edu.uci.ics.jung.visualization.VisualizationViewer;
37 import edu.uci.ics.jung.visualization.control.CrossoverScalingControl;
38 import edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse;
39 import edu.uci.ics.jung.visualization.control.ScalingControl;
40 import edu.uci.ics.jung.visualization.decorators.EllipseVertexShapeTransformer;
41 import edu.uci.ics.jung.visualization.decorators.PickableEdgePaintTransformer;
42 import edu.uci.ics.jung.visualization.decorators.PickableVertexPaintTransformer;
43 import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
44 import edu.uci.ics.jung.visualization.decorators.VertexIconShapeTransformer;
45 import edu.uci.ics.jung.visualization.renderers.DefaultEdgeLabelRenderer;
46 import edu.uci.ics.jung.visualization.renderers.DefaultVertexLabelRenderer;
47
48
49
50
51
52
53
54
55 public class UnicodeLabelDemo {
56
57
58
59
60 Graph<Integer,Number> graph;
61
62
63
64
65 VisualizationViewer<Integer,Number> vv;
66
67 boolean showLabels;
68
69 public UnicodeLabelDemo() {
70
71
72 graph = new DirectedSparseGraph<Integer,Number>();
73 Integer[] v = createVertices(10);
74 createEdges(v);
75 Map<Integer, Icon> iconMap = new HashMap<Integer, Icon>();
76
77 vv = new VisualizationViewer<Integer,Number>(new FRLayout<Integer,Number>(graph));
78 vv.getRenderContext().setVertexLabelTransformer(new UnicodeVertexStringer<Integer>(v));
79 vv.getRenderContext().setVertexLabelRenderer(new DefaultVertexLabelRenderer(Color.cyan));
80 vv.getRenderContext().setEdgeLabelRenderer(new DefaultEdgeLabelRenderer(Color.cyan));
81 VertexIconShapeTransformer<Integer> vertexIconShapeFunction =
82 new VertexIconShapeTransformer<Integer>(new EllipseVertexShapeTransformer<Integer>());
83 Function<Integer, Icon> vertexIconFunction = Functions.forMap(iconMap);
84 vv.getRenderContext().setVertexShapeTransformer(vertexIconShapeFunction);
85 vv.getRenderContext().setVertexIconTransformer(vertexIconFunction);
86 loadImages(v, iconMap);
87 vertexIconShapeFunction.setIconMap(iconMap);
88 vv.getRenderContext().setVertexFillPaintTransformer(new PickableVertexPaintTransformer<Integer>(vv.getPickedVertexState(), Color.white, Color.yellow));
89 vv.getRenderContext().setEdgeDrawPaintTransformer(new PickableEdgePaintTransformer<Number>(vv.getPickedEdgeState(), Color.black, Color.lightGray));
90
91 vv.setBackground(Color.white);
92
93
94 vv.setVertexToolTipTransformer(new ToStringLabeller());
95
96
97 final JFrame frame = new JFrame();
98 Container content = frame.getContentPane();
99 final GraphZoomScrollPane panel = new GraphZoomScrollPane(vv);
100 content.add(panel);
101 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
102
103 final DefaultModalGraphMouse<Integer, Number> gm
104 = new DefaultModalGraphMouse<Integer,Number>();
105 vv.setGraphMouse(gm);
106
107 final ScalingControl scaler = new CrossoverScalingControl();
108
109 JButton plus = new JButton("+");
110 plus.addActionListener(new ActionListener() {
111 public void actionPerformed(ActionEvent e) {
112 scaler.scale(vv, 1.1f, vv.getCenter());
113 }
114 });
115 JButton minus = new JButton("-");
116 minus.addActionListener(new ActionListener() {
117 public void actionPerformed(ActionEvent e) {
118 scaler.scale(vv, 1/1.1f, vv.getCenter());
119 }
120 });
121
122 JCheckBox lo = new JCheckBox("Show Labels");
123 lo.addItemListener(new ItemListener(){
124 public void itemStateChanged(ItemEvent e) {
125 showLabels = e.getStateChange() == ItemEvent.SELECTED;
126 vv.repaint();
127 }
128 });
129 lo.setSelected(true);
130
131 JPanel controls = new JPanel();
132 controls.add(plus);
133 controls.add(minus);
134 controls.add(lo);
135 controls.add(gm.getModeComboBox());
136 content.add(controls, BorderLayout.SOUTH);
137
138 frame.pack();
139 frame.setVisible(true);
140 }
141
142
143 class UnicodeVertexStringer<V> implements Function<V,String> {
144
145 Map<V,String> map = new HashMap<V,String>();
146 Map<V,Icon> iconMap = new HashMap<V,Icon>();
147 String[] labels = {
148 "\u0057\u0065\u006C\u0063\u006F\u006D\u0065\u0020\u0074\u006F\u0020JUNG\u0021",
149 "\u6B22\u8FCE\u4F7F\u7528\u0020\u0020JUNG\u0021",
150 "\u0414\u043E\u0431\u0440\u043E\u0020\u043F\u043E\u0436\u0430\u043B\u043E\u0432\u0430\u0422\u044A\u0020\u0432\u0020JUNG\u0021",
151 "\u0042\u0069\u0065\u006E\u0076\u0065\u006E\u0075\u0065\u0020\u0061\u0075\u0020JUNG\u0021",
152 "\u0057\u0069\u006C\u006B\u006F\u006D\u006D\u0065\u006E\u0020\u007A\u0075\u0020JUNG\u0021",
153 "JUNG\u3078\u3087\u3045\u3053\u305D\u0021",
154
155 "\u0042\u0069\u0065\u006E\u0076\u0065\u006E\u0069\u0064\u0061\u0020\u0061\u0020JUNG\u0021"
156 };
157
158 public UnicodeVertexStringer(V[] vertices) {
159 for(int i=0; i<vertices.length; i++) {
160 map.put(vertices[i], labels[i%labels.length]);
161 }
162 }
163
164
165
166
167 public String getLabel(V v) {
168 if(showLabels) {
169 return (String)map.get(v);
170 } else {
171 return "";
172 }
173 }
174
175 public String apply(V input) {
176 return getLabel(input);
177 }
178 }
179
180
181
182
183
184
185 private Integer[] createVertices(int count) {
186 Integer[] v = new Integer[count];
187 for (int i = 0; i < count; i++) {
188 v[i] = new Integer(i);
189 graph.addVertex(v[i]);
190 }
191 return v;
192 }
193
194
195
196
197
198 void createEdges(Integer[] v) {
199 graph.addEdge(new Double(Math.random()), v[0], v[1], EdgeType.DIRECTED);
200 graph.addEdge(new Double(Math.random()), v[0], v[3], EdgeType.DIRECTED);
201 graph.addEdge(new Double(Math.random()), v[0], v[4], EdgeType.DIRECTED);
202 graph.addEdge(new Double(Math.random()), v[4], v[5], EdgeType.DIRECTED);
203 graph.addEdge(new Double(Math.random()), v[3], v[5], EdgeType.DIRECTED);
204 graph.addEdge(new Double(Math.random()), v[1], v[2], EdgeType.DIRECTED);
205 graph.addEdge(new Double(Math.random()), v[1], v[4], EdgeType.DIRECTED);
206 graph.addEdge(new Double(Math.random()), v[8], v[2], EdgeType.DIRECTED);
207 graph.addEdge(new Double(Math.random()), v[3], v[8], EdgeType.DIRECTED);
208 graph.addEdge(new Double(Math.random()), v[6], v[7], EdgeType.DIRECTED);
209 graph.addEdge(new Double(Math.random()), v[7], v[5], EdgeType.DIRECTED);
210 graph.addEdge(new Double(Math.random()), v[0], v[9], EdgeType.DIRECTED);
211 graph.addEdge(new Double(Math.random()), v[9], v[8], EdgeType.DIRECTED);
212 graph.addEdge(new Double(Math.random()), v[7], v[6], EdgeType.DIRECTED);
213 graph.addEdge(new Double(Math.random()), v[6], v[5], EdgeType.DIRECTED);
214 graph.addEdge(new Double(Math.random()), v[4], v[2], EdgeType.DIRECTED);
215 graph.addEdge(new Double(Math.random()), v[5], v[4], EdgeType.DIRECTED);
216 }
217
218 protected void loadImages(Integer[] vertices, Map<Integer,Icon> imageMap) {
219
220 ImageIcon[] icons = null;
221 try {
222 icons = new ImageIcon[] {
223 new ImageIcon(getClass().getResource("/images/united-states.gif")),
224 new ImageIcon(getClass().getResource("/images/china.gif")),
225 new ImageIcon(getClass().getResource("/images/russia.gif")),
226 new ImageIcon(getClass().getResource("/images/france.gif")),
227 new ImageIcon(getClass().getResource("/images/germany.gif")),
228 new ImageIcon(getClass().getResource("/images/japan.gif")),
229 new ImageIcon(getClass().getResource("/images/spain.gif"))
230 };
231 } catch(Exception ex) {
232 System.err.println("You need flags.jar in your classpath to see the flag icons.");
233 }
234 for(int i=0; icons != null && i<vertices.length; i++) {
235 imageMap.put(vertices[i],icons[i%icons.length]);
236 }
237 }
238
239 public static void main(String[] args)
240 {
241 new UnicodeLabelDemo();
242 }
243 }