Canvas "löscht sich"

Status
Nicht offen für weitere Antworten.

akaDisi

Aktives Mitglied
Hi,

ich habe ein Canvas auf dem ich in der paint() methode ein Koordinatensystem zeichnen lasse, das sich an die Werte der Benutzer anpasst. Jetzt habe ich das Problem, dass ich mit einer 2ten Funktion die Graphen eintrage. Allerdings verschwinden die wieder, wenn ich runterscrolle und das Applet nicht mehr sichtbar ist. Genau so, wenn sich ein Ordner über das Applet schiebt.

Woran kann das liegen? Kann man da irgendwas machen, damit das "gesichert" wird?

Wenn ihr Quellcode braucht, dann sagt bescheid, aber ich hoffe ihr könnt mir so helfen.

MfG Disi
 
klingt als würdest du irgendwo getGraphics() aufrufen und selber zeichen,
so dass bei einem repaint() + normalen Zeichenvorgang, ausgelöst durch die externen Ereignisse, die Daten verschwinden,

Code wäre nützlich, ja
 
Java:
//[...]
public void paint (Graphics grafik){
        Dimension d=getSize();
        
        int breite=d.width, hoehe=d.height,
            abstandxachse, abstandyachse;
        
        abstandxachse = 35;
        abstandyachse = 35;
        
        int einteilungy = (hoehe-abstandyachse*2)/8;
        int einteilungx = (breite-abstandxachse*2)/5;

      //Zeichnen eines 4Ecks um das Canvas
        grafik.drawRect(1,1,breite-2,hoehe-2);
      
      //Achsen zeichnen   
        grafik.drawLine(abstandxachse,hoehe-abstandyachse,abstandxachse,hoehe-(hoehe-abstandyachse));
        grafik.drawLine(abstandxachse,hoehe-abstandyachse,breite-abstandxachse,hoehe-abstandyachse);
      
     //Beschriftung der Achsen anbringen   
        grafik.drawString("X",breite-100,hoehe-5);
        grafik.drawString("Y",5,hoehe-(hoehe-25));
       
      //Einteilung auf den Achsen  
        for(int i=1;i<=8;i++){
            grafik.drawLine(abstandxachse-2,hoehe-abstandyachse-(einteilungy*i),
                                 breite-abstandxachse,hoehe-abstandyachse-(einteilungy*i));

            if(i==2){
                grafik.drawString("0,5",abstandxachse-18,hoehe-abstandyachse-(einteilungy*i));
            }
            else if(i==4){
                grafik.drawString("1,0",abstandxachse-18,hoehe-abstandyachse-(einteilungy*i));
            }
            else if(i==6){
                grafik.drawString("1,5",abstandxachse-18,hoehe-abstandyachse-(einteilungy*i));
            }
            else if(i==8){
                grafik.drawString("2,0",abstandxachse-18,hoehe-abstandyachse-(einteilungy*i));
            }
        }

        for(int i=1;i<=5;i++){
            grafik.drawLine(abstandxachse+(einteilungx*i),hoehe-abstandyachse-2,
                                 abstandxachse+(einteilungx*i),hoehe-abstandxachse+2);

            if(i==1){
                grafik.drawString("100",abstandxachse+(einteilungx*i)-10,hoehe-abstandyachse+18);
            }
            else if(i==2){
                grafik.drawString("200",abstandxachse+(einteilungx*i)-10,hoehe-abstandyachse+18);
            }
            else if(i==3){
                grafik.drawString("300",abstandxachse+(einteilungx*i)-10,hoehe-abstandyachse+18);
            }
            else if(i==4){
                grafik.drawString("400",abstandxachse+(einteilungx*i)-10,hoehe-abstandyachse+18);
            }
            else if(i==5){
                grafik.drawString("500",abstandxachse+(einteilungx*i)-10,hoehe-abstandyachse+18);
            }
        }
    }
//[...]
/*Die Funktion hier wird dann später, nachdem der Benutzer 
die Daten eingegeben hat aufgerufen. in colFarbe wird einfach 
eine Farbe übergeben (will die verschiedenen Graphen färben) 
und koordinaten ist halt ein Array mit den Werten.*/
 public void zeichnen(int[][] koordinaten, Color colFarbe){
      
      Graphics grafik = this.getGraphics(); 
/*Hier ist es wie du 
gesagt hast. Aber wie kann ich sonst auf dem Canvas (die funktion 
ist eine Memberfunktion der Canvasklasse) zeichnen?*/
      Dimension d=getSize();
      int /*breite=d.width,*/ hoehe=d.height;
      
      grafik.setColor(colFarbe);      

      for(int i = 1 ; i < 99 ; i++)
      {
        if(koordinaten[i][1] <= 200) {
            if((hoehe-35-(koordinaten[i+1][1]*3)) <= hoehe-35) {
              grafik.drawLine(35+koordinaten[i][0]*2,hoehe-35-(koordinaten[i][1]*3),
                              35+koordinaten[i+1][0]*2,hoehe-35-(koordinaten[i+1][1]*3));
            }
        }
      }
    }

Hoffe, dass dir/euch das erstmal weiter hilft.

MfG Disi
 
Du musst Dir die Graphen als Objekte (z.B. in einer ArrayList) speichern. In der paint Methode arbeitest Du dann alle zu zeichnenden Graphen ab.
 
bzw. das koordinaten-Array usw. speichern und von paint aus zeichnen() aufrufen,
aber selbst dann nicht getGraphics() aufrufen, sondern das Graphics-Objekt der paint-Methode als Parameter übergeben
 
Hmm wenn ich Zeichnen aus der Paintmethode aus aufrufe, dann habe ich das Problem, dass ich ja jedes mal, wenn ich die werte änderen lasse durch den DAU, dass ich dann die Paint Methode aufrufen muss, oder?
 
richtig, wobei nicht paint direkt,
sondern immer nur
repaint();

alles neu zeichnen,
das ist jedenfalls das einfache normale Verhalten,
wenn man irgendwann Experte ist kann man auch komplizierteres versurchen
 
Hmmm nagut, dann versuche ich das mal so ...

So:

Java:
public void btnShow_ActionPerformed(ActionEvent evt) {
//[...]
    ((GrafikCanvas)cvsAnzeige).repaint();
//[...]
}

Allerdings muss ich ja jetzt irgendwie die Koordinaten noch mit übergeben und die Farbe.

Mach ich das in der Main-Classe als public, oder wie? =D
 
wichtig ist, dass die Daten am Ende in der benötigten Klasse vorhanden oder verfügbar sind,
wie sie dahinkommen ist nebensächlich,
ob die GUI-Klasse eine andere Klasse fragt oder eigene Klassenattribute hat, die von anderen vor dem repaint()-Aufruf per set-Methode gefüllt werden,
alles ist denkbar
 
Wenn man bei einem Canvas die Repaint aufruft, dann dürfte ein Konsturktor doch nicht nochmal ausgeführt werden, oder?
 
ein solcher Frevel wäre undenkbar, Konstruktoren kommen nur einmal dran
 
Wenn man bei einem Canvas die Repaint aufruft, dann dürfte ein Konsturktor doch nicht nochmal ausgeführt werden, oder?

Also ganz eindeutig sollte kein Konstruktor aufgerufen werden 😀
Generell möchte ich dir anraten, dich deutlich leichteren Themen zu widmen.
Zeichnen ist nicht grade trivial und deine Fragen lassen auf generell fehlendes Grundwissen schliessen 😉
Vielleicht nochmal weiter vorne anfangen, tutorial etc.

mfg Verjigorm
 
xD Ich habe schon 2 Jahre C++ Programmierung hinter mir, Klasse, Vererbung und Kon und Destruktoren sind mir alles ein Begriff (15 Pkt in der Schule 😛 ) Aber ich hader bei meinem Prog einfach und sucher verzweifelt den fehler und naja... dann zieht man bei einer anderen Programmiersprache halt mal unterschiedliches in Betracht ^^

Ich setz mich erst seid letzter Woche mit Java auseinander und naja... das eher unfreiwillig 😛
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben