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.