Applet fica piscando

Oi pessoal,

To com o seguinte problema…Tenho uma applet que é atualizada de 1 em 1 segundo, só que cada vez que ela é atualizada a tela pisca pq ele apaga e pinta de novo. Eu tentei aplicar o Double Buffer nela só que não funcionou. Será que voces sabem o que fiz de errado ou algum jeito pra parar de piscar? Valeu.

[code]import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import javax.swing.JApplet;
import javax.swing.Timer;

public class TempoReal extends JApplet implements ActionListener {

private static final long serialVersionUID = 1L;
Image campo;
// The object we will use to write with instead of the standard screen graphics 
Graphics bufferGraphics;
public void init()  
{ 

     setBackground(new Color(0,130,0)); 
     campo = createImage(600,400); 
     bufferGraphics = campo.getGraphics(); 
}


public TempoReal() {
	super();
	setSize(600,400);
	setVisible(true);	   
	final Timer timer = new Timer(1000, this);
	timer.start();  
}

public void actionPerformed(final ActionEvent e)  {
	repaint();
}

public void paint(final Graphics g) {
	
	Connection connection = null;
	Statement statement = null;
	super.paint(g);
	int comprimento = 0;
	int largura = 0;
	int col = 0;
	int linha = 0;
	int row = largura;
	String sessao="";
	final int ambiente = Integer.parseInt(getParameter("ambiente"));
	try {
		Class.forName("org.postgresql.Driver");
		} catch (ClassNotFoundException cnfe) {
		System.out.println("Error loading driver: " + cnfe);
	}
	Properties userInfo = new Properties();
   userInfo.put("user", "postgres");
   userInfo.put("password", "postgres");
   try {
	connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", userInfo);
} catch (SQLException e1) {
	// TODO Auto-generated catch block
	e1.printStackTrace();
}
	try {statement = connection.createStatement();} catch (SQLException e) {e.printStackTrace();}
    String query = "SELECT MAX(\"SESS_SEQUENCIAL\") FROM \"SISTRACK_SESSAO\"";
    ResultSet result = null;
    try {result = statement.executeQuery(query);} catch (SQLException e) {e.printStackTrace();}
    try {
		result.next();
		sessao = result.getString(1);
	} catch (SQLException e1) {
		// TODO Auto-generated catch block
		e1.printStackTrace();
	}
    
    query = "SELECT \"AMBI_LARGURA_M\",\"AMBI_COMPRIMENTO_M\" FROM \"SISTRACK_AMBIENTE\" WHERE \"AMBI_ID\"="+ambiente;
  	try {
  		result = statement.executeQuery(query);
  		result.next();
  		largura = result.getInt(1);
  		comprimento = result.getInt(2);
  	} catch (SQLException e) {e.printStackTrace();}
    bufferGraphics.clearRect(0,0,600,400);
  	//Pinta campo de verde
  	bufferGraphics.setColor(new Color(0,130,0));
    bufferGraphics.fillRect(0, 0, comprimento*5+20, largura*5+30);
    //bufferGraphics.setStroke(new BasicStroke(1.5f));
    //Desenha as linhas
    bufferGraphics.setColor(new Color(255,255,255));
    //Desenha as laterais
    bufferGraphics.drawRect(17, 17, (comprimento-3)*5, (largura-1)*5);
    //Desenha o meio campo
    bufferGraphics.drawLine((comprimento/2)*5-5,largura*5+10,(comprimento/2)*5-5,17);	    
    //Desenha as grandes áreas
    bufferGraphics.drawRect(17, ((largura-35)*5)/2, 17*5, 41*5);
    bufferGraphics.drawRect((comprimento-17)*5+2, ((largura-35)*5)/2, 17*5, 41*5);
    //Desenha as pequenas áreas
    bufferGraphics.drawRect(17, ((largura-12)*5)/2, 6*5, 18*5);
    bufferGraphics.drawRect((comprimento-6)*5+2, ((largura-12)*5)/2, 6*5, 18*5);
    //Desenha marca do penalti
    bufferGraphics.fillOval(17+(11*5), (largura*5)/2+13, 3, 3);
    bufferGraphics.fillOval(comprimento*5-(11*5), (largura*5)/2+13, 3, 3);
    //Desenha os semicírculos
    //bufferGraphics.setStroke(new BasicStroke(2.0f));
    bufferGraphics.drawArc(85, ((largura-40)*5)/2+79, 39, 70, 270, 180);
    bufferGraphics.drawArc((comprimento-17)*5-20, ((largura-39)*5)/2+79, 40, 70, 90, 180);
    //Desenha o círculo central
    bufferGraphics.drawOval((comprimento*5)/2-50, (largura*5)/2-30, 90, 90);
    bufferGraphics.drawOval((comprimento*5)/2-6, (largura*5)/2+15, 3, 3);
    //Desenha corners
    bufferGraphics.drawArc(14, 14, 10, 10, 0, -90);
    bufferGraphics.drawArc(14, largura*5+5, 10, 10, 0, 90);
    bufferGraphics.drawArc(comprimento*5-5, 14, 10, 10, 180, 90);
    bufferGraphics.drawArc(comprimento*5-5, largura*5+5, 10, 10, 180, -90);
    
    

    query = "SELECT \"TAG_NUMERO_CAMISA\", \"LOCA_COORDE_X\", \"LOCA_COORDE_Y\""+ 
    				 "FROM \"SISTRACK_LOCALIZACAO\" LOCA1, \"SISTRACK_TAG\""+
    				 "WHERE \"LOCA_TIMESTAMP\" = (SELECT MAX(\"LOCA_TIMESTAMP\") "+ 
    				 							   "FROM \"SISTRACK_LOCALIZACAO\" LOCA2 "+ 
    				 							  "WHERE LOCA2.\"LOCA_TAG_ID\" = LOCA1.\"LOCA_TAG_ID\")"+
    				   "AND \"LOCA_TAG_ID\" = \"TAG_ID\"" +
    				   "AND \"LOCA_TIMESTAMP\" BETWEEN (SELECT \"SESS_INICIO\" FROM \"SISTRACK_SESSAO\" WHERE \"SESS_SEQUENCIAL\"=1)"+

“AND (SELECT “SESS_FIM” FROM “SISTRACK_SESSAO” WHERE “SESS_SEQUENCIAL”=1)”+
“ORDER BY 2,3”;
try {result = statement.executeQuery(query);} catch (SQLException e) {e.printStackTrace();}

  bufferGraphics.setColor(new Color(255,255,255));
bufferGraphics.setFont(new Font("Sans Serif",Font.BOLD,11));
	try {
		while(result.next()){
			bufferGraphics.setColor(new Color(255,255,255));
			bufferGraphics.fillOval((result.getInt(2)-3)*5-3, (largura-result.getInt(3)-2)*5, 15, 15);
			bufferGraphics.setColor(new Color(0,0,0));
			if(result.getInt(1)<10){
				bufferGraphics.drawString(String.valueOf(result.getInt(1)), (result.getInt(2)-3)*5+2, (largura-result.getInt(3))*5+1);
			}else{
				bufferGraphics.drawString(String.valueOf(result.getInt(1)), (result.getInt(2)-3)*5-2, (largura-result.getInt(3))*5+1);	
			}
		}
	} 
	catch (SQLException e) {
		e.printStackTrace();
	}
	
	g.drawImage(campo,0,0,this);
	
}

public void update(Graphics g) 
{ 
     paint(g); 
}
public static void main(final String[] args) {
	
	final TempoReal tr = new TempoReal();
	
}

}
[/code]

Tem sim, leia a sessão de java do meu portal.
O link está na minha assinatura.

Aliás, vc tem vários problemas no seu módulo:

  1. Você está abrindo a conexão dentro do método paint. Abrir a conexão com o banco geralmente é um processo demorado. Abra uma vez só, fora do paint;
  2. Se possível, evite rodar também o SQL dentro do paint. Você não tem nada que altere os dados, então pq não tem pq fazer as consultas várias vezes;
  3. Use BufferStrategy para fazer o double buffering;

O método paint é um método sensível. Tome cuidado com o que põe lá, ou sua taxa irá abaixo do que vc quer facilmente. Todo processamento pesado deve ser feito o menor número de vezes possível, da maneira mais eficiente possível e preferencialmente fora do ciclo de pintura. Lembre-se que a interface gráfica estará completamente travada durante a chamada ao paint.