Zeichnung (mit Graphics g) auf einem jPanel verschwindet

Speedrunner

Grünschnabel
hi,

ich wollte einen Funktionsplotter programmieren und habe mich entschieden als Grundlage ein JPanel zu verwenden. Das Koordinatensystem wird direkt auf dem Panel gezeichnet. Das Panel liegt dann auf einer GUI. Mit Attributen habe ich z.B. den Anfang der x bzw y Achse oder den Umrechnungsfaktor, wie viele Einheiten ein Pixel ist bestimmt. Der Plotter geht in der hinsicht also.

Wenn ich aber eine Iteration zeichnen möchte rufe ich die Methode zeichnePunkt(double x, double y, Color farbe) vom Plotter in einer Methode einer Steuerungsklasse auf.
Eine Steuerungsklasse ruft Zeichnepunkt z..B. 100000-mal auf. Die Methode der Steuerungsklasse wird aufgerufen, wenn man den Go button auf der Gui drückt.

Dabei benutze ich Graphics g um den Punkt zu zeichnen. Nun kommt es aber vor, dass mitten in den 100000-mal unregelmäßig das Panel wieder ganz weiß wird und die davorgezeichneten Sachen (Punkt als auch die X/Y-Achse verschwinden. Dies passiert auch manchmal, nachdem die Steuerung die 100000 Iterationen fertig ausgeführt hat.

Die Paint-Methode habe ich nicht überschrieben, sondern die Achsen werden durch die Methode "public void zeichnen() " gezeichnet, die wiederum von anderen Klassen (der GUI) aufgerufen wird.

Woran könnte es liegen, dass es immer weiß wird?


Code:
public void zeichnePunkt(double x, double y, Color farbe){
        Graphics g=this.getGraphics();
        g.setColor(farbe);

        g.drawLine(xKoordinate(x), yKoordinate(y), xKoordinate(x), yKoordinate(y));  //Koordinaten müssen umgerechnet werden
        
    }
 
Zuletzt bearbeitet:
Hallo,

es wäre vielleicht wichtig zu wissen, wo du das ganze Aufrufst.

Gruß

Sascha
 
Das JPanel ruft automatisch immer seine Paint-Methode auf, die ich nicht überschrieben habe. Ich könnte meine Achsen in der Paint-Methode immer neu zeichnen lassen
und alles in die Paint-Methode verlagern.

Aber dann wären meine davor gezeichneten Punkte verloren. Ich könnte die Iteration immer von vorne starten bei der Paint-Methode,
aber das kostet sehr viel Laufzeit.

Gibt es also eine Möglichkeit das letztgezeichnete Graphics wiederherzustellen, wenn die Paint-Methode wieder aufgerufen wird oder kann man das ständige repainten unterbinden?
 
Also du rufst die Methode selbst irgendwo auf.
Du wirst es in der paint() bzw in der paintComponent-Methode lösen. Wenn du nicht möchtest, dass die alten Punkte verloren gehen, musst du diese speichern und ständig mitzeichnen.

repaint unterbinden ist nicht empfehlenswert, da diese Methode auch aufgerufen wird, wenn sich das Fenster hinter einem anderen Fenster war und wieder in den Vordergrund kommt.

Gruß

Sascha
 
Das Speichern der Punkte wäre möglich.
Ich weiß aber nicht ob dann der reservierte Speicher für Java zu voll wird, wenn man eine sehr hohe Auflösung hat.
 
Dass kann ich dir nicht sagen, da ich dein Programm ja nicht kenne.
Du kannst den Speicher der JVM aber höher stellen.

Code:
java -Xmx512m

Gruß

Sascha
 
Dann erstmal danke,
ich werde es mal probieren.

Edit: Es scheint zu gehen :) Die Laufzeit hat sich durch die Speicherung und Neuzeichnung nun merklich erhöht aber es liefert nun ein stabiles bild.
 
Zuletzt bearbeitet:
Zurück