Ganz grob
BufferedImage bi = new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB);
Graphics g = bi.createGraphics();
// in das g reinzeichnen, dann
g.dispose();
Und das Bild dann mit ImageIO speichern. Bei Components kann dieses "Reinzeichnen" ein bißchen frickelig sein, aber so als Ansatz...
Üblicherweise überschreibt man nicht die paint() eines JFrames, sondern verbaut darin ein JPanel/JComponent und überschreibt deren paintComponent(Graphics g)
Was hast Du bisher versucht?
Wenn Du ein BufferedImage verwendest kannst Du Dir mit createGraphics() das Graphics Objekt des Bildes holen und damit zeichnen was Du willst. z.B. Deine Graphik, Deinen JFrame bzw. die ContentPane des JFrames...
Jetzt möchte ich von dem Graphics Objekt was ich zeichne, auch die Größe für das BufferedImage übernehmen.
Mit
Java:
g2.getClipBounds().width
bekomme ich Werte, die ändern sich aber ständig zur Laufzeit, da ich mehrere male paint() aufrufe. Habt ihr eine Idee wie man die "letzte" Größe am Ende herausfindet und wo ich dann am besten mein speichern/erzeugen aufrufe?
Das Graphics Objekt besitzt keine Information über die Größe des gezeichneten Objekts.
Die Größe musst Du von dem zu zeichenenden Objekt erfragen.
Ein Graphics Objekt ist nur ein Werkzeug zum Zeichnen, quasi der Pinsel. Du benötigst aber die Größe der Leinwand.
Ok, dann anders formuliert. Ich möchte vorher nicht explizit die größe festlegen sondern erst am ende sagen, die leinwand (in dem Fall das JFrame) soll exakt die randmaße haben, von der gezeichneten fläche. ist das möglich?
War die ursprüngliche Fragestellung nicht ein JFrame bzw. einen bestimmten Inhalt auf ein BufferedImage zu zeichenen?
Die Größe eines BufferdImages wird bei der Erzeugung definiert. Reicht das nicht aus muss ein größeres erzeugt und das kleiner darauf abgemalt werden.
Worauf zeichnest Du und woher beziehst Du die Information zu dem Inhalt der gezeichnet werden soll?
Ich rufe o.g. paint Methode auf mit dem Konstruktoraufruf der Superklasse JFrame, nur so bekomm ich mein JFrame mit Zeichnung angezeigt und gleichzeitig ein BufferedImage mit selbigem Inhalt.
Meine Klasse erbt direkt von Jframe worauf ich auch zeichne. Die informationen hole ich mir aus einem Formular.
Ich rufe o.g. paint Methode auf mit dem Konstruktoraufruf der Superklasse JFrame, nur so bekomm ich mein JFrame mit Zeichnung angezeigt und gleichzeitig ein BufferedImage mit selbigem Inhalt.
Meine Klasse erbt direkt von Jframe worauf ich auch zeichne. Die informationen hole ich mir aus einem Formular.
Und willst jetzt was erreichen?
Was ist mit dem BufferedImage? Das wird ebenfalls im JFrame angezeigt? Oder soll auf das gleichzeitg der selbe Inhalt gemalt werden?
Was genau steht in Deiner paint...?
in Swing zeichnen wir nicht direkt auf das Fenster (JFrame), sondern auf eine JComponent, die wir dem Fenster hinzufügen. Dann brauchen wir nur der JComponent die gewünschte Größe zu geben und davon ein Bild mit identischer Größe zu machen. Siehe dazu auch den ersten Link in meinem obigen Beitrag.