I will give another method, it will print the Component that you passed:
private static void print(Component comp) { // Create a `BufferedImage` and create the its `Graphics` BufferedImage image = GraphicsEnvironment.getLocalGraphicsEnvironment() .getDefaultScreenDevice().getDefaultConfiguration() .createCompatibleImage(comp.getWidth(), comp.getHeight()); Graphics graphics = image.createGraphics(); // Print to BufferedImage comp.paint(graphics); graphics.dispose(); // Output the `BufferedImage` via `ImageIO` try { ImageIO.write(image, "png", new File("Image.png")); } catch (IOException e) { e.printStackTrace(); } }
You need at least
import java.awt.Component; import java.awt.Graphics; import java.awt.GraphicsEnvironment; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO;
To prevent EDT blocking, ImageIO.write should not be called on EDT, so replace the try - catch as follows:
new SwingWorker<Void, Void>() { private boolean success; @Override protected Void doInBackground() throws Exception { try { // Output the `BufferedImage` via `ImageIO` if (ImageIO.write(image, "png", new File("Image.png"))) success = true; } catch (IOException e) { } return null; } @Override protected void done() { if (success) { // notify user it succeed System.out.println("Success"); } else { // notify user it failed System.out.println("Failed"); } } }.execute();
And one more thing to import:
import javax.swing.SwingWorker;
source share