# Container des JFrame zeichnet sich nicht bei Aufruf von paintAll



## Dominik231 (17. Feb 2009)

Hallo,
Code sagt bekanntlich mehr als tausend Worte:
[HIGHLIGHT="Java"]public static void main(String[] args){	
		//erstelle ein einfaches JFrame
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(200,200);
		frame.setVisible(true);

		//erstelle ein Bild in das ich zeichnen möchte
		BufferedImage img = new BufferedImage(300,300, BufferedImage.TYPE_INT_ARGB);
		Graphics2D g = img.createGraphics();
		g.setColor(Color.BLACK);
		g.fillRect(0, 0, 300, 300);

		//Nun möchte ich das GESAMMTE JFrame in das Bild zeichnen
		frame.paintAll(g);

		//Zur Kontrolle zeige ich das Bild in einem zweiten JFrame an.
		JFrame frame2 = new JFrame("Picture");
		frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame2.add(new JScrollPane(new JLabel(new ImageIcon(img))));
		frame2.setSize(300,300);
		frame2.setLocation(200,0);
		frame2.setVisible(true);
	}[/HIGHLIGHT]

Und nun doch die tausend Worte:
Leider wird nur der Inhalt des JFrames gezeichnet. Es wird nicht der äussere "Container" oder die Decoration oder wie auch immer man den Bereich nennt gezeichnet.

Falls also jemand eine Idee hat, wie ich an die Bildinformationen eines JFrames komme, was zwar dargestellt wird (setVisible(true)), aber vielleicht nicht vollständig auf dem Schirm ist (Robot hilft mir also nicht unbedingt weiter), wäre ich sehr Dankbar.

Gruß

Dominik


----------



## Zed (17. Feb 2009)

Komponenten added man so in ein Frame: frame.getContentPane().add(XXX);  http://java.sun.com/docs/books/tutorial/uiswing/components/frame.html


----------



## Quaxli (17. Feb 2009)

So:

[HIGHLIGHT="Java"]import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;

public class Test {

	public static void main(String[] args) {
		// erstelle ein einfaches JFrame
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(200, 200);
		frame.setVisible(true);

		// erstelle ein Bild in das ich zeichnen möchte
		Robot robby = null;
		try {
			robby = new Robot();
		} catch (AWTException e) {}
		BufferedImage img = robby.createScreenCapture(new Rectangle(frame.getX(),frame.getY(),frame.getWidth(),frame.getHeight()));

		// Zur Kontrolle zeige ich das Bild in einem zweiten JFrame an.
		JFrame frame2 = new JFrame("Picture");
		frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame2.add(new JScrollPane(new JLabel(new ImageIcon(img))));
		frame2.setSize(300, 300);
		frame2.setLocation(200, 0);
		frame2.setVisible(true);

	}

}[/HIGHLIGHT]


----------



## Dominik231 (17. Feb 2009)

@Quaxli
Wie ich Eingangs schon erwähnte, bringt mir Robot nichts, wenn das Frame nicht vollständig auf dem Schirm ist.
Beispielsweise, wenn ich das JFrame linksaus dem Desktoprand schiebe.
setLocation(-100,-100)....


----------



## Dominik231 (17. Feb 2009)

@Zed
Wie man Komponenten einem JFrame hinzufügt ist mir durchaus bekannt und hat leider nichts mit meinem Problem zu tun.


----------



## Verjigorm (17. Feb 2009)

Zed hat gesagt.:


> Komponenten added man so in ein Frame: frame.getContentPane().add(XXX);  http://java.sun.com/docs/books/tutorial/uiswing/components/frame.html



afaik ist das seit 1.5 nichtmehr zwingend notwenig
http://weblogs.java.net/blog/hansmuller/archive/2005/11/jframeadd_conte.html



> So, in Tiger, JFrame's add and setLayout (and addLayout) methods have changed to "do what you [probably] mean". The other JFrame methods, like getComponent(), do not redirect, so if you use them, be careful. And if you don't use them, well, ignorance is bliss


----------



## Quaxli (17. Feb 2009)

Dominik231 hat gesagt.:


> @Quaxli
> Wie ich Eingangs schon erwähnte, bringt mir Robot nichts, wenn das Frame nicht vollständig auf dem Schirm ist.
> Beispielsweise, wenn ich das JFrame linksaus dem Desktoprand schiebe.
> setLocation(-100,-100)....



Hatte ich überlesen


----------



## Dominik231 (17. Feb 2009)

Zum besseren Verständnis nochmal zwei Bilder.
Bild1 mit paint(Graphics g),
Bild2 mit paintAll(Graphics g).


----------



## SlaterB (17. Feb 2009)

langes Ausprobieren führt zum (deprecated) Erfolg:
frame.getPeer().print(g);

edit:
so ist es wohl gedacht:
frame.printAll(g);


----------



## Dominik231 (17. Feb 2009)

Herr im Himmel,
da hätte man nun auch noch selbst drauf kommen können. 

Vielen herzlichen Dank SlaterB und natürlich auch allen anderen die es zumindest versucht haben.

Es funktioniert mit printAll(Graphics g).


----------

