Les composants graphiques (1.1)

     A partir de la version 1.1, chaque composant a été doté de son propre détecteur d'événements (Listener). Le principe de détection des événements est le même que pour la souris et le clavier. Il faut importer le package java.awt.event puis pour chaque composant créer une méthode spécifique de traitement par l'ajout dans l'en-tête de l'applet de implements xxxListener, dans init ( ) de nom_composant.addxxxListener(this) et d'implémenter les méthodes de traitement des événements. S'il faut utiliser plusieurs interfaces, les clauses qui suivent "implements" doivent être séparées par des virgules.

     Pour tous les composants, il est possible de préciser, lors de la création, la fonte associée au libellé du composant [méthode setFont( )] et  la couleur du pinceau du libellé au moyen de la méthode setForeground( ).  Il est possible de cacher un composant de nom cp par la méthode cp.setVisible(false), de le réafficher avec cp.setVisible(true), de le désactiver avec cp.setEnabled(false) et enfin de le réactiver avec cp.setEnabled(true).
Ces méthodes remplacent les méthodes hide( ), show( ), disable( ) et enable( ) de la version 1.0.

Les méthodes de créations des composants et de manipulations des informations sont identiques à celles de la version 1.0

12.1 Boutons et Zones de texte

    Ces composants répondent à un événement de type action (click souris pour les boutons, touche [Entrée] pour les zones de texte). Pour traiter les événements, il faut mettre en place l'interface ActionListener, doter chaque composant cpx d'un "écouteur" avec cpx.addActionListener(this) et enfin implémenter la méthode de traitement de l'événement actionPerformed(ActionEvent evt) qui retourne les objets "ActionEvent". La nature du composant générateur de l'événement peut être récupéré avec la méthode evt.getSource( ).

L'exemple ci-dessous reprend celui du chapitre 11. Les principale modification sont indiquées en rouge dans le listing.

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

public class bouton11 extends Applet implements ActionListener
{   Font font = new Font("Helvetica",0,12);
    Font bold = new Font("Helvetica",1,12);
    boolean gras;   String s="Test";
    Label lb = new Label("ZdT :");
    Button bt1,bt2,bt3;
    TextField tf1 = new TextField(s,5);

  public void init()
  {  setBackground(Color.lightGray);
//gestionnaire par défaut
     setFont(font);
     bt1 = new Button("Gras");
//création
     bt1.setForeground(Color.red);
//couleur du label en rouge
     bt1.setFont(bold);
//fonte du label
     add(bt1);    
bt1.addActionListener(this); //this => applet
     bt2 = new Button("Normal");
     add(bt2);    bt2.addActionListener(this);
     bt3 = new Button(" Ancien ");
     add(bt3);    bt3.addActionListener(this);
     add(lb);
     add(tf1);    tf1.addActionListener(this);}

  public void actionPerformed(ActionEvent evt)//remplace la méthode action
  {  if (
evt.getSource().equals(bt1)) gras = true;
     else if (evt.getSource().equals(bt2)) gras = false;
     else if (evt.getSource()==bt3){
        if (bt3.getLabel()==" Ancien "){
          bt3.setLabel("Nouveau");
          bt1.setVisible(false);
          bt2.setEnabled(false);}
        else {
          bt3.setLabel(" Ancien ");
          bt1.setVisible(true);
          bt2.setEnabled(true);}}
    else if (evt.getSource()==tf1) s=tf1.getText();
    repaint();}

 public void paint(Graphics g)
 {  if (gras) g.setFont(bold); else g.setFont(font);
    g.drawString("Test des boutons",20,50);
    g.drawString("Zone de texte = "+s,20,75);}
}

12.2 Listes et cases à cocher

    Ces composants répondent aux événements de type sélection d'un item d'une liste ou à un click sur une case. Pour traiter les événements, il faut mettre en place l'interface ItemListener, doter chaque composant cpx d'un "écouteur" avec cpx.addItemListener(this) et enfin implémenter la méthode de traitement de l'événement itemStateChanged(ActionEvent evt) qui retourne les objets "ItemEvent". Ici encore la nature du composant générateur de l'événement peut être récupéré par la méthode evt.getSource( ). Contrairement à la version 1.0, les listes répondent aux clicks simples et doubles sur un item de la liste.

