# applet löscht den hintergrund auch mit doppelpufferung



## youssef (13. Apr 2006)

hallo leute.
wenn ich in mein Applet scrolle wird der inhalt des bildschirm durch weisses bild ersetzt und erst dann wird auf den bildschirm neu gezeichnet. und das passiert bei jedem scrollen und sieht unschön aus.


```
public void paint(Graphics g) 
{
    System.out.println("paint");	
    if(dbImage == null)
    {
    	dbImage = (BufferedImage)createImage(this.getSize().width,this.getSize().height);
    	dbGraphics = dbImage.getGraphics(); 
    }

    //Hintergrund löschen 
    //dbGraphics.setColor(getBackground()); 
    //dbGraphics.fillRect( 0, 0, this.getSize().width, this.getSize().height ); 
    //Vordergrund zeichnen 
    //dbGraphics.setColor(getForeground()); 

    offscreen_paint(dbGraphics);	
    g.drawImage(dbImage,0,0,this);
    

}
```

offscreen zeichnet den inhalt im bild.
bei scrollen spielt update keine Rolle da der Browser paint aufruft.
weiss jemand wie kann ich dieses Problem lösen


Youssef


----------



## L-ectron-X (13. Apr 2006)

Was macht denn die Methode _offscreen_paint(dbGraphics)_?
Irgendwie sieht dein DoubleBuffering-Code auch etwas komisch aus.
Hier noch mal ein Beispiel: http://www.java-forum.org/de/viewtopic.php?p=182774#182774


----------



## youssef (13. Apr 2006)

danke für die schnelle Antwort:
offscreen_paint zeichnet  im Bild. sie ist risieg gross deswegen poste ich nur ein teil davon


```
public void offscreen_paint(Graphics g) 
  {
    	
    int     []     col;

    int x,y;
    height         = getSize().height;

       col = Lut_Nt.getLutNt(13);
     g.setColor( new Color(col[0],col[1],col[2]));
    (new rectangle()).recf(g, 0,0, 1024,768);
    /*** ZEICHE BFRECT EVENT ***/;
    int ii = 1;
    while(ii<=bfrectbild_TRNSPORT.getMax_bfr())
      {
       bfr = bfrectbild_TRNSPORT.getBfrect(ii++);
       int x1 = bfr.getX1();
       int x2 = bfr.getX2();
       int y1 = bfr.getY1();
       int y2 = bfr.getY2();
       int bfcol = bfr.getBfcol();
       if(bfcol >= 0)
         {
       col = Lut_Nt.getLutNt(bfcol);
     g.setColor( new Color(col[0],col[1],col[2]));
          if(bfr.getBfpara() == 1)
            {
              int style = bfr.getStyle();
              switch(style)
              {
                  case 1:
 	                      (new Rect3D()).rect_vertieft(g,x1,height - y1,x2,height-y2);
 	                       break;
                  case 2:
 		                     (new Rect3D()).rect_erhoeht(g,x1,height - y1,x2,height-y2);
                         break;
                  default:
                         (new rectangle()).recf(g,x1,height - y1,x2,height-y2);
               }
            }
          else
            (new rectangle()).rec(g,x1,height - y1,x2,height-y2);
         }
      }
    drawA.a_set(1,a1,a2);
       col = Lut_Nt.getLutNt(15);
     g.setColor( new Color(col[0],col[1],col[2]));
    drawA.a_set(1,a1,a2);
    drawA.a_drmode(0);
    drawA.a_format(1.000000,0.000000,1);
    drawA.a_str(g,"TRANSPORT",31,511,height);
    drawA.a_set(1,a1,a2);
       col = Lut_Nt.getLutNt(8);
     g.setColor( new Color(col[0],col[1],col[2]));
    drawA.a_set(1,a1,a2);
    drawA.a_drmode(0);
    drawA.a_format(1.000000,0.000000,1);
    drawA.a_str(g,"FRÄSEN",31,482,height);
    drawA.a_set(1,a1,a2);
.....
....

}


public void update( Graphics g ) {
          //dbImage = (BufferedImage)createImage(this.getSize().width,this.getSize().height);
          //dbGraphics = dbImage.getGraphics(); 
          //paint(dbGraphics) ;
          paint(g) ;
          //g.drawImage(dbImage,0,0,this);
          System.out.println("update");
   }
```
.


ich habe am anfang das doppelbuffering  in der funktion  update implementiert aber  das Bild hat immer  geflackert wenn ich in den browser scrolle. das lag daran dass das scrollen direkt paint() aufruft und nicht über update. deswegen habe ich versucht das doppelbuffering  in paint() einzupacken . paint wird  auf jedenfall augerufen wenn rapaint von Programm aufgrufen wurde oder wenn paint automatisch von Browser aufgerufen wurde nach scrollen oder minimizieren. 
mein Problem ist jetzt nach dem Scrollen sieht man kurz einen weissen bild (alles weiss) und erst dann das Bild.
ich hoffe du kannst jetzt mein Problem verstehen.
du kannst das Applet jetzt sehen unter http://192.168.0.115:8080/provikon-web mit user/password: (provikon/provikon)
danke


----------



## L-ectron-X (13. Apr 2006)

Die Reaktion auf repaint() ist der Aufruf der update()-Methode, die dann schließlich paint() aufruft.
Ein paint()-Aufruf in der update()-Methode ist daher nicht nötig. Zieh dir ruhig mal mein Beispiel rein.
Von daher ist deine Doppelpufferung verkehrt gebaut. Bei richtigem Code kannst du scrollen, wie du willst, da flackert nichts mehr.


> http://192.168.0.115:8080/provikon-web


Das ist ne Ressource an einer lokalen IP. Ich habe da nix...  :wink:


----------

