Ecrire et dessiner dans les applets

7.1 Ecrire

    A partir d'une applet, il est possible d'afficher du texte dans la fenêtre de l'applet ou dans la console JAVA. Beaucoup d'utilisateurs des navigateurs ignorent l'existence de cette fenêtre qui est utilisée par la machine virtuelle pour envoyer ses messages aux utilisateurs. Pour l'activer dans IE, il faut aller dans le menu "Affichage" et dans Netscape, il faut aller dans "Communicator", "Outils". Pour afficher la chaîne de caractères  str dans la console, la syntaxe est : System.out.print(str) (pas de saut de ligne après) ou System.out.println(str).

 Il est possible d'utiliser la console pour le débogage des programmes.

Pour afficher du texte dans la fenêtre d'une applet, il suffit d'utiliser la méthode drawString(  ) de la classe Graphics qui fait parti du package java.awt. Cette méthode dessine la chaîne passée comme premier argument à partir du point de coordonnées (x, y). Le préfixe utilisé lors de l'appel à la méthode doit être le nom du contexte graphique (nom de l'instance de la classe Graphics en cours d'utilisation).
Les caractères de contrôle comme '\r' (CR), '\n' (NL), ... sont fonctionnels dans la console JAVA mais ne sont pas utilisables avec la méthode drawString( ) : pour afficher du texte sur plusieurs lignes, il faut découper la chaîne et préciser les coordonnées de départ de chaque sous-chaîne.
Sauf indications contraires, la couleur d'écriture est la couleur par défaut (en général le noir) et la fonte utilisée est la fonte par défaut (variable selon le navigateur utilisé). Il est toujours préférable de préciser au début de la méthode init( ) la fonte qui sera utilisée.

7.1.1  La classe Font

Avant de pouvoir utiliser une fonte, il faut créer une instance d'un objet Font et l'initialiser avec les paramètres suivants :
Le nom de la fonte : Les machines virtuelles des navigateurs possèdent en général les fontes "Helvetica" (SansSerif, Arial) "TimesRoman" (Serif) qui sont des fontes proportionnelles et la fonte "Courier" qui possède un espacement fixe.
Le style des caractères : Il existe trois constantes Font.PLAIN = 0 (normal), Font.BOLD = 1 (gras) et Font.ITALIC = 2 (italique) qui peuvent être combinées.
La taille de la fonte en points.
On trouvera dans la seconde partie de l'exemple ci-dessous comment chercher puis afficher les polices présentes dans la machine virtuelle utilisée. La méthode getFontList ( ) de la classe abstraite Toolkit retourne un tableau de chaînes de caractères contenant les noms des fontes.

7.1.2 La classe FontMetrics

    Afin de pouvoir gérer l'affichage, on dispose de la classe FontMetrics dont les méthodes retournent des informations sur les caractéristiques de la fonte en cours d'utilisation. Pour pouvoir utiliser ces méthodes, il faut commencer par créer une instance FontMetrics au moyen de la méthode getFontMetrics( ) de la classe Graphics. Le préfixe utilisé pour appeler cette méthode doit être le nom du contexte graphique en cours d'utilisation. Chaque fois que la fonte d'affichage est changée il faut bien sûr créer une nouvelle instance FontMetrics. Les méthodes les plus utiles de cette classe sont :
getHeight( ) qui retourne la hauteur totale (en pixels) de la fonte, charWidth( ) qui retourne la largeur en pixels du caractère passé en argument et enfin de stringWidth( ) qui retourne la longueur (en pixels) de la chaîne passée en argument. Cette dernière méthode permet de centrer une chaîne ou comme dans l'exemple de réaliser un affichage complexe qui mélange différentes fontes et différentes couleurs.

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

public class fontes extends Applet
{  Font font;
   String s = "Nom : fontes\r\n" + "Auteur : Rousseau\r\n" +
              "Date : 27-12-2001";
   FontMetrics fm;    int w;

  public void init()
  {   setBackground(Color.lightGray);
      font = new Font("Helvetica",0,16);}

