Nous allons créer l'applet DefilText qui fait défiler un texte passé en paramètre dans le fichier html.
Nous utiliserons le double buffering pour obtenir un affichage sans clignotements.
Commençons par déclarer les variables dont nous aurons besoin pour travailler.
import java.awt.event.*; import java.awt.*; import java.applet.*; public class DefilText extends Applet implements Runnable { String msg=null; // message affiché Thread processus = null; // le processus int x_coord=0; // coordonnées d'affichage int y_coord=0; int len=0; // longueur du message int speed=20; // temps de pause //pour le double buffering Image img=null; // image en mémoire Graphics gi=null; // contexte graphique pour l'image
Nous nous contenterons de récupérer le texte à afficher et de définir les couleurs utilisées.
public void init() { msg=getParameter("text"); if (msg==null) msg="Texte défilant"; setFont(new Font("TimesRoman",Font.BOLD,36)); setBackground(Color.white); setForeground(Color.red); }
Nous reprenons le modèle vu dans l'activité précédente. La méthode run fera appel à la méthode faireImage que nous écrirons ensuite.
public void start() { if (processus==null) { processus=new Thread(this); processus.start(); } } public void stop() { if (processus!=null) processus.stop(); processus=null; } public void run() { while (processus!=null) { faireImage(); repaint(); x_coord--; if (x_coord<=-len) x_coord=getSize().width; try { processus.sleep(speed); } catch (InterruptedException e){} } processus=null; }
L'instruction x_coord-- provoque le défilement en modifiant l'abscisse de la position d'affichage.
La ligne if (x_coord<=-len) x_coord=getSize().width; permet de reprendre l'affichage à son départ après un passage complet.
Au premier appel cette méthode initialise l'image et les différentes variables concernant la position du texte. Elle remplit ensuite l'image avec la couleur de fond et affiche le texte avec la couleur d'affichage.
public void faireImage() { if (len==0) { //calcul des mesures du texte img=createImage(getSize().width, getSize().height); gi=img.getGraphics(); FontMetrics fm=gi.getFontMetrics(); len=fm.stringWidth(msg); x_coord=getSize().width; y_coord=(getSize().height-fm.getHeight())/2+fm.getAscent(); } gi.setColor(getBackground()); gi.fillRect(0,0,getSize().width,getSize().height); gi.setColor(getForeground()); gi.drawString(msg,x_coord,y_coord); }
La méthode paint se contente d'afficher l'image. La méthode update est réécrite pour éviter l'effacement de l'applet qui provoque un scintillement.
public void paint(Graphics g) { if (img!=null) g.drawImage(img,0,0,this); } public void update(Graphics g) { paint(g); }