public MyFrame() {
this.setSize(400, 300);
this.setVisible(true);
BufferedImage i = new BufferedImage(this.getWidth(), this.getHeight(), 1);
Graphics g = i.getGraphics();
this.paintComponents(g);
}
public MyFrame() {
this.setSize(400, 300);
this.setVisible(true);
BufferedImage i = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics g = i.getGraphics();
this.paintComponents(g);
try {
ImageIO.write(i, "png", new File("C:\\output.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
mephi hat gesagt.:ok so klappts nun fast
Code:public MyFrame() { this.setSize(400, 300); this.setVisible(true); BufferedImage i = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics g = i.getGraphics(); this.paintComponents(g); try { ImageIO.write(i, "png", new File("C:\\output.png")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
Das macht doch keinen Unterschied ???:LHobbit_Im_Blutrausch hat gesagt.:Hierzu mal ne Frage: Wie schaffe ich das denn mit einem Component, der nicht angezeigt wird?
Meinst du jetzt mit einer Komponente die nie sichtbar war?Hobbit_Im_Blutrausch hat gesagt.:Doch, weil die Componente so keine Größe und scheinbar auch keinen Inhalt hat.
Wildcard hat gesagt.:Meinst du jetzt mit einer Komponente die nie sichtbar war?Hobbit_Im_Blutrausch hat gesagt.:Doch, weil die Componente so keine Größe und scheinbar auch keinen Inhalt hat.
Da ist wohl manuelles Layout, aber nachdringliches Bitten beim Manager angesagt.
Wildcard hat gesagt.:Ich hätte jetzt erwartet das man das mit invalidate und validate hinbekommt.
Eine Komponente muss nicht angezeigt werden um Zeichnen zu können wie man an den Tree/Cell-Renderern erkennt.
public class Test{
public static void main(String[] args) {
JLabel label = new JLabel("Test");
BufferedImage image = new BufferedImage(100,100,BufferedImage.TYPE_INT_ARGB);
Graphics g = image.getGraphics();
label.addNotify();
label.setBounds(50,50,50,50);
label.paint(g);
try {
ImageIO.write(image, "png", new File("test.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
g.dispose();
}
}
public static void main(String[] args) {
JLabel label = new JLabel("Test");
label.setVisible(true);
label.setSize(label.getPreferredSize());
BufferedImage image = new BufferedImage(label.getWidth(),label.getHeight(),BufferedImage.TYPE_INT_ARGB);
Graphics g = image.getGraphics();
label.paint(g);
try {
ImageIO.write(image, "png", new File("test.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
g.dispose();
}
Nein, das wird ja nicht wirklich angezeigt.thE_29 hat gesagt.:Aber, wie man sieht gehts auch andersJedenfalls hatte ich recht, das es solange man es nicht anzeigt (setVisible(true)) eben nichts gezeichnet wird über die paint Methode!
![]()
Afaik nicht, da es nur darum geht das AWT die Verbindung zu einem OS Handle herstellt.Die Frage ist, wenn man ein JPanel zeichnen will, muss man da alle Kindkomponenten auch setVisible(true) sagen oder reicht das Hauptpanel aus?!
public static void main(String[] args) {
JPanel panel = new JPanel(new FlowLayout());
JLabel label = new JLabel("Test");
panel.add(label);
panel.setSize(panel.getPreferredSize());
panel.setVisible(true);
panel.doLayout();
BufferedImage image = new BufferedImage(panel.getWidth(),panel.getHeight(),BufferedImage.TYPE_INT_ARGB);
Graphics g = image.getGraphics();
panel.paint(g);
try {
ImageIO.write(image, "png", new File("test.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
g.dispose();
}
Wie gesagt, bei setVisible sehe ich Thread Probleme, also sollte alles nachfolgende mit invokeLater in die Queue gesetzt werden.Hobbit_Im_Blutrausch hat gesagt.:Hm, funzt bei mir mit setVisible(true) nicht. Nur mit addNotify. kA warum! Aber es funzt. Herzlichen Dank!![]()
Zu spät? Was meinst du damit?Hobbit_Im_Blutrausch hat gesagt.:Prob is dann aber, dass es evtl. zu spät ausgeführt wird. Aber mit addNotify gehts ausgezeichnet!
Wildcard hat gesagt.:Zu spät? Was meinst du damit?
Wildcard hat gesagt.:addNotfiy ist AFAIK nicht ganz ungefährlich. Wenn du die Wahl hast benutz es lieber nicht, wenn du es doch benutzt, pass auf das du es nur einmal aufrufst.
Ansonsten hast du im best case wohl ein Speicherleck und im worst-case gehen evtl. dem OS die Widgets aus ???:L
Wildcard hat gesagt.:noch was: wenn du es doch benutzt, unbedingt removeNotify aufrufen.