1 package prefuse.demos.applets; 2 3 import java.awt.Color ; 4 import java.awt.Dimension ; 5 6 import javax.swing.BorderFactory ; 7 import javax.swing.Box ; 8 import javax.swing.BoxLayout ; 9 import javax.swing.JComponent ; 10 import javax.swing.JSplitPane ; 11 import javax.swing.event.ChangeEvent ; 12 import javax.swing.event.ChangeListener ; 13 14 import prefuse.Display; 15 import prefuse.Visualization; 16 import prefuse.action.ActionList; 17 import prefuse.action.RepaintAction; 18 import prefuse.action.assignment.ColorAction; 19 import prefuse.action.filter.GraphDistanceFilter; 20 import prefuse.action.layout.graph.ForceDirectedLayout; 21 import prefuse.activity.Activity; 22 import prefuse.controls.DragControl; 23 import prefuse.controls.FocusControl; 24 import prefuse.controls.NeighborHighlightControl; 25 import prefuse.controls.PanControl; 26 import prefuse.controls.WheelZoomControl; 27 import prefuse.controls.ZoomControl; 28 import prefuse.controls.ZoomToFitControl; 29 import prefuse.data.Graph; 30 import prefuse.data.Tuple; 31 import prefuse.data.event.TupleSetListener; 32 import prefuse.data.io.GraphMLReader; 33 import prefuse.data.tuple.TupleSet; 34 import prefuse.render.DefaultRendererFactory; 35 import prefuse.render.LabelRenderer; 36 import prefuse.util.ColorLib; 37 import prefuse.util.GraphLib; 38 import prefuse.util.PrefuseLib; 39 import prefuse.util.force.ForceSimulator; 40 import prefuse.util.ui.JForcePanel; 41 import prefuse.util.ui.JPrefuseApplet; 42 import prefuse.util.ui.JValueSlider; 43 import prefuse.util.ui.UILib; 44 import prefuse.visual.NodeItem; 45 import prefuse.visual.VisualGraph; 46 import prefuse.visual.VisualItem; 47 48 51 public class GraphView extends JPrefuseApplet { 52 53 private static final String graph = "graph"; 54 private static final String nodes = "graph.nodes"; 55 private static final String edges = "graph.edges"; 56 57 public void init() { 58 UILib.setPlatformLookAndFeel(); 59 JComponent graphview = demo("/socialnet.xml", "name"); 60 this.getContentPane().add(graphview); 61 } 62 63 public static JComponent demo(String datafile, String label) { 64 Graph g = null; 65 if ( datafile == null ) { 66 g = GraphLib.getGrid(15,15); 67 } else { 68 try { 69 g = new GraphMLReader().readGraph(datafile); 70 } catch ( Exception e ) { 71 e.printStackTrace(); 72 System.exit(1); 73 } 74 } 75 return demo(g, label); 76 } 77 78 public static JComponent demo(Graph g, String label) { 79 80 final Visualization vis = new Visualization(); 82 VisualGraph vg = vis.addGraph(graph, g); 83 vis.setValue(edges, null, VisualItem.INTERACTIVE, Boolean.FALSE); 84 85 TupleSet focusGroup = vis.getGroup(Visualization.FOCUS_ITEMS); 86 focusGroup.addTupleSetListener(new TupleSetListener() { 87 public void tupleSetChanged(TupleSet ts, Tuple[] add, Tuple[] rem) 88 { 89 for ( int i=0; i<rem.length; ++i ) 90 ((VisualItem)rem[i]).setFixed(false); 91 for ( int i=0; i<add.length; ++i ) { 92 ((VisualItem)add[i]).setFixed(false); 93 ((VisualItem)add[i]).setFixed(true); 94 } 95 vis.run("draw"); 96 } 97 }); 98 99 LabelRenderer tr = new LabelRenderer(label); 101 tr.setRoundedCorner(8, 8); 102 vis.setRendererFactory(new DefaultRendererFactory(tr)); 103 104 105 106 108 int maxhops = 4, hops = 4; 109 final GraphDistanceFilter filter = new GraphDistanceFilter(graph, hops); 110 111 ActionList draw = new ActionList(); 112 draw.add(filter); 113 draw.add(new ColorAction(nodes, VisualItem.FILLCOLOR, ColorLib.rgb(200,200,255))); 114 draw.add(new ColorAction(nodes, VisualItem.STROKECOLOR, 0)); 115 draw.add(new ColorAction(nodes, VisualItem.TEXTCOLOR, ColorLib.rgb(0,0,0))); 116 draw.add(new ColorAction(edges, VisualItem.FILLCOLOR, ColorLib.gray(200))); 117 draw.add(new ColorAction(edges, VisualItem.STROKECOLOR, ColorLib.gray(200))); 118 119 ColorAction fill = new ColorAction(nodes, 120 VisualItem.FILLCOLOR, ColorLib.rgb(200,200,255)); 121 fill.add("_fixed", ColorLib.rgb(255,100,100)); 122 fill.add("_highlight", ColorLib.rgb(255,200,125)); 123 124 ForceDirectedLayout fdl = new ForceDirectedLayout(graph); 125 ForceSimulator fsim = fdl.getForceSimulator(); 126 fsim.getForces()[0].setParameter(0, -1.2f); 127 128 ActionList animate = new ActionList(Activity.INFINITY); 129 animate.add(fdl); 130 animate.add(fill); 131 animate.add(new RepaintAction()); 132 133 vis.putAction("draw", draw); 137 vis.putAction("layout", animate); 138 vis.runAfter("draw", "layout"); 139 140 141 144 Display display = new Display(vis); 145 display.setSize(500,500); 146 display.setForeground(Color.GRAY); 147 display.setBackground(Color.WHITE); 148 149 display.addControlListener(new FocusControl(1)); 151 display.addControlListener(new DragControl()); 152 display.addControlListener(new PanControl()); 153 display.addControlListener(new ZoomControl()); 154 display.addControlListener(new WheelZoomControl()); 155 display.addControlListener(new ZoomToFitControl()); 156 display.addControlListener(new NeighborHighlightControl()); 157 158 display.setForeground(Color.GRAY); 159 display.setBackground(Color.WHITE); 160 161 164 final JForcePanel fpanel = new JForcePanel(fsim); 166 167 final JValueSlider slider = new JValueSlider("Distance", 0, maxhops, hops); 168 slider.addChangeListener(new ChangeListener () { 169 public void stateChanged(ChangeEvent e) { 170 filter.setDistance(slider.getValue().intValue()); 171 vis.run("draw"); 172 } 173 }); 174 slider.setBackground(Color.WHITE); 175 slider.setPreferredSize(new Dimension (300,30)); 176 slider.setMaximumSize(new Dimension (300,30)); 177 178 Box cf = new Box (BoxLayout.Y_AXIS); 179 cf.add(slider); 180 cf.setBorder(BorderFactory.createTitledBorder("Connectivity Filter")); 181 fpanel.add(cf); 182 183 fpanel.add(Box.createVerticalGlue()); 184 185 JSplitPane split = new JSplitPane (); 187 split.setLeftComponent(display); 188 split.setRightComponent(fpanel); 189 split.setOneTouchExpandable(true); 190 split.setContinuousLayout(false); 191 split.setDividerLocation(530); 192 split.setDividerLocation(800); 193 194 195 NodeItem focus = (NodeItem)vg.getNode(0); 197 PrefuseLib.setX(focus, null, 400); 198 PrefuseLib.setY(focus, null, 250); 199 focusGroup.setTuple(focus); 200 201 return split; 203 } 204 205 } | Popular Tags |