C'est résolu !
Jme suis renseigné sur le double buffering, et un site indiquait que swing prend en compte automatiquement le double buffering. En gros j'ai juste importé javax.swing.*; et remplacé frame par JFrame. Voici le code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Touches extends JFrame implements KeyListener{
int hauteur = 160;
int largeur = 200;
Image image;
Image fond;
Touches(String titre){
super(titre);
addKeyListener (this);
setSize(800,600);
setVisible(true);
image = getToolkit().getImage("heros.jpg" );
fond = getToolkit().getImage("fond.jpg" );
repaint();
}
public void keyPressed(KeyEvent evt){
if (evt.getKeyCode() == KeyEvent.VK_LEFT){
largeur = largeur - 20;
}
else if (evt.getKeyCode() == KeyEvent.VK_RIGHT){
largeur = largeur + 20;
}
else if (evt.getKeyCode() == KeyEvent.VK_UP) hauteur = hauteur - 20;
else if (evt.getKeyCode() == KeyEvent.VK_DOWN) hauteur = hauteur + 20;
repaint();
}
public void keyTyped(KeyEvent evt) {}
public void keyReleased(KeyEvent evt) {}
public void paint(Graphics g){
g.drawImage(fond,0,0,this);
g.drawImage(image,largeur,hauteur,this);
}
public static void main (String[] args){
Touches fenetre = new Touches("touches" );
}
}