# Image eines bestimmten Bereichs eines JPanels erstellen



## Fabian23 (9. Nov 2006)

Hallo zusammen,

ich möchte gerne von Shapes, die auf einem JPanel liegen, ein Bild erstellen. Das soll aber nur von Shapes erstellt werden, die selektiert sind. Die Selektion und das Herausfinden, wer selektiert ist, ist kein Problem. Jetzt habe ich aber noch zwei Fragen:

1. Wie kann ich am einfachsten den Bereich herausfinden, in dem die selektierten Shapes liegen. Muss ich die durchgehen und mir immer die größten Koordinaten merken?

2. Wie kann ich aus dem Bereich ein Bild erstellen? Bzw. anders gefragt, was bräuchte ich, um aus dem Bereich bin Bild zu erstellen? Muss ich beispielsweise ein Rectangle haben, dass den Bereich enthält oder reichen Koordinaten?


Gruß,
Fabian


----------



## jagdfalke (9. Nov 2006)

Lass dir das JPanel auf ein BufferedImage malen und benutze die Methode getSubimage()


----------



## Fabian23 (10. Nov 2006)

Danke für die Antwort. 

Zu Punkt 1 gibt es keine einfachere bzw. bessere Möglichkeit oder?


----------



## kaie (10. Nov 2006)

Meinst Du sowas?

```
import java.awt.*;
import java.awt.image.*;

import javax.swing.*;

public class PanelSnapshot
{
    public static Image erstelleSchnappschuss(JPanel p, JComponent[] objekte)
    {
        // BoundingBox aller selektierten Objekte
        Rectangle r = objekte[0].getBounds();
        for (int i = 1; i < objekte.length; i++)
            r = r.union(objekte[i].getBounds());

        // auf ein neues Image zeichnen
        BufferedImage bi = new BufferedImage(r.width, r.height,
                BufferedImage.TYPE_INT_RGB);
        Graphics g = bi.getGraphics();
        g.translate(-r.x,-r.y);
        p.update(g);

        // Bild zurückgeben
        return bi;
    }

    public static void main( String[] args )
    {
        // Fenster mit 5 zufällig verteilten Komponenten erzeugen
        JFrame f1 = new JFrame("Fenster 1");
        JPanel p = new JPanel();
        p.setLayout( null);
        JComponent[] c = new JComponent[5];
        c[0] = new JButton("Ein Button");
        c[1] = new JLabel("Ein Label");
        c[2] = new JCheckBox("Eine Checkbox",true);
        c[3] = new JTree();
        c[4] = new JList(new String[] {"Eins","Zwei","Drei"} );
        for( int i=0; i<c.length; i++ )
        {
            p.add(c[i]);
            c[i].setBounds((int)(300*Math.random()),(int)(300*Math.random()),c[i].getPreferredSize().width,c[i].getPreferredSize().height);
        }
        f1.add(p);
        f1.setSize(500,500);
        f1.setVisible(true);
        
        // Bildschirmfoto des Buttons, der Checkbox und der JTree erzeugen
        JComponent[] auswahl = new JComponent[] {c[0],c[2], c[3]};
        Image i = erstelleSchnappschuss(p,auswahl);
        JFrame f2 = new JFrame("Schnappschuss");
        f2.add( new JButton(new ImageIcon(i)));
        f2.pack();
        f2.setVisible(true);
    }
}
```
Übrigens würde diese Frage wohl besser in das Swing/AWT-Forum passen... hier wird sie auch zu leicht übersehen!


----------



## Fabian23 (12. Nov 2006)

Danke kaie, das sollte mir weiterhelfen.


----------

