Yesterday I was facing a problem of exporting JGraph graph to a SVG format image. Neither SVGGraphWriter, neither a solution presented in JGraph tutorial didn’t work.
Using SVGGraphWriter from JGraph I got all of my graph nodes and connections just dumped one on the other. JGraph manual (can be found here, page 97) proposes using Apache Batik and painting the graph using SVGGraphics2D provided by the library. The problem is that
JGraph graph = ...
SVGGraphics2D graphics = ...
...
graph.paint(graphics);
just doesn’t work. So I decided to explore JGraph source and see if there is any way I can make this work.
And voila few minutes and I found a solution:
OutputStreamWriter writer = ...;
Object[] cells = graph.getRoots();
Rectangle2D bounds = graph.toScreen(graph.getCellBounds(cells));</code>
DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation();
Document document = domImpl.createDocument(null, "svg", null);
SVGGraphics2D svgGraphics = new SVGGraphics2D(document);
svgGraphics.setSVGCanvasSize(new Dimension((int)Math.round(bounds.getWidth()), (int)Math.round(bounds.getHeight())));
RepaintManager repaintManager = RepaintManager.currentManager(graph);
repaintManager.setDoubleBufferingEnabled(false);
BasicGraphUI gui = (BasicGraphUI) graph.getUI(); // The magic is those two lines
gui.drawGraph(svgGraphics, bounds);
svgGraphics.stream(writer, false);