# Screenshot einer Anwendung erstellen



## AMiGA (10. Jun 2005)

Hallo zusammen,

haut mich nicht, ich habe sehr wohl das Forum zuerst durchsucht!  Ich würde gerne einen Screenshot einer vollständigen Anwendung machen. Ich habe bislang zwei Möglichkeiten versucht, beide funktionieren nicht:

1. mit Hilfe von java.awt.Robot.createScreenCapture(frame.getBounds());
Hierbei ist das Problem, dass ich die Anwendung weder mit toFront noch setAlwaysOnTop garantiert immer in den Vordergrund bekomme und somit (wenn auch nur manchmal) einen unvollständigen Bildschirmabdruck erhalte.

2. mit Hilfe von 
Graphics g = bufferedImage.createGraphics();
frame.paint(g);
Hierbei ist das Problem, dass ich zwar immer einen sauberen Abdruck vom Frame erhalte, auch wenn er im Hintergrund ist, aber leider halt nur vom Frame selber und nicht von eventuell vorhandenen anderen Fenstern im Vordergrund (die zur Anwendung gehören). Auch paintAll hilft hier leider nicht weiter.

Hat vielleicht irgendjemand eine Idee, wie man einen Screenshot erstellen kann, der immer einwandfrei wird, auch wenn die Anwendung irgendwo im Hintergrund läuft?

Gruß,
AMiGA


----------



## Wildcard (10. Jun 2005)

```
Graphics g = bufferedImage.createGraphics();
frame.paint(g);
```
Wenn du das mit allen Fenstern/Dialogen machst geht das.


----------



## AMiGA (10. Jun 2005)

Du meinst zuerst mit dem Hauptframe und dann danach mit all seinen Kindern? Ich würde aber gerne alles in einem Bild haben, so wie bei einem "echten" Screenshot. Ich dachte eigentlich, dass paintAll genau das machen würde...


----------



## Wildcard (10. Jun 2005)

hast du doch danach. Du musst einfach das gleiche Graphics-Objekt an alle Childs weiterreichen...
EDIT:


			
				AMiGA hat gesagt.:
			
		

> Ich dachte eigentlich, dass paintAll genau das machen würde...


Schon, aber nur Subcomponents was Dialoge, andere Fenster nicht betrifft (einfacher: nur die lightweights im Frame werden gezeichnet)


----------



## AMiGA (10. Jun 2005)

Stimmt, müsste eigentlich gehen. Bin nicht darauf gekommen, dass ich mehrfach in das gleiche Graphics-Objekt schreiben kann. Danke!


----------



## AMiGA (13. Jun 2005)

Leider habe ich dabei immer noch zwei Probleme:

- zum einen wird auf diese Weise die Titelzeile der JFrames komlett schwarz im Screenshot, keine Ahnung warum

- und zum anderen werden die Child-Frames alle links oben im Screenshot eingefügt und nicht an der Stelle, wo sie auch wirklich auf dem Bildschirm angeordnet sind

Hat vielleicht irgendjemand eine Idee, was ich machen kann, damit die Child-Frames an der korrekten Stelle erscheinen und die Kopfzeile der Frames ebenfalls korrekt dargestellt wird?


----------



## Reality (13. Jun 2005)

Hallo erstmal! 

Versuch´s mal damit:


```
frame.getLayeredPane().paintComponents(g);
```

evtl. vielleicht auch so:


```
frame.paint(g);
frame.getLayeredPane().paintComponents(g);
```

Weil soweit ich weiß, enthält paintComponents() nur POP-UPs, tooltips usw.

Liebe Grüße
Reality


----------



## AMiGA (13. Jun 2005)

Hi,

getLayeredPane().paintComponents zeichnet leider auch nicht die Titelleiste sowie den Rahmen vom JFrame ;(

Dafür klappt mittlerweile das Ausrichten der Child-Frames via graphicsObjekt.translate(x,y).

Gruß,
AMiGA


----------



## AMiGA (13. Jun 2005)

Hat keiner eine Idee, wieso bei oben genannter Methode die Titelzeile sowie der Rahmen eines JFrames schwarz gezeichnet werden?


----------



## KISS (13. Jun 2005)

ja, weil das (unter windows) von der system api gemacht wird, die aber in einem systemkontext und nicht in deinem grafikcontext laeuft. (jdenfalls afair, wenn du z.b auf das motiv plaf schaltest koennte es gehen)


----------



## AMiGA (14. Jun 2005)

Hi KISS,

meinst Du ich soll das gesamte LookAndFeel umschalten? Im Sinne von UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel")? Das hat leider keine Auswirkungen...

Gruß,
AMiGA


----------



## AMiGA (14. Jun 2005)

*nach oben schubs*


----------



## AMiGA (15. Jun 2005)

@KISS könntest Du mir das mit dem Motiv Plaf bitte kurz erläutern. Ich kenne mich in Swing leider nicht gut aus, daher ist mir nur die oben genannte LookAndFeel-Einstellung bekannt.


----------



## AMiGA (18. Jun 2005)

*nach oben schubs*


----------



## Roar (18. Jun 2005)

das hat nix mit dem motif lnf zu tun. wenn du die titelleiste + rahmen haben willst musst du das über die JRootPanes deiner Frames und Dialoge machen und das LaF die titelleisten zeichnen lassen: JFrame.setDefaultLookAndFeelDecorated(true), JDialog.setDefaultLookAndFeelDecorated(true)


----------

