Composant dérivé de Canvas

La classe Canvas fournit un point de départ intéressant pour créer de nouveaux composants.

Création du composant

Notre composant devra dessiner 20 carrés en choisissant au hasard position, taille et couleur. Il devra en outre réagir à l'évènement de type ActionEvent appelé "Changer".

Déclaration, champs et constructeur

Le composant étend la classe Canvas. Positions, tailles et couleurs des carrés seront stockées dans des tableaux. Un champ booléen nommé nouveau nous indiquera si ces tableaux doivent être calculés.

	import java.awt.*;
	import java.awt.event.*;

	public class LeDessin extends Canvas
	 implements ActionListener {
 
	 static int nbcarres=20;
	 //pour tracer les 20 carres
	 int x[]=new int[nbcarres];
	 int y[]=new int[nbcarres];
	 int c[]=new int[nbcarres];
	 Color col[]= new Color[nbcarres];
	 //drapeau indiquant qu'il faut tout calculer
	 boolean nouveau;
 
	 /**
	  * Constructeur
	  */
	 public LeDessin() {
	  nouveau=true;
	  setBackground(Color.white);
	 }

La méthode recalc

Nous créons une méthode nommée recalc dont le but est de remplir les tableaux de données lorsque c'est nécessaire. Cette méthode utilisera la méthode hasard(int n) qui renvoie un entier au hasard entre 0 et n.

	 int hasard(int n) {
	  return (int)Math.floor(Math.random()*n); 
	 }
 
	 public void recalc() {
	  //maximum pour coordonnées et côté
	  int maxi=Math.min(getSize().width/2,
	                    getSize().height/2);
	  for (int i=0; i<nbcarres; i++) {
	   col[i]=new Color(hasard(256),hasard(256),
	                    hasard(256));
	   //coordonnées
	   x[i]=hasard(maxi);
	   y[i]=hasard(maxi);
	   //côté
	   c[i]=hasard(maxi);
	  }
	  //indiquer que le calcul est effectué
	  nouveau=false;
	 } 

La méthode paint

Cette méthode teste le champ nouveau pour calculer les carrés si nécessaire, puis affiche les carrés.

	 public void paint(Graphics g) {
	  if (nouveau) recalc();
	  for (int i=0; i<nbcarres; i++) {
	   g.setColor(col[i]);
	   g.fillRect(x[i],y[i],c[i],c[i]);
	  }
	 }

La méthode actionPerformed

Cette méthode réagit à l'évènement de type ActionEvent nommé "Changer" en mettant le champ nouveau à false pour forcer un nouveau calcul des carrés et en appelant la méthode repaint.

	 public void actionPerformed(ActionEvent e) {
	  if (e.getActionCommand().equals("Changer")) {
	   nouveau=true;
	   repaint();
	  } 
	 }

Notre nouveau composant est près. Ses autres méthodes sont celles qu'il hérite du composant Canvas.

L'applet

Notre applet contiendra un bouton "Changer" et le composant que nous venons de créer. Il suffira d'écrire sa méthode init et d'indiquer que notre composant est l'écouteur associé au bouton.

	import java.awt.*;
	import java.awt.event.*;
	import java.applet.*;

	public class Carres extends Applet {

	 public void init() {
	  setLayout(new BorderLayout());
	  LeDessin d=new LeDessin();
	  add("Center",d);
	  Button b=new Button("Changer");
	  b.addActionListener(d);
	  add("South",b);
	 }
 
	}

Il ne reste plus qu'à écrire le fichier html associé et à tester l' applet.



Retour au menu