L'exemple ci-dessous reprend celui du chapitre 11. Les principale modification sont indiquées en rouge dans le listing.

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

 public class liste11 extends Applet implements ItemListener
{  Font font = new Font("Helvetica",0,12);
   Choice choix;
   List liste;
   Checkbox cb1=new Checkbox("Case 1",false);
//false => case non cochée
   int nch,nliste,ct;
   boolean ok;
   String s,s1,sel[]=new String[5];
//tableau de chaînes

public void init()
{  setBackground(Color.lightGray);
   setFont(font);
   add(cb1);       
cb1.addItemListener(this); //création de l'écouteur
   choix = new Choice();
   choix.addItem("Choix 1");       choix.addItem("Choix 2");
   choix.addItem("Choix 3");
   add(choix);  choix.addItemListener(this);
   liste = new List(3,true);
//3 lignes affichées, choix multiples
   liste.addItem("Element 1");     liste.addItem("Element 2");
   liste.addItem("Element 3");     liste.addItem("Element 4");
   liste.addItem("Element 5");
   add(liste); liste.addItemListener(this);}

public void itemStateChanged(ItemEvent evt)
{  if (
evt.getSource()==choix){
       nch=choix.getSelectedIndex();
       s=choix.getSelectedItem();
       if (nch==2) ct=0;}
   else if (evt.getSource().equals(liste))
       sel=liste.getSelectedItems();
//noter le s final
   else if (evt.getSource().equals(cb1)) ok=!ok;
   repaint();}

public void paint(Graphics g)
{  ct++;   
   g.drawString("Ct = "+ct,10,70);
   g.drawString("Choix "+(nch+1),10,90);
   g.drawString("Item : "+s,10,110);
   g.drawString("Sélection : ",120,70);
   for (int i=0; i<sel.length; i++)
      g.drawString(sel[i],150,85+15*i);
   s1 = (ok) ? "cochée" : "non cochée";
   g.drawString("Case 1 : "+s1,10,130);}
}

 

12.3 Ascenseurs

 Les barres de défilement relèvent de l'interface AdjustmentListener. La prise en compte des événements de la barre scx est réalisée par la mise en place de la méthode scx.addAdjustmentListener(this). La méthode adjustmentValueChanged(AdjustmentEvent evt) est invoquée à chaque modification de la barre de défilement. L'identité du composant générateur de l'événement peut être récupéré par la méthode evt.getSource( ). La position du curseur est connue avec la méthode getValue( ).

Dans l'exemple suivant, les ascenseurs sont placés sans utiliser de protocole de mise en page avec la méthode setBounds(int xi, int yi, int large, int haut). La comparaison avec l'exemple du chapitre 11 qui utilise des panneaux imbriqués montre tout l'intérêt de cette méthode.

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

public class ascent11 extends Applet implements AdjustmentListener
{ int v1=10,v2=20,v3=150;
//valeurs initiales
  Font font = new Font("Helvetica",0,12);
  FlowLayout fl = null;  
//pas de protocole
  Scrollbar sc1=new Scrollbar(1,v1,5,0,105);
  Scrollbar sc2=new Scrollbar(0,v2,10,0,110);
  Scrollbar sc3=new Scrollbar(0,v3,20,100,220);

public void init()
{ setBackground(Color.lightGray);
  setFont(font);
  setLayout(fl);  
  add(sc1);       sc1.setBounds(10,40,15,120);
//mise en place
  
sc1.addAdjustmentListener(this); //écouteur
  add(sc2);       sc2.setBounds(30,10,120,15);
  sc2.addAdjustmentListener(this);
  add(sc3);       sc3.setBounds(160,10,120,15);
  sc3.addAdjustmentListener(this);}

public void adjustmentValueChanged(AdjustmentEvent evt)
{ if (
evt.getSource()==sc1)
    v1=sc1.getValue();
  else if (evt.getSource()==sc2)
    v2=sc2.getValue();
 else if (evt.getSource()==sc3)
    v3=sc3.getValue();
 repaint();}

public void paint(Graphics g)
{  g.drawString("A1 = "+v1,100,60);
   g.drawString("A2 = "+v2,100,80);
   g.drawString("A3 = "+v3,100,100);}
}

 Remarque : La manipulation intensive d'un ascenseur quand le navigateur est Netscape 4.x conduit souvent à des affichages incohérents de cet ascenseur.


 Retour au menu