# Screenshot erstellen und speichern



## Underfaker (25. Nov 2013)

Hallo zusammen,

ich arbeite im Moment daran, dass das Programm einen Screenshot des aktuellen fensters macht, dieses Bild soll dann als Datei gespeichert.

Das Speichern eines Bildes habe ich bereits hinbekommen aber nicht mit diesem speziellen Screenshot, ich komme offenbar nicht richtig an diesen heran, mein Code (teilweise per Google zusammen gesucht):


```
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
				Rectangle screenRectangle = new Rectangle(screenSize);
				try {
					Robot robot;
					robot = new Robot();
					robot.keyPress(KeyEvent.VK_ALT);
					robot.keyPress(KeyEvent.VK_PRINTSCREEN);
					robot.keyRelease(KeyEvent.VK_PRINTSCREEN);
					robot.keyRelease(KeyEvent.VK_ALT);
					Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);

					Image image = (Image) t.getTransferData(DataFlavor.imageFlavor);
					
					BufferedImage bi = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
	                
			        Graphics2D g2d = bi.createGraphics();
			        g2d.drawImage(image, 0, 0, null);
			        g2d.dispose();

			        ImageIO.write(bi, "png", new File("iwas"));

				} catch (UnsupportedFlavorException | AWTException | IOException e3) {
					e3.printStackTrace();
					JOptionPane.showMessageDialog(frame, "Ein Screenshot ist nicht möglich!", "Bearbeitungsfehler", JOptionPane.ERROR_MESSAGE);
				}
```

Hat vielleicht jemand eine Idee wie ich das bewerkstelligen kann?

ps: Wenn ich selbst "von Hand" einen Screenshot (mit der Drucktaste) mache, dann kommt keine Fehlermeldung, wenn ich vorher bspw. irgendein kopiere und die Methode dann ausführe kommt ein Fehler: java.awt.datatransfer.UnsupportedFlavorException: Image

Besten Dank im Voarus


----------



## ARadauer (25. Nov 2013)

Die robot klasse hat doch eine methode zum screenshot machen


----------



## Underfaker (26. Nov 2013)

Danke für die Antwort, im Code sieht man doch, dass ein Screenshot gemacht wird, die Frage ist wieso ich damit nicht daran komme und den speichern kann.

Benutze ich: robot.createScreenCapture macht er einen Screenshot vom ganzen Bildschirm, nicht vom Fenster.


----------



## Underfaker (26. Nov 2013)

Mir ist grad aufgefallen, wenn ich die Methode zweimal ausführe dann geht es.
Nur beim ersten Mal (wenn noch kein Screenshot vorliegt) klappt es nicht, kann sich jemand vorstellen woran das liegt?


----------



## Underfaker (26. Nov 2013)

Noch ein Update:
ich habe das auf einen Button gelegt. Immer wenn ich bspw. einen Striing kopiere dann darauf drücke erscheint ein Fehlerfenster, wenn ich das wegdrücke geht es danach. Das heißt immer wenn ich wo anders als diesen Menüpunkt hinklicke funktioniert es, nur beim ersten Klick darauf geht es nicht.


----------



## Kaibear (26. Nov 2013)

Hmm klingt nach einem Fehler deiner GUI hierbei.

Wie sieht die denn aus? Ich bin ja bei GUIs ein Fan von MVC, das reduziert sowas drastisch ^^


----------



## Underfaker (26. Nov 2013)

Zweifelhaft aber ich habe gerne mal ein eigenes Program extra dafür erstellt, dort taucht der Fehler auf:


```
import java.awt.AWTException;
import java.awt.EventQueue;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Robot;
import java.awt.Toolkit;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;


public class Gui {

	private JFrame frame;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Gui window = new Gui();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public Gui() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JMenuBar menuBar = new JMenuBar();
		frame.setJMenuBar(menuBar);
		
		JMenu mnNewMenu = new JMenu("New menu");
		menuBar.add(mnNewMenu);
		
		JMenuItem mntmScreenshot = new JMenuItem("Screenshot");
		mntmScreenshot.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
				try {
					Robot robot = new Robot();
					Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
					robot.keyPress(KeyEvent.VK_ALT);
					robot.keyPress(KeyEvent.VK_PRINTSCREEN);
					robot.keyRelease(KeyEvent.VK_PRINTSCREEN);
					robot.keyRelease(KeyEvent.VK_ALT);
					
					Image image = (Image) t.getTransferData(DataFlavor.imageFlavor);
					BufferedImage bi = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
			        Graphics2D g2d = bi.createGraphics();
			        g2d.drawImage(image, 0, 0, null);
			        g2d.dispose();
			        ImageIO.write(bi, "png", new File("iwas.png"));
				} catch (UnsupportedFlavorException | AWTException | IOException e3) {
					JOptionPane.showMessageDialog(frame, "Fehler beim Erstellen eines Screenshots!", "Screenshotfehler", JOptionPane.INFORMATION_MESSAGE);
				}
			}
		});
		mnNewMenu.add(mntmScreenshot);
	}

}
```


----------

