# Wie benutze ich einen robot richtig für screencapture



## *Ludger* (20. Jul 2007)

Hallo zusammen, 

ich möchte einen Screenshot eines bestimmten Bereichs meiner Swing Anwendung machen, genauer von dem HauptPanel (getViewingPanel()), welches in einem JScrollPane liegt. Allerdings will das nicht so recht klappen, obwohl
der unten stehende Schnipsel das meiner Meinung nach machen sollte ? ???:L 

Kann mir jemand kurz was zu sagen ?




```
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/test~~~~~~~~~~~~~~~~~~~~~~~~~~~
    	  try {
    	     java.awt.Robot robot = new Robot();    	  
    	     
    	     
    	     int x = getViewingPanel().getLocationOnScreen().x;
    	     int y = getViewingPanel().getLocationOnScreen().y;    	     
    	     int width = getViewingPanel().getWidth();
    	     int height = getViewingPanel().getHeight();
    	     
             //x = 133, y = 155, width = 833, height = 1291;
    	     System.out.println("x: "+x+ "   "+ "y: "+y+ "  width: "+width +" height: "+height);

    	     previewWindow.setBImage(robot.createScreenCapture(new Rectangle(x,y,width, height)));
    	 }catch (Exception ex) {}
    	 
    	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/test~~~~~~~~~~~~~~~~~~~~~~~~~~~
```


----------



## Marco13 (21. Jul 2007)

Ohne es getestet zu haben (einen "offensichtlichen" Fehler sehe ich nicht) zumindest der Tipp, bei Sachen, von denen man nicht sicher ist, ob sie funktinieren (und vor allem bei Sachen, von denen man WEISS, dass sie NICHT funktionieren), Exceptions nicht einfach zu "verschlucken", sondern mit

```
catch (Exception ex) 
{
    ex.printStackTrace(); // !!!!
}
```
evtl. hilfreiche Nachrichten auf den Bildschirm zu bringen.


----------



## André Uhres (21. Jul 2007)

*Ludger* hat gesagt.:
			
		

> ..ich möchte einen Screenshot .. von dem HauptPanel .. welches in einem JScrollPane liegt..




```
BufferedImage image;
        Robot robot = null;
        try {
            robot = new Robot();
        } catch (AWTException ex) {
            ex.printStackTrace();
        }
        Rectangle viewRect = jScrollPane1.getViewport().getViewRect();
        Point componentLocation =
                jScrollPane1.getViewport().getView().getLocationOnScreen();
        viewRect.translate(componentLocation.x, componentLocation.y);
        image = robot.createScreenCapture(viewRect);
```

Die Demo benutzt zwar einen JTree, aber das funzt auch für JPanel und alle anderen JComponents:

```
package robot;
/*
 * PanelCaptureDemo.java
 */
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class PanelCaptureDemo extends JFrame {
    private JButton btCapture;
    private JScrollPane jScrollPane1;
    private JTree jTree1;
    public PanelCaptureDemo() {
        jScrollPane1 = new JScrollPane();
        jTree1 = new JTree();
        btCapture = new JButton();
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jScrollPane1.setViewportView(jTree1);
        getContentPane().add(jScrollPane1, BorderLayout.CENTER);
        btCapture.setText("Panel Capture");
        btCapture.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent evt) {
                btCaptureActionPerformed(evt);
            }
        });
        getContentPane().add(btCapture, BorderLayout.NORTH);
        setSize(400,300);
        setLocationRelativeTo(null);
    }
    private void btCaptureActionPerformed(final ActionEvent evt) {
        BufferedImage image;
        Robot robot = null;
        try {
            robot = new Robot();
        } catch (AWTException ex) {
            ex.printStackTrace();
        }
        Rectangle viewRect = jScrollPane1.getViewport().getViewRect();
        Point componentLocation =
                jScrollPane1.getViewport().getView().getLocationOnScreen();
        viewRect.translate(componentLocation.x, componentLocation.y);
        image = robot.createScreenCapture(viewRect);
        JDialog dialog = new JDialog(this, "Panel Capture Dialog", false);
        dialog.setSize(400,300);
        dialog.add(new JLabel(new ImageIcon(image)));
        dialog.setVisible(true);
    }
    public static void main(final String args[]) {new PanelCaptureDemo().setVisible(true);}
}
```


----------



## *Ludger* (21. Jul 2007)

Oh, ein schönes Beispiel. 
Aber: wenn ich nun die 3 Knoten ausfahre, wird der ScrollPane aktiv und es wird nur das gecaptured, was gerade sichtbar ist. Das sollte nicht sein. Wenn ich nun probiere, die gesamte Größe des ScrollPanes auf ein Image zu capturen, ist in das Bild plötzlich die Windows Task Leiste und und eine schwarze Fläche zu sehen .

Hm, geht das überhaupt mit dem robot, so wie ich das haben möchte ?


----------



## André Uhres (21. Jul 2007)

*Ludger* hat gesagt.:
			
		

> ..es wird nur das gecaptured, was gerade sichtbar ist. Das sollte nicht sein..


Sorry, ich dachte, daß es gerade darum geht, denn das ist ja der Sinn vom "screen" capture.
Du brauchst einen "componentCapture":

```
package robot;
/*
 * PanelCaptureDemo_1.java
 */
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class PanelCaptureDemo_1 extends JFrame {
    private JButton btCapture;
    private JScrollPane jScrollPane1;
    private JTree jTree1;
    public PanelCaptureDemo_1() {
        jScrollPane1 = new JScrollPane();
        jTree1 = new JTree();
        btCapture = new JButton();
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jScrollPane1.setViewportView(jTree1);
        getContentPane().add(jScrollPane1, BorderLayout.CENTER);
        btCapture.setText("Panel Capture");
        btCapture.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent evt) {
                btCaptureActionPerformed(evt);
            }
        });
        getContentPane().add(btCapture, BorderLayout.NORTH);
        setSize(400,300);
        setLocationRelativeTo(null);
    }
    private void btCaptureActionPerformed(final ActionEvent evt) {
        BufferedImage image = componentCapture(jTree1);
        JDialog dialog = new JDialog(this, "Panel Capture Dialog", false);
        dialog.setSize(400,300);
        dialog.add(new JScrollPane(new JLabel(new ImageIcon(image))));
        dialog.setVisible(true);
    }
    public  BufferedImage componentCapture(Component component) {
        BufferedImage image = new BufferedImage(
                component.getWidth(), component.getHeight(), 
                BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        g.setColor(component.getBackground());
        g.fillRect(0, 0,  image.getWidth(), image.getHeight());
        component.print(g);
        g.dispose();
        return image;
    }
    public static void main(final String args[]) {new PanelCaptureDemo_1().setVisible(true);}
}
```


----------



## *Ludger* (21. Jul 2007)

Hammer!

Besten Dank.  :applaus:


----------

