To change the way a vertex is rendered, you provide an implementation of the Renderer.Vertex
interface. The interface has one function – paintVertex – where you can draw anything you like, like in the graphics of any JComponent. I changed my example, adding 3 nodes: a circle, a square and a rectangle, each one painted with it’s shape and in a different color.
import java.awt.Color; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Shape; import java.awt.geom.Ellipse2D; import java.awt.geom.Point2D; import javax.swing.JFrame; import org.apache.commons.collections15.Transformer; import edu.uci.ics.jung.algorithms.layout.CircleLayout; import edu.uci.ics.jung.algorithms.layout.Layout; import edu.uci.ics.jung.graph.DirectedSparseGraph; import edu.uci.ics.jung.visualization.RenderContext; import edu.uci.ics.jung.visualization.VisualizationViewer; import edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse; import edu.uci.ics.jung.visualization.control.ModalGraphMouse; import edu.uci.ics.jung.visualization.renderers.Renderer; import edu.uci.ics.jung.visualization.transform.shape.GraphicsDecorator; public class JungLearning { public static void main(String[] args) { DirectedSparseGraph<String, String> g = new DirectedSparseGraph<String, String>(); g.addVertex("Square"); g.addVertex("Rectangle"); g.addVertex("Circle"); g.addEdge("Edge1", "Square", "Rectangle"); g.addEdge("Edge2", "Square", "Circle"); g.addEdge("Edge3", "Circle", "Square"); VisualizationViewer<String, String> vv = new VisualizationViewer<String, String>( new CircleLayout<String, String>(g), new Dimension(400,400)); Transformer<String, String> transformer = new Transformer<String, String>() { @Override public String transform(String arg0) { return arg0; } }; vv.getRenderContext().setVertexLabelTransformer(transformer); transformer = new Transformer<String, String>() { @Override public String transform(String arg0) { return arg0; } }; vv.getRenderContext().setEdgeLabelTransformer(transformer); vv.getRenderer().setVertexRenderer(new MyRenderer()); // The following code adds capability for mouse picking of vertices/edges. Vertices can even be moved! final DefaultModalGraphMouse<String,Number> graphMouse = new DefaultModalGraphMouse<String,Number>(); vv.setGraphMouse(graphMouse); graphMouse.setMode(ModalGraphMouse.Mode.PICKING); JFrame frame = new JFrame(); frame.getContentPane().add(vv); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } static class MyRenderer implements Renderer.Vertex<String, String> { @Override public void paintVertex(RenderContext<String, String> rc, Layout<String, String> layout, String vertex) { GraphicsDecorator graphicsContext = rc.getGraphicsContext(); Point2D center = layout.transform(vertex); Shape shape = null; Color color = null; if(vertex.equals("Square")) { shape = new Rectangle((int)center.getX()-10, (int)center.getY()-10, 20, 20); color = new Color(127, 127, 0); } else if(vertex.equals("Rectangle")) { shape = new Rectangle((int)center.getX()-10, (int)center.getY()-20, 20, 40); color = new Color(127, 0, 127); } else if(vertex.equals("Circle")) { shape = new Ellipse2D.Double(center.getX()-10, center.getY()-10, 20, 20); color = new Color(0, 127, 127); } graphicsContext.setPaint(color); graphicsContext.fill(shape); } } }
And the results are favorable:
P.D: Yes, I know that the code is ugly, is not OO, has numbers instead of constants, etc… I have no good excuse.
The source code for this example can be found here.