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
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);}
}
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);}
}
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