La classe Hashtable du package java.util permet de créer des collections d'objets associés à des noms, en quelque sorte des dictionnaire. Une même Hashtable peut contenir des objets de classe quelconque.
Parmi les constructeurs disponibles, l'un n'attend aucun paramètre, l'autre attend une taille initiale en paramètre. On construira donc un objet dic de la classe Hashtable en écrivant simplement:
Hashtable dic=new Hashtable();
ou
Hashtable dic=new Hashtable(n);
pour prévoir une capacité initiale de n.
On ajoute un objet o dans la Hashtable dic en l'associant au nom S avec l'instruction:
dic.put(S,o);
On retrouve l'objet o associé au nom S avec l'instruction:
o=dic.get(S);
Attention la méthode get renvoie des objets généraux (classe Object), il est donc souvent nécessaire d'effectuer un transtypage pour retrouver le type qui a été stocké.
Par exemple, si on crée une Hashtable contenant des entiers associés à leurs noms, on obtiendra l'entier associé à la chaîne "deux" en écrivant :
Integer I=(Integer)dic.get("deux");
Ecrivons une applet qui permet de choisir une couleur à partir d'une liste de noms.
On utilise un Canvas pour colorier, une liste de couleurs et une Hashtable qui associe les couleurs à leurs noms. On implémente l'interface ItemListener pour gérer les changements dans la liste de sélection.
import java.applet.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class Couleurs extends Applet implements ItemListener { Canvas zoneDessin=new Canvas(); List liste=new List(); Hashtable dico=new Hashtable();
La méthode init place les composants et remplit le dictionnaire et la liste.
public void init() { setLayout(new BorderLayout()); add(BorderLayout.WEST,liste); add(BorderLayout.CENTER,zoneDessin); liste.addItemListener(this); //initialisation du dictionnaire et de la liste dico.put("blanc",Color.white); liste.add("blanc"); dico.put("bleu",Color.blue); liste.add("bleu"); dico.put("cyan",Color.cyan); liste.add("cyan"); dico.put("gris",Color.gray); liste.add("gris"); dico.put("gris clair",Color.lightGray); liste.add("gris clair"); dico.put("gris foncé",Color.darkGray); liste.add("gris foncé"); dico.put("jaune",Color.yellow); liste.add("jaune"); dico.put("magenta",Color.magenta); liste.add("magenta"); dico.put("noir",Color.black); liste.add("noir"); dico.put("orange",Color.orange); liste.add("orange"); dico.put("rose",Color.pink); liste.add("rose"); dico.put("rouge",Color.red); liste.add("rouge"); dico.put("vert",Color.green); liste.add("vert"); liste.select(0); zoneDessin.setBackground(Color.white); }
La méthode lireCouleur retrouvera l'objet de type Color associé à un nom de couleur.
public Color lireCouleur(String nom) { return (Color)dico.get(nom); }
Notons le transtypage nécessaire car la méthode get renvoie par défaut une variable de type Object.
La méthode itemStateChanged exigée par l'interface ItemListener va permettre de réagir aux changements de couleurs.
public void itemStateChanged(ItemEvent e) { if (e.getStateChange()==ItemEvent.SELECTED) { Color col=lireCouleur(liste.getSelectedItem()); zoneDessin.setBackground(col); zoneDessin.repaint(); } }
Le choix d'une nouvelle couleur dans la liste correspond à l'évènement de statut SELECTED.