  public void paint(Graphics g)
  { System.out.println(s);   
//affichage dans la console
    g.setColor(Color.black);
//couleur du pinceau
    g.setFont(font);        fm=g.getFontMetrics();
    s="Consultez ";         g.drawString(s,10,20);
    w=fm.stringWidth(s)+10; 
    font = new Font("TimesRoman",1,22);
    g.setFont(font);        fm=g.getFontMetrics();
    g.setColor(Color.red);
    s = "la console ";
    g.drawString(s,w,20);   w+=fm.stringWidth(s);
    font = new Font("Helvetica",2,20);
    g.setColor(Color.black);
    g.setFont(font);        g.drawString("JAVA",w,20);
    g.setColor(Color.blue);
    String polices[]=getToolkit().getFontList();
    font = new Font("TimesRoman",0,12);
    for (int i=0; i<polices.length; i++)
    {    g.setFont(font);
         g.drawString(polices[i],10,60+15*i);
         Font ftemp=new Font(polices[i],0,12);
         g.setFont(ftemp);
         g.drawString("Exemple ",150,60+15*i);}}
}
 

7.2 La classe Color

 La couleur du pinceau dans l'objet graphique g est celle de l'objet Color activé par l'instruction g.setColor( ).
JAVA utilise la synthèse additive rouge, vert, bleu. Les couleurs sont codées sur 24 bits en utilisant 8 bits pour chaque couleur fondamentale. Le nombre de couleurs possibles est donc 256*256*256 = 16777216. Le nombre de couleurs effectivement affichées dépend de la carte graphique du client.
Pour définir une couleur, on utilise le constructeur Color( R, V, B) . Les arguments sont soit des entiers (compris entre 0 et 255) soit des flottants (compris entre 0.0f et 1.0f).

Color macouleur = new Color (0, 15, 100);

La classe Color possède 12 couleurs prédéfinies :

Couleur

Nom

Rouge

Vert

Bleu

Blanc

Color.white

255

255

255

Bleu

Color.blue

0

0

255

Cyan

Color.cyan

0

255

255

Gris pâle

Color.ligthGray

192

192

192

Gris sombre

Color.darkGray

64

64

64

Gris

Color.gray

128

128

128

Magenta

Color.magenta

255

0

255

Noir

Color.black

0

0

0

Orange

Color.orange

255

200

0

Rose

Color.pink

255

175

175

Rouge

Color.red

255

0

0

Vert

Color.green

0

255

0

  

Les graphistes utilisent en général le système HSB : hue, saturation, brightness (teinte, saturation, luminosité). Les méthodes HSBtoRGB() et RGBtoHSB() permettent d'effectuer les conversion entre les deux systèmes. La méthode RGBtoHSB retourne les valeurs HSB dans un tableau de flottants passé en argument (consulter l'exemple pour la syntaxe).  Pour plus de détails sur le système HSB  consulter cette page.
L'applet suivante donne un exemple d'utilisation des objets FontMetrics , des exemples de création de couleurs en RVB et HSB et d'utilisation des méthodes de cette classe.

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

public class couleurs extends Applet
{  Font font;      FontMetrics fm;
   String s,s1 = "Ombrage";
   Color col;      int w;
   float hsb[]=new float[3];

   public void init()
   { setBackground(Color.lightGray);
     font = new Font("Helvetica",1,22);}

   public void paint(Graphics g)
   { g.setFont(font);   fm=g.getFontMetrics();
     g.setColor(Color.black);
     w=(size().width-fm.stringWidth(s1))/2;
     g.drawString(s1,w,30);
     g.setColor(Color.red);
     g.drawString(s1,w-2,28);   
//affichages décalés
     font = new Font("Helvetica",0,14);  g.setFont(font);
     for (int i=0; i<256; i++)  
//gamme des rouges
     { col = new Color(i,0,0);   g.setColor(col);
         g.drawLine(i+20,50,i+20,70);}
     for (int i=0; i<256; i++)
     { col = new Color(0,i,128); g.setColor(col);
       g.drawLine(i+20,80,i+20,100);}
     for (int i=0; i<256; i++)  
//gamme des gris
     { col = new Color(i,i,i);   g.setColor(col);
     g.drawLine(i+20,110,i+20,130);}
     col = new Color(200,100,50);   g.setColor(col);
     Color.RGBtoHSB(200,100,50,hsb);
     s="H = "+hsb[0]+"  S = "+hsb[1]+"  B = "+hsb[2];
     g.drawString(s,20,155);
     col = new Color(Color.HSBtoRGB(0.65f,0.75f,0.85f));
     int r=col.getRed();    int v=col.getGreen();
     int b=col.getBlue();
     s="R = "+r+"; V = "+v+"; B = "+b;
     g.setColor(col);     g.drawString(s,20,180);
     g.drawString(col.toString(),20,200);}
}

 7.3 Les méthodes de dessin de la classe Graphics

    La feuille de dessin est une matrice de points (pixels). Les coordonnées du coin supérieur gauche sont (0, 0). La méthode size( ) retourne la taille de la feuille . Les coordonnées du coin inférieur droit sont donc size( ).width et, size( ).height.
Attention : La méthode resize( ) ne fonctionne pas avec les applets :

 La taille de la feuille est imposée par les valeurs de width et height de la balise <Applet>

Toutes les méthodes de dessin ci-dessous fonctionnent également dans un tampon mémoire. Toutefois j'ai constaté que l'utilisation d'entiers supérieurs à 32768 provoque alors des dépassements de capacité (non signalés par la machine virtuelle !).
Lors de l'utilisation des méthodes de dessin dans un tampon, il semblerait que les entiers int sont codés sur seulement 2 octets ???

La méthode setBackground( ) permet d'imposer la couleur du fond.

drawLine( ) : Méthode utilisée pour le tracé de droites. Les 4 paramètres sont les coordonnées des extrémités de la droite.
Il n'existe pas de méthode spécifique pour allumer un seul pixel : il faut utiliser la méthode drawLine avec des coordonnées de début identiques à celles de fin.
Il n'existe pas dans les différentes versions 1.X de JAVA de méthodes pour modifier le style des traits (épaisseur, tirets, pointillés ...)

drawRect( ) utilise 4 paramètres : les deux coordonnées du coin supérieur gauche, la larguer et la hauteur du rectangle.
fillRect( ) remplit le rectangle avec la couleur actuelle du pinceau.
clearRect( ) utilise la couleur du fond pour peindre le rectangle. Pratique pour effacer une partie de la feuille.
drawRoundRect( ) et fillRoundRect( ) dessinent des rectangles aux coins arrondis : il faut ajouter deux paramètres supplémentaires pour préciser les dimensions de l'arrondi.
clipRect( ) est une méthode extrêmement puissante qui supprime les portions des tracés situées à l'extérieur du rectangle défini par la méthode.
Pour utiliser plusieurs zones de clipping, il faut terminer le dessin dans la première zone, faire un appel à getGraphics( ) pour réinitialiser le contexte graphique puis définir une nouvelle zone avec clipRect( ) et dessiner dans la nouvelle zone ...

Les cercles, ellipses, arcs peuvent s'inscrire dans un rectangle : leurs méthodes de tracé [drawOval( ) , fillOval( ), drawArc( ), fillArc( )] utilisent les coordonnées de ce rectangle comme paramètres.
Pour le tracé des arcs, il faut préciser en outre l'angle de départ de l'arc en degrés (0 correspond à trois heures, 90 à midi ...) et la longueur de l'arc (toujours en degrés). Si la longueur de l'arc est positive on suit l'arc dans le sens direct.

 Les méthodes drawPolygon( ) et fillPolygon( ) utilisent deux tableaux contenant les coordonnées des sommets du polygone et le nombre de sommets à prendre en compte. Le dernier sommet est toujours relié au premier.

Ces méthodes sont illustrées par l'exemple ci-dessous.

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

public class dessins extends Applet
{  Color col = new Color(160,160,160);
   int X[]={246,229,193,220,205,242,300,261,285,255};
   int Y[]={114,145,145,174,214,190,214,170,145,145};

  public void init()
  {  setBackground(Color.lightGray);}

  public void paint(Graphics g)
  { g.setColor(Color.blue);
    for (int i=0; i<11; i++)
       g.drawLine(10,10+12*i,10+12*i,130);
    for (int i=0; i<11; i++)
       g.drawLine(130,10+12*i,10+12*i,10);
    g.setColor(Color.black);
    g.drawRect(160,10,150,80);
    g.setColor(col);
    g.fill3DRect(180,30,40,40,true);
    g.fill3DRect(250,30,40,40,false);
    g.setColor(Color.red);
    g.drawOval(10,150,80,80);
    g.drawArc(100,150,70,80,0,-220);
    g.setColor(Color.cyan);
    g.fillOval(30,170,40,40);
    g.fillArc(110,160,60,60,30,120);
    g.setColor(Color.orange);
    g.fillRoundRect(185,110,120,120,30,30);
    g.setColor(Color.yellow);
    g.fillPolygon(X,Y,10);
    g.setColor(Color.black);
    g.drawPolygon(X,Y,10);}
}


 Retour au menu