package org.drugis.common.gui; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.GraphicsConfiguration; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; import java.awt.Transparency; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JComponent; import org.jfree.chart.JFreeChart; import org.jgraph.JGraph; public class ImageExporter { public static void writeImage(Component frame, final JComponent p, final int width, final int height) { String [] extensions = {"png"}; String [] descriptions = {"PNG files"}; FileSaveDialog dialog = new FileSaveDialog(frame, extensions, descriptions) { @Override public void doAction(String path, String extension) { if (extension.equals("png")) writePNG(path, p, width, height); else throw new IllegalArgumentException("Unknown extension " + extension); } }; dialog.saveActions(); } public interface DrawCommand<T, C extends Graphics2D> { public void draw(T toDraw, C canvas, Dimension dim); } protected static <T> void writePNG(String path, DrawCommand<T, Graphics2D> drawer, T toDraw, Dimension dim) { GraphicsConfiguration config = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); BufferedImage bufferedImage = config.createCompatibleImage(dim.width, dim.height, Transparency.OPAQUE); Graphics2D canvas = bufferedImage.createGraphics(); canvas.setBackground(Color.WHITE); canvas.clearRect(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight()); canvas.setColor(Color.BLACK); drawer.draw(toDraw, canvas, dim); writePNG(path, bufferedImage); } protected static void writePNG(String path, JComponent p, int width, int height) { writePNG(path, new DrawCommand<JComponent, Graphics2D>() { public void draw(JComponent toDraw, Graphics2D canvas, Dimension dim) { toDraw.paint(canvas); } }, p, new Dimension(width, height)); } public static void writeImage(Component frame, final JGraph p, final int width, final int height) { String [] extensions = {"png"}; String [] descriptions = {"PNG files"}; FileSaveDialog dialog = new FileSaveDialog(frame, extensions, descriptions) { @Override public void doAction(String path, String extension) { if (extension.equals("png")) writePNG(path, p, width, height); else throw new IllegalArgumentException("Unknown extension " + extension); } }; dialog.saveActions(); } public static void writeImage(Component frame, final JFreeChart p, final int width, final int height) { String [] extensions = {"png"}; String [] descriptions = {"PNG files"}; FileSaveDialog dialog = new FileSaveDialog(frame, extensions, descriptions) { @Override public void doAction(String path, String extension) { if (extension.equals("png")) writePNG(path, p, width, height); else throw new IllegalArgumentException("Unknown extension " + extension); } }; dialog.saveActions(); } protected static void writePNG(String path, JFreeChart chart, int width, int height) { writePNG(path, new DrawCommand<JFreeChart, Graphics2D>() { public void draw(JFreeChart toDraw, Graphics2D canvas, Dimension dim) { toDraw.draw(canvas, new Rectangle(dim.width, dim.height)); } }, chart, new Dimension(width, height)); } private static void writePNG(String filename, BufferedImage b) { try { ImageIO.write(b, "png", new File(filename)); } catch (IOException e) { throw new RuntimeException(e); } } }