esperanto
interlingua
 

Un tableau d'objets Rectangle

Arrivés à cette étape, nous savons dessiner 216 rectangles de couleurs différentes, et nous savons rendre un seul rectangle cliquable, grâce à un objet Rectangle.
Dans un premier temps, nous allons instancier automatiquement plusieurs objets Rectangle, et les stocker dans un tableau. Cette manière de faire n'est pas très fine, mais elle vous aidera à comprendre la notion de tableau d'objets.
Dans les étapes suivantes, nous aurons recours à une méthode plus efficace.

Instancier automatiquement des objets

À l'étape 10, nous avons instancié un seul objet Rectangle par l'instruction :
Rectangle r = new Rectangle(10,10,20,20);
Si nous voulons rendre plusieurs rectangles cliquables, il va falloir instancier autant d'objets de cette sorte. On utilisera une structure de boucle du genre :

int abscisse = 0;
for (i=0; i<5; i++)
{
Rectangle r = new Rectangle(abscisse, 10, 10, 10);
abscisse+=12;
}

 

L'inconvénient, comme vous le voyez peut-être, c'est que ces boucles créent cinq fois le même objet Rectangle r : il faudrait donner à chaque objet un nom différent (r1, r2...), puis se référer aux attributs et méthodes de chacun des rectangles [par exemple : r1.width, r2.inside()], mais cela est impossible en utilisant ce procédé.
La solution est d'employer un tableau d'objets.

Un tableau

Un tableau permet de stocker et de retrouver commodément plusieurs variables. Nous avons dit à l'étape 5 qu'une variable était une boîte, que l'on remplit avec une valeur. Un tableau est une plus grosse boîte qui peut contenir une ou plusieurs variables.
Nous avons vu aussi que, pour qu'une variable existe, il suffit de la déclarer en indiquant son type et son nom, de cette manière :
int i;
Cette instruction donne naissance à une variable de type "entier" nommée i.

Il en va presque de même pour donner naissance à un tableau :
int [] tabi ;
Cette instruction donne naissance à un tableau de variables de type "entier" nommé tabi.

On peut aussi préciser ce qu'on appelle la longueur du tableau, c'est à dire le nombre d'éléments que contiendra le tableau :
int [] tabi = new int[5];
Cette instruction donne naissance à un tableau de variables de type "entier" nommé tabi. Ce tableau ne pourra contenir que 5 entiers.

Comment remplir un tableau ? On peut utiliser une instruction de ce genre :
tabi[4] = 25;
Cette instruction assigne au cinquième élément du tableau (celui dont l'indice est 4) la valeur 25.
Attention au piège : tabi[0] désigne le premier élément du tableau tabi !

Ce petit schéma vous aidera peut-être à visualiser ce qu'est un tableau avec ses indices :

On peut ainsi, en utilisant une boucle for(), remplir facilement un tableau. Par exemple :

int [] tabi = new int[5];
for (int i=0; i<5; i++)
{
tabi [i] = i;
}

 

Ces instructions donnent naissance à un tableau de cinq entiers : 0, 1, 2, 3, 4.

Un tableau d'objets

Nous allons appliquer ces astuces à la création d'un tableau d'objets Rectangle.

int abscisse = 0;
Rectangle [] tabRectangle = new Rectangle[5];--- déclaration d'un tableau d'objets Rectangle
for (int i=0; i<5; i++)
{
tabRectangle [i] = new Rectangle(abscisse,10,10,10);--- allocation de valeurs au tableau grâce à une boucle
abscisse+=12;
}

 

Ce code permet de créer 5 objets Rectangle, chacun avec une abscisse différente. On pourra par la suite référencer chacun de ces objets par leur indice dans le tableau : tabRectangle[0] est le premier Rectangle (son abscisse est de 0), tabRectangle[1] est le deuxième (son abscisse est de 12), et ainsi de suite.
Bien sûr, chacun de ces objets possède tous les attributs et méthodes des objets Rectangle, que l'on référence par la notation-point : par exemple tabRectangle[0].x désigne l'abscisse du coin supérieur gauche de l'objet.

Voici le code complet de l'applet, agrémentée d'une zone de texte, comme vu à l'étape précédente :

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

public class applet15 extends Applet
{
int abscisse = 0;
Rectangle [] tabRectangle = new Rectangle[5];
boolean dedans;
String t = new String("");
TextField T = new TextField(t, 5);

public void init()
{
add(T);
for (int i=0; i<5; i++)
   {
   tabRectangle [i] = new Rectangle(abscisse,30,10,10);
   abscisse+=12;
   }//for i
}//init

public void paint(Graphics g)
   {
   g.setColor(Color.black);
   for (int j=0;j<5;j++)
      {
      g.fillRect(tabRectangle[j].x,tabRectangle[j].y,tabRectangle[j].width,tabRectangle[j].height);
      }//for j
   }//paint

   public boolean mouseDown(Event evt, int x, int y)
   {
   int k;
   for (k=0; k<5;k++)
      {
      dedans =(tabRectangle[k].inside(x,y)) ? true : false;
      if (dedans)
         {
         t="Oui";
         T.setText(t);
         }
      }//for k
   return true;
   }

   public boolean mouseUp(Event evt, int x, int y)
   {
   dedans=false;
   t="";
   T.setText(t);
   return true;
   }
}

 

Et voici le résultat :
- cliquez sur l'applet, mais en dehors des rectangles ;
- cliquez sur les rectangles.

Le code prêt à l'emploi