Grafik von JFrame korrekt speichern

wotan0

Mitglied
Hallo,

ich schreibe derzeit mit der paint(Graphics g) methode einige detailierte Formen / Zahlen auf ein JFrame.
Wenn das JFrame initialisiert wird erscheint anfangs die Grafik korrekt. Möchte ich jetzt über einen weiteren Button das ganze abspeichern, verzerrt sich die Grafik und wird unbrauchbar.

Kann ich vor dem Speichervorgang nochmals paint aufrufen, oder wo liegt das Problem?

Gruß
 
Ohne den Code zu sehen: Ich würde nicht die paint überschreiben. Bei Swing überschreibt man paintComponent(Graphics g). Dann würde ich auch nicht die paintComponent vom JFrame überschreiben, sondern die eines JPanels (welches dann auf den JFrame gesetzt wird).
 
Bin mir gerade der funktionsweise nicht ganz bewusst.

Habe bislang ausschließlich die paint(Graphics g) in einem JFrame aufgerufen und dann noch ein
g2 = (Graphics2D)g; Grafikobjekt angelegt, das ich mit Anweisungen füttere.

Nun nehme ich mir ein JPanel, passe es an und packe es auf das JFrame, soweit alles klar.
Nur wie kann ich jetzt meinen ellenlangen Code aus der vorherigen paint() aufs JPanel schreiben?

Einfach in paintComponent() umbennen half nicht. Muss ich die mit jpanel.paintComponent aufrufen? Im Konstruktor klappte das nicht. Wär für Infos dankbar.
 
Bin grad ein bisschen schreibfaul:
Java:
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class SimplePaintDemo extends JFrame {
	
	public SimplePaintDemo() {
		this.add(new PaintingPanel());
	}
	
	class PaintingPanel extends JPanel {
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.drawOval(10, 10, this.getWidth()-20, this.getHeight()-20);
		}
	}

	public static void main(String[] args) {
		JFrame frame = new SimplePaintDemo();
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
 
Hallo Michael,

danke für den Tip.
Habe es nun soweit, dass ich auf ein JPanel zeichne, welches ich dann auch wie folgt speichere:
(leider tritt o.g. Fehler weiterhin auf, 2 spezielle "drawString" werden auf der x-Achse weiter entfernt dargestellt und auch gespeichert)

Java:
/** Aus der Zeichnung ein Bild machen
 * */
public static BufferedImage paintComponent(Component c) {
		 
BufferedImage img = new BufferedImage(c.getWidth(), c.getHeight(),  BufferedImage.TYPE_INT_RGB);
    g2 = img.createGraphics();
    c.paintAll(g2);
    g2.dispose();
    return img;
}
	
/** Speichern das Grafik als Datei
 * */
	@SuppressWarnings("static-access")
	public static void savePicture(BufferedImage img) {
		  
	    try {
	    	int retVal = fc.showSaveDialog(null);	
	    	if(retVal == JFileChooser.APPROVE_OPTION){
		    	File sel = fc.getSelectedFile();
		    	String path = sel.getAbsolutePath();
		    	ImageIO.write(img, "png", new File(path + "/" + "diagramm.png"));
	    	}
	    }
	    catch (IOException e) {
	    JOptionPane.showMessageDialog(infoFrame,"Beim speichern ist ein Fehler aufgetreten, versuchen sie es erneut.");
	      e.printStackTrace();
	    }
	}

Praktisch jedesmal wenn ich das Fenster (in Windows) mit JFrame und darinliegendem Panel minimiere und wieder anzeigen lasse, rückt sich ein teil meiner Zeichnung weiter nach rechts >.<
Wieso wird das jedes mal aufgerufen und vor allem wieso ändert sich weiterhin etwas?

Gruß
 
ich könnte mir vorstellen, dass dein [c]g2 = (Graphics2D)g[/c] Objekt das Problem verursacht.
Das
Code:
g2
ist auch das Graphics vom JPanel?
Imho solltest du das Graphicsobjekt nur innerhalb deiner paintComponent(Graphics g) benutzen...denn da bekommst du es auch korrekt übergeben!

Wenn du dir das (gecastete) Graphicsobjekt einfach holst und dann einfach nach gutdünken einsetzt, ist es evtl nicht mehr das korrekte....aber wie fast bei allen Problemen...ein einfaches KSKB hilft, das Problem am schnellsten zu lösen.
 
Danke, habe es hinbekommen.
Mein Problem war, dass ich im Konstruktur variablen initialisiert habe,
die in der paint Methode verwendet / verändert werden. Inwiefern das nun genau programmtechnisch einen Einfluss hat ist mir leider nicht klar, trotzdem funktioniert es nun.
 

Zurück
Oben