Das Erstellen von Screenshots in einer Java-Anwendung ist eine häufig benötigte Funktion, sei es für Debugging-Zwecke, zur Protokollierung oder um eine Benutzeroberfläche zu dokumentieren. In diesem Artikel wird erklärt, wie man mit Java Screenshots des gesamten Bildschirms sowie spezifischer GUI-Komponenten (in Swing und JavaFX) aufnimmt.

1. Screenshots des gesamten Bildschirms aufnehmen

Die einfachste Möglichkeit, einen Screenshot des gesamten Bildschirms in Java zu erstellen, ist die Verwendung der Robot-Klasse. Dieses Beispiel zeigt, wie man einen Screenshot aufnimmt und speichert:

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class ScreenshotFull {
    public static void main(String[] args) {
        try {
            Robot robot = new Robot();
            Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
            BufferedImage screenCapture = robot.createScreenCapture(screenRect);
            ImageIO.write(screenCapture, "png", new File("screenshot.png"));
            System.out.println("Screenshot gespeichert als screenshot.png");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
Code-Sprache: JavaScript (javascript)

Berücksichtigung mehrerer Bildschirme

Falls mehrere Bildschirme vorhanden sind, kann man die GraphicsEnvironment-Klasse nutzen, um die Grenzen aller Bildschirme zu bestimmen:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] screens = ge.getScreenDevices();
for (GraphicsDevice screen : screens) {
    Rectangle bounds = screen.getDefaultConfiguration().getBounds();
    BufferedImage capture = robot.createScreenCapture(bounds);
    ImageIO.write(capture, "png", new File("screenshot_" + screen.getIDstring() + ".png"));
}
Code-Sprache: JavaScript (javascript)

2. Screenshots einer Swing-Komponente aufnehmen

Oftmals ist es sinnvoll, nur eine bestimmte Komponente einer Swing-Oberfläche zu erfassen. Dies kann durch das Rendern der Komponente in ein BufferedImage erreicht werden:

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.*;

public class SwingComponentScreenshot {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Swing Screenshot Beispiel");
        JButton button = new JButton("Screenshot machen");
        frame.add(button);
        frame.setSize(300, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        
        button.addActionListener(e -> {
            try {
                BufferedImage image = new BufferedImage(button.getWidth(), button.getHeight(), BufferedImage.TYPE_INT_ARGB);
                button.paint(image.getGraphics());
                ImageIO.write(image, "png", new File("button_screenshot.png"));
                System.out.println("Screenshot der Komponente gespeichert als button_screenshot.png");
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        });
    }
}
Code-Sprache: JavaScript (javascript)

3. Screenshots einer JavaFX-Komponente aufnehmen

JavaFX bietet eine eingebaute Möglichkeit zur Screenshot-Erstellung durch die Snapshot-Methode.

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.SnapshotParameters;
import javafx.scene.control.Button;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;

public class JavaFXScreenshot extends Application {
    @Override
    public void start(Stage primaryStage) {
        Button button = new Button("Screenshot machen");
        button.setOnAction(e -> {
            try {
                WritableImage snapshot = button.snapshot(new SnapshotParameters(), null);
                BufferedImage image = javafx.embed.swing.SwingFXUtils.fromFXImage(snapshot, null);
                ImageIO.write(image, "png", new File("javafx_button_screenshot.png"));
                System.out.println("Screenshot gespeichert als javafx_button_screenshot.png");
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        });
        
        primaryStage.setScene(new Scene(button, 300, 200));
        primaryStage.show();
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}
Code-Sprache: JavaScript (javascript)

Fazit

Das Erstellen von Screenshots in Java ist mit der Robot-Klasse für den gesamten Bildschirm und mit der paint-Methode (Swing) bzw. snapshot (JavaFX) für GUI-Elemente einfach umsetzbar. Mehrere Bildschirme lassen sich mit der GraphicsEnvironment-Klasse handhaben. Mit diesen Techniken lassen sich vielseitige Screenshot-Funktionen in Java-Anwendungen implementieren.