Screenshot einer Anwendung erstellen

Status
Nicht offen für weitere Antworten.

AMiGA

Bekanntes Mitglied
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
 
Code:
Graphics g = bufferedImage.createGraphics();
frame.paint(g);
Wenn du das mit allen Fenstern/Dialogen machst geht das.
 
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...
 
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)
 
Stimmt, müsste eigentlich gehen. Bin nicht darauf gekommen, dass ich mehrfach in das gleiche Graphics-Objekt schreiben kann. Danke!
 
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?
 
Hallo erstmal! 🙂

Versuch´s mal damit:

Code:
frame.getLayeredPane().paintComponents(g);

evtl. vielleicht auch so:

Code:
frame.paint(g);
frame.getLayeredPane().paintComponents(g);

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

Liebe Grüße
Reality
 
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
 
Hat keiner eine Idee, wieso bei oben genannter Methode die Titelzeile sowie der Rahmen eines JFrames schwarz gezeichnet werden?
 
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)
 
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
 
@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.
 
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)
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben