import java.awt.*;
import java.awt.image.*;

public class DoubleBufferingHardware extends Frame{
   // boucle d'affichage
   RenderingThread renderingThread = new RenderingThread(); 
   // variable permettant d'utiliser la mémoire VRAM
   BufferStrategy strategy; 
   // buffer mémoire où les images et les textes sont appliqués
   Graphics buffer; 
   int x = 0; // coordonnée x de l'affichage du texte

   public DoubleBufferingHardware(){
      setSize( 400, 400 );
      setVisible( true );
   
      // inhibe la méthode courante d'affichage du composant 
      setIgnoreRepaint( true );  
   
      // on créé 2 buffers dans la VRAM donc c'est du double-buffering
      createBufferStrategy( 2 ); 
   
      // récupère les buffers graphiques dans la mémoire VRAM
      strategy = getBufferStrategy(); 
      buffer = strategy.getDrawGraphics();
      renderingThread.start();  
   }

   public void graphicalRender(){
      buffer.setColor( Color.black ); 
      buffer.fillRect( 0, 0, 400, 400 ); 
      buffer.setColor( Color.white ); 
      buffer.drawString( "affichage d'une ligne de texte", x, 200 );
      x++; 
      if ( x > 400 ) x = 0; 
      //on envoie toutes les données du buffer mémoire vers le buffer d'affichage (équivalent d'un flush en C/C++)
      strategy.show(); 
   }

   class RenderingThread extends Thread{
   	  /**
   	   *  Ce thread appelle le rafraichissement de notre fenêtre 
   	   *  toutes les 10 milli-secondes
   	   */
      public void run(){
         while( true ){
            try {
                // on appelle notre propre méthode de rafraichissement
               graphicalRender();
               sleep( 5 );
            } catch ( Exception e ) {} 
         }
      }
   }   
   public static void main(String[] args){new DoubleBufferingHardware();}
}