Swing -> Screenshot

evoleena

Erfahrenes Mitglied
Hallo Leute,

Ich bin noch immer Anfänger in Java ;)
und momentan etwas verwirrt. Mir wurde gesagt das es besser ist Swing zu benutzen.
Das versuche ich zu machen, nur leider wollte ich einen Screenshot eines Panels machen, nun muss ich aber feststellen, das die Funktionen (Buffered Image und Robot) auf AWT Basis sind.
Kann aber leider auch nix anderes im Netz finden. Gibt es denn da etwas

Wenn Nein! Kann ich mit Hilfe von getx, gety, getWidth und getHeight des Panels das gewünschte Rechteck in dem createScreenCapture angeben

Gruss
Evo
 
Hallo evoleena,

wenn es um die Auswahl der UI-Komponenten-Bibliothek geht, sollte man Swing dem AWT vorziehen (die Gründe siehe hier). Das heißt aber nicht, dass man auf alles, was im Package java.awt und darunter liegt, verzichten sollte. Eine Alternative zu BufferedImage und Robot gibt es nicht, ist auch nicht nötig. Die Panel-Methoden getX() und getY() sowie getBounds() liefern die Koordinaten des Panels relativ zu seinem Parent und nicht zum Desktop.

Um einen Screenshot von einem Panel zu machen, ist die Klasse Robot gar nicht notwendig. Man kann einfach ein leeres Image erzeugen und dann den Inhalt des Panels dort rendern:
Java:
final Dimension size = panel.getSize();
final BufferedImage image = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_RGB);
final Graphics2D graphics = image.createGraphics();
panel.paint(graphics);

Grüße
Vincent
 
Mit de Methode paint das hab ich schon probiert da gibt es aber Probleme mit einer überschriebenen Paint methode und das andere habsch auch Probiert, aber das erzeugte Bild bleibt leider leer ;(

Code:
private void screenshot() throws AWTException, FileNotFoundException, IOException{
        //BufferedImage screen = (new Robot()).createScreenCapture
          //      (new Rectangle(jPanel2.getX(),jPanel2.getY(),jPanel2.getWidth(),jPanel2.getHeight())) ;
        BufferedImage test = new BufferedImage(jPanel2.getWidth(),jPanel2.getHeight(), BufferedImage.TYPE_INT_RGB );
        OutputStream output = new FileOutputStream("screenshot.jpg");
        output.close();
        JPEGCodec.createJPEGEncoder(output).encode(test);        
    }
 
Zuletzt bearbeitet:
Ob die paint()-Methode überschrieben ist, oder nicht, spielt keine Rolle. Das, was du grade auf dem Panel siehst, wird auf das Image gerendert. Der Fehler liegt wohl eher an der Speicherung der Image-Datei. Der OutputStream sollte erst dann geschlossen werden, wenn die "Arbeit" getan ist, und nicht vorher. ;) Probier's einfach so:
Java:
private void screenshot() throws FileNotFoundException, IOException {
    final BufferedImage image = new BufferedImage(jPanel2.getWidth(),jPanel2.getHeight(),
            BufferedImage.TYPE_INT_RGB );
    final Graphics2D graphics = image.createGraphics();
    jPanel2.paint(graphics);
    OutputStream output = new FileOutputStream("screenshot.jpg");
    JPEGCodec.createJPEGEncoder(output).encode(image);
    // alternativ zu dem Encoder kannst du auch die Klasse ImageIO verwenden:
    //ImageIO.write(image, "JPG", output);
    output.close();
}

Grüße
Vincent
 
Zurück