Ayuda: Quiero Eliminar parpadeo

odeth
17 de Agosto del 2004
Este codigo pinta cuadritos y los hace avanzar he probado muchas cosas para quitar el parpadeo como el redefinir la clase update() y tambien con el image, pero no puedo hacerlo alguien puede ayudarme?

import java.awt.*;
import java.applet.Applet;
import java.util.*;

public class nuevo extends Applet implements Runnable
{

int rval;
int retardo=80;
int i1=290,i2=300,i3=310,i4=320,i5=330;
int j1=40,j2=30,j3=20,j4=10,j5=0;
int k1=290,k2=300,k3=310,k4=320,k5=330;
int l1=40,l2=30,l3=20,l4=10,l5=0;
int a[];
int b[];
int c[];
int d[];
int e[];
Thread hilo;
Image imag;
Graphics gBuffer;

public void ciudad (Graphics g )
{
g.setColor(Color.yellow);
g.fillRect(0,0,100,100);
g.fillRect(120,0,100,100);
g.fillRect(240,0,100,100);
g.fillRect(0,120,100,100);
g.fillRect(120,120,100,100);
g.fillRect(240,120,100,100);
g.fillRect(0,240,100,100);
g.fillRect(120,240,100,100);
g.fillRect(240,240,100,100);
paint(g);
}

public void semaforo(Graphics g)
{
g.setColor(Color.black);
g.fillRect(90,120,10,20);
g.fillRect(90,240,10,20);
g.fillRect(240,80,10,20);
g.fillRect(240,200,10,20);
g.fillRect(120,120,20,10);
g.fillRect(240,120,20,10);
g.fillRect(80,210,20,10);
g.fillRect(200,210,20,10);
}

public void rojo(Graphics g)
{
g.setColor(Color.red);
g.fillOval(92,120,6,6);
g.fillOval(92,240,6,6);
g.fillOval(242,80,6,6);
g.fillOval(242,200,6,6);
g.setColor(Color.green);
g.fillOval(120,122,6,6);
g.fillOval(240,122,6,6);
g.fillOval(80,212,6,6);
g.fillOval(200,212,6,6);
}

public void verde(Graphics g)
{
g.setColor(Color.green);
g.fillOval(92,130,6,6);
g.fillOval(92,250,6,6);
g.fillOval(242,90,6,6);
g.fillOval(242,210,6,6);
g.setColor(Color.red);
g.fillOval(130,122,6,6);
g.fillOval(250,122,6,6);
g.fillOval(90,212,6,6);
g.fillOval(210,212,6,6);
}

public void paint (Graphics g)
{
Date actual=new Date();
int timer;
timer=actual.getSeconds();
//ciudad (g);
g.setColor(Color.black);
a=new int[500];
b=new int[500];
c=new int[500];
d=new int[500];
e=new int[500];
a[1]=i1;a[2]=i2;a[3]=i3;a[4]=i4;a[5]=i5;
b[1]=j1;b[2]=j2;b[3]=j3;b[4]=j4;b[5]=j5;
c[1]=l1;c[2]=l2;c[3]=l3;c[4]=l4;c[5]=l5;
d[1]=k1;d[2]=k2;d[3]=k3;d[4]=k4;d[5]=k5;
for (int z=1;z<=5 ;z++ )
{
g.fillRect(228,a[z],6,6);
g.fillRect(b[z],228,6,6);
g.fillRect(108,c[z],6,6);
g.fillRect(d[z],108,6,6);
}
if (timer<=15 || timer>=30 &&timer<45)
{
semaforo(g);
verde(g);
i1--;i2--;i3--;i4--;i5--;
l1++;l2++;l3++;l4++;l5++;
}
if (timer>15 && timer<30 || timer>=45)
{
semaforo(g);
rojo(g);
k1--;k2--;k3--;k4--;k5--;
j1++;j2++;j3++;j4++;j5++;
}

}

public void start()
{
if(hilo==null)
{
hilo=new Thread(this);
hilo.start();
}
}

public void stop()
{
if(hilo!=null)
{
hilo.stop();
hilo=null;
}
}

public void run()
{
long t=System.currentTimeMillis();
while(true)
{
try
{
repaint();
t+=retardo;
Thread.sleep(Math.max(0, t-System.currentTimeMillis()));
}
catch (InterruptedException e)
{}
if (a[1]==-5) i1=335;
if (a[2]==-5) i2=335;
if (a[3]==-5) i3=335;
if (a[4]==-5) i4=335;
if (a[5]==-5) i5=335;
if (b[1]==330) j1=-5;
if (b[2]==330) j2=-5;
if (b[3]==330) j3=-5;
if (b[4]==330) j4=-5;
if (b[5]==330) j5=-5;
if (c[1]==330) l1=-5;
if (c[2]==330) l2=-5;
if (c[3]==330) l3=-5;
if (c[4]==330) l4=-5;
if (c[5]==330) l5=-5;
if (d[1]==-5) k1=335;
if (d[2]==-5) k2=335;
if (d[3]==-5) k3=335;
if (d[4]==-5) k4=335;
if (d[5]==-5) k5=335;
}
}

public void update(Graphics g) {
g.setColor(getBackground());
g.fillRect(0, 0, 600, 600);
g.setColor(getForeground());
ciudad(g);
}
}

moginn
17 de Agosto del 2004
Tienes de recurrir a la técnica del doble buffering. En vez de pintar directamente en el lienzo pintas sobre una imagen.
// Por ejemplo:
public void paint(Graphics g)
{
graficosimagen.setColor(Color.green);
graficosimagen.fillRect(0,0,100,100);
g.drawImage(imagen, 0, 0);
}

busca por internet infomación sobre esta técnica