Graphics to png

Nortix

Mitglied
Hallo,
ich zeichne auf einem JPanel beim Erstellen mittels paintComponent() ein Koordinatensystem. Danach kann ich mit einer Eingabemaske Vektoren auf dem Koordinatensystem zeichnen.
Dieses Bild soll mittels einer Funktion abgespeichert werden. Mein Problem ist nun, dass zwar das Koordinatensystem richtig abgespeichert wird, aber die darauf gezeichneten Vektoren nicht vorhanden sind - als hätte ich sie nie gezeichnet.

Muss ich nach jedem Zeichnen das momentane Graphicsobjekt abspeichern? Andere Lösungsvorschläge?

Hier mal der Code zum abspeichern:

Java:
BufferedImage image = getSnapShot(koordinatensystem);
try{
     ImageIO.write(image, "png", new File("test.png"));
}
catch (IOException ex){}
 
Ich würde sagen, die Vektoren werden einfach nicht gezeichnet. Am Speichern liegt es garantiert nicht. Wenn die Vektoren auf das Bild gezeichnet wurden, werden sie auch mit abgespeichert. Die Schlussfolgerung daraus muss also sein, dass der Fehler beim erstellen des Images liegt.
 
Sorry, vielleicht habe ich mich etwas undeutlich ausgedrückt.
Die Vektoren sind einfache Linien und werden mittels g2d.draw(shape) gezeichnet und auch auf dem Panel angezeigt - nur nicht beim Erstellen des Images.

Das ein Fehler besteht, weiß ich ja, habe leider nur keine Ideen mehr für eine Problemlösung.
 
Und wie wird das Bild gezeichnet?

Der Fehler steckt definitv nicht im geposteten Code, sondern entweder in getSnapShot oder paintComponent (oder in anderen Methoden, von denen ich nichts weis). Ein bisschen mehr Code wäre nützlich.
 
Mein Fehler! Ganz vergessen.

Java:
public BufferedImage getSnapShot(JPanel view){
        int w = view.getWidth();
        int h = view.getHeight();
 
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        synchronized (view.getTreeLock()){
            view.paint(image.createGraphics());
        }
        return image;
  }


Koordinatensystem.paintComponent(Graphics g):
Java:
public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        g.drawLine(350, 0, 350, 700);
        g.drawLine(0,350,700,350);

        // ... weitere g.drawLine Anweisungen für mehr Beschriftungen.

Koordinatensystem.geradeXY(double x, double y):
Java:
public void geradeXY(double x, double y)
    {
        //zeichnet einen Vektor bzw Strahl mit den angegebenen Werten in das Koordinatensystem
        Graphics g = this.getGraphics();
        x*=zoomX; //zoomX ist der Umrechnungsfaktor passend zur Größe des Koordinatensystems für die X-Achse
        y*=zoomY;
        
        y*=-1;
        
        x+=350;
        y+=350;
        
        Graphics2D g2d = (Graphics2D) g;
        Shape shape = new Line2D.Double(350, 350, x, y);
        g2d.draw(shape);
  
    }

Das müsste der ganze Code sein, der dafür wichtig ist.
 
Hab ich schon fast erwartet. getGraphics ist eine Methode die auf totale Irrwege führt und nicht verwendet werden sollte. Du musst die Koordinaten der Vektoren irgenwie zwischenspeichern und dann in paintComponent die Vektoren zeichnen. Ich nehme an, dass die Vektoren auch verschwinden, wenn man die Fenstergröße ändert.
 
Hallo,
danke für den Tipp.
Die Fenstergröße ist fest vorgegeben und deswegen kann ich das nicht nachverfolgen.

Heißt so viel wie, dass ich meine Methode "geradeXY(double x, double y)" in paintComponent einbinden muss und diese dann immer aufrufen, wenn ich einen Vektor zeichnen will?
 
Nein hesit soviel, wie: Du brauchst eine Instanzvariable ( z.B. List<Point> da deine Vektoren ja alle den selben Ursprung haben oder List<MyVektorClass> wenn es individueller wird) und in der paintComponent itterierst du dann darüber und zeichnest nacheinander alle Vektoren. In geradeXY passiert dann nichts anderes als das Hinzufügen eines neuen Objekts zu dieser Liste und dem Aufruf von repaint().

PS: Der Effekt das die Vektoren verschwinden dürfte auch auftreten, wenn du das Fenster minimierst und dann wieder maximierst oder ein anderes Fenster drüberziehts.
 
Hallo,
es hat endlich geklappt! Danke für die aufgebrachte Mühe.

Ich hatte in meiner Gui eine Liste mit den Vektoren. Die habe ich in das Koordinatensystem ausgelagert, die dort beim Aufruf von paintComponent() gezeichnet werden.
 

Zurück
Oben