esperanto
interlingua
 

Rendre un rectangle cliquable

Nous allons d'abord dessiner un seul rectangle. Lorsque l'on cliquera sur ce rectangle, un texte sera affiché en-dessous.

Le principe

Nous avons vu comment dessiner une forme rectangulaire [g.fillRect()] et comment utiliser les clics de souris sur la zone de l'applet. La seule chose qui nous manque, c'est de bien contrôler si les clics se produisent sur l'aire du rectangle dessiné.
Une solution à ce problème est d'instancier un objet Rectangle (tout à fait distinct de la forme rectangulaire dessinée par g.fillRect() !) dont les propriétés "spatiales" (abscisse, ordonnée, largeur, hauteur) correspondront à la forme rectangulaire que nous dessinerons. Cet objet nous dira ensuite s'il a reçu un clic de souris.

La classe Rectangle

Dans l'applet ci-dessous, nous utilisons l'instruction suivante :
Rectangle r = new Rectangle(10,10,20,20);

Cette instruction nécessiterait de longs développements, car elle est typique d'un langage orienté objet comme l'est java. Pour rester bref, et probablement obscur, nous dirons ceci :
- Rectangle est une classe prédéfinie du langage java : c'est une structure qui permet de construire des objets (des rectangles) dont les propriétés (les attributs) sont connues, car décrites dans la documentation de java. L'instruction Rectangle r = new Rectangle(10,10,20,20); permet d'instancier un objet de la classe Rectangle, ici nommé r ;
- tout objet de la classe Rectangle a par exemple les propriétés (les attributs) width (largeur du rectangle), height (hauteur du rectangle), x (abscisse du coin supérieur gauche du rectangle) et y (ordonnée du coin supérieur gauche du rectangle) que nous utilisons dans l'applet ;
- de plus, la classe Rectangle propose des instructions, ou fonctions (des méthodes) permettant d'agir avec les rectangles. L'une de ces instructions est la méthode inside() qui permet de savoir si un point se trouve à l'intérieur d'un rectangle. [Attention : cette méthode est devenue obsolète dès la version 1.1 de java.]

Voici le code de l'applet :

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

public class applet12 extends Applet
{
Rectangle r = new Rectangle(10,10,20,20);--- un objet définissant une zone rectangulaire
boolean dedans;

public void paint(Graphics g)
   {
   g.setColor(Color.black);
   g.fillRect(r.x,r.y,r.width,r.height);--- utilisation des attributs de l'objet Rectangle r       if (dedans)
      {
      g.setColor(Color.black);
      g.drawString("Oui", 10, 50);
      }//if
   }//paint

   public boolean mouseDown(Event evt, int x, int y)
   {
   dedans =(r.inside(x,y)) ? true : false;--- test : a-t-on cliqué dans l'objet r ?    repaint();
   return true;
   }

   public boolean mouseUp(Event evt, int x, int y)
   {
   dedans=false;
   repaint();
   return true;
   }
}

 

Et voici le résultat :
- cliquez sur l'applet, mais en dehors du rectangle ;
- cliquez sur le rectangle.

Le code prêt à l'emploi

Quelques éclaircissements

Rectangle(10,10,20,20)
La méthode Rectangle() permet de construire un objet de la classe Rectangle. Les 4 arguments demandés en paramètres (entre parenthèses) sont des entiers indiquant, dans cet ordre, les valeurs des attributs x, y, width et height de la zone rectangulaire ainsi instanciée. La documentation du langage java présente les choses ainsi : Rectangle(int x, int y, int width, int height), puis donne la signification des attributs x, y, width et height.
g.fillRect(r.x,r.y,r.width,r.height)
La méthode fillRect() demande elle aussi 4 arguments (voir étape 3). Ici, nous lui passons les valeurs des attributs de l'objet r que nous avons instancié plus haut. Pour se référer à ces valeurs, nous utilisons la notation-point : objet + point + attribut (r.width).
dedans =(r.inside(x,y)) ? true : false;
? : est un opérateur ternaire conditionnel.
Il permet d'abord de faire un test sur une proposition : (r.inside(x,y)) est-il vrai ?
Si la proposition est vraie, la premère valeur, celle qui précède les : , est affectée à la variable, ici nommée dedans.
Si la proposition est fausse, c'est la deuxième valeur, celle qui suit les : , qui est affectée à la variable, ici nommée dedans.
Autrement dit :
valeur_finale = test ? A : B; signifie :
• si test est vrai, valeur_finale prend la valeur A;
• si test est faux, valeur_finale prend la valeur B;