Lorsqu'on construit un objet de la classe Image en utilisant la méthode getImage, le téléchargement du fichier image se fait en tâche de fond. L'objet obtenu n'est donc pas immédiatement opérationnel. La classe MediaTracker fournit les méthodes nécessaires pour savoir quand le téléchargement est effectivement terminé.
Le constructeur de la classe MediaTracker est MediaTracker(Component). On construit donc un objet MediaTracker trak en écrivant :
trak=new MediaTracker(this);
this représente le composant qui affiche l'image.
L'utilisation de cet objet se fait en deux temps :
Ceci donne :
trak.addImage(img,0); try { trak.waitForId(0); } catch (InterruptedException e) {}
Construisons une applet qui utilisera une image pour dessiner le fond. L'image sera affichée autant de fois que nécessaire pour remplir tout l'espace disponible.
Nous utiliserons 3 variables qui contiendont l'image, sa largeur et sa hauteur.
import java.applet.*; import java.awt.*; import java.awt.event.*; public class fond extends Applet { Image img; int largeurImage; int hauteurImage;
Le nom du fichier image est passé en paramètres. Nous le récupérons dans la méthode init, puis nous créons l'objet img avec la méthode getImage et nous attendons la fin du téléchargement avec un MediaTracker. Nous lisons alors la largeur et la hauteur de l'image grâce aux méthodes getWidth et getHeight de la classe Image.
public void init() { String S=getParameter("fond"); if (S!=null) { MediaTracker m=new MediaTracker(this); img=getImage(getCodeBase(),S); m.addImage(img,0); try { m.waitForID(0); } catch (InterruptedException e) {} largeurImage=img.getWidth(this); hauteurImage=img.getHeight(this); } }
Le dessin se fait dans la méthode paint. Nous utiliserons une méthode auxiliaire nommée ligne pour afficher l'image autant de fois que nécessaire sur la largeur.
public void ligne(Graphics g, int y) { int x=0; while (x<getSize().width) { g.drawImage(img,x,y,this); x=x+largeurImage; } } public void paint(Graphics g) { if (img!=null) { int y=0; while (y<getSize().height) { ligne(g,y); y=y+hauteurImage; } } }