|
La gestion de l'interface utilisateur |
La gestion
événementielle
La classe Graphics : tout pour
dessiner
Les polices de caractères
La couleur
Les classes manipulant des
dimensions
La création de nouveaux
composants
Maintenant que vous avez vu comment créer et disposer un ensemble de composants à l'écran, il reste à aborder comment gérer l'interactivité de ces composants avec votre programme pour que vous puissiez réagir aux actions d'un utilisateur, quand il utilise tel ou tel composant.
Les événements
La classe Component déclare tout un ensemble de méthodes qui permettent de réagir aux différents événements que peut recevoir un composant. Dans les différents exemples déjà cités, l'une de ces méthodes, action () a été souvent outrepassée pour traiter les actions d'un utilisateur sur un composant, mais en fait il existe tout un ensemble de méthodes traitant chacune des événements qui peuvent survenir lors de l'utilisation de l'ordinateur. On regroupe sous le terme générique événement tout type d'entrée qu'un programme peut s'attendre à recevoir.
Les événements peuvent se regrouper en plusieurs catégories :
- Les événements provoqués par un périphérique de l'ordinateur : Entrée clavier (Enfoncement-relâchement d'une touche du clavier) et entrée souris (Enfoncement-relâchement d'un bouton de la souris et déplacement du pointeur de la souris).
- Les événements déclenchés par le gestionnaire de fenêtre du système, suite à un enchaînement d'actions de l'utilisateur sur une fenêtre (changement de taille d'une fenêtre, obtention du focus dans une fenêtre,...) ou un composant (clic sur un bouton, choix dans une liste,...).
Avant l'avènement des systèmes utilisant une interface graphique, les programmes attendaient que l'utilisateur appuie sur une touche de clavier pour effectuer telle ou telle action suivant la touche enfoncée. Similairement, un programme utilisant les fonctionnalités d'une interface graphique utilise une boucle pour attendre un événement quelconque qui permettra de déclencher telle ou telle action d'un programme.
Quand un programme Java reçoit un événement, il exécute toujours le même scénario qu'il faut bien comprendre pour programmer correctement. La Machine Virtuelle Java utilise l'arbre des composants que vous avez créé (comme celui de l'applet TraitementTexte du chapitre précédent) pour déterminer les différents composants auxquels peut se destiner un nouvel événement. Quand un événement est reçu par un composant comp d'un programme Java, la méthode handleEvent () de la classe Component est appelée par la Machine Virtuelle Java. handleEvent () renvoie false par défaut ce qui provoque l'appel de la méthode handleEvent () du composant parent du composant comp, ainsi de suite jusqu'à ce que le composant n'est pas de parent. Si la classe d'un des composants sur lequel handleEvent () est invoqué outrepasse cette méthode, c'est cette méthode qui sera appelée, ce qui vous permet de modifier le comportement par défaut d'un composant qui dérive de Component. Quand vous outrepassez cette méthode, vous pouvez terminer votre méthode de trois manières suivant ce que vous voulez faire :
- return true; généralement utilisé après le traitement d'un événement pour indiquer que vous avez pris en compte l'événement et que vous ne voulez pas que le système continue à envoyer l'événement au parent du composant (par exemple, si vous avez traité un événement WINDOW_DESTROY envoyé quand l'utilisateur veut fermer une fenêtre indépendante). Dans ce cas, la méthode handleEvent () du parent du composant n'est pas appelée.
- return false; dans ce cas, la méthode handleEvent () du parent du composant est appelée.
- return super.handleEvent (event); dans ce cas, la méthode handleEvent () de la classe dont hérite le composant est appelée.
L'enchaînement des appels aux méthodes handleEvent () sur chacun des parents d'un composant est très pratique car il évite de traiter les événements au niveau de chacun des composants où ils surviennent. Vous pouvez ainsi traiter le clic d'un bouton dans la classe de son container, ce qui évite de créer une nouvelle classe pour ce bouton.
Pour vous le montrer, voici une applet simple qui affiche l'heure courante dans un label quand vous cliquez sur le bouton Mise à l'heure :Cette applet peut être réalisée de deux manières différentes comme suit (à copier dans un fichier dénommé MiseAJourHorloge.java et invoqué à partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; import java.util.Date; public class MiseAJourHorloge extends Applet { private Label heure = new Label ( new Date ().toLocaleString ()); private Button miseAHeure = new BoutonMiseAJour ("Mise \u00e0 l'heure", heure); public void init () { // Ajout des deux composants add (miseAHeure); add (heure); } } class BoutonMiseAJour extends Button { private Label heure; // Constructeur public BoutonMiseAJour (String label, Label heure) { super (label); this.heure = heure; } // Méthode appelée par la Machine // Virtuelle quand un événement survient public boolean handleEvent (Event event) { // Si l'événement est un clic sur le // bouton, mise à jour de l'horloge if (event.id == Event.ACTION_EVENT) { heure.setText ( new Date ().toLocaleString ()); return true; } return super.handleEvent (event); } } import java.applet.Applet; import java.awt.*; import java.util.Date; public class MiseAJourHorloge extends Applet { private Label heure = new Label ( new Date ().toLocaleString ()); private Button miseAHeure = new Button ("Mise \u00e0 l'heure"); public void init () { // Ajout des deux composants add (miseAHeure); add (heure); } // Méthode appelée par la Machine // Virtuelle quand un événement survient public boolean handleEvent (Event event) { // Si l'événement est un clic sur le // bouton, mise à jour de l'horloge if ( event.target == miseAHeure && event.id == Event.ACTION_EVENT) { heure.setText ( new Date ().toLocaleString ()); return true; } return super.handleEvent (event); } }
La première méthode respecte plus le style de programmation orientée objet : on y modifie le comportement par défaut d'un bouton en créant une nouvelle classe dérivée de Button. La seconde méthode est plus pratique : on modifie le comportement du container qui a créé tous les composants en lui indiquant comment gérer ses composants.
Un container contenant généralement plusieurs composants qui interagissent entre eux (comme l'applet TraitementTexte), on utilise plus souvent le second style de programmation en décrivant dans une seule méthode le traitement des événements que reçoivent les différents composants gérés par le container.Pour faciliter la clarté du traitement de certains types d'événements, la méthode handleEvent () de la classe Component appelle certaines méthodes suivant le type d'événement reçu. Ces méthodes, comme la méthode action (), peuvent être outrepassées dans vos classes à la place (ou en plus) de la méthode handleEvent (). Elles doivent toutes renvoyer une valeur booléenne indiquant comme pour handleEvent () si l'événement doit être renvoyé au parent du composant (return false;) ou non (return true;). En voici la liste :
EVENEMENT METHODE DESCRIPTION Event.MOUSE_ENTER
public boolean mouseEnter (Event evt, int x, int y)
Méthode appelée quand le pointeur de la souris entre dans un composant (utilisé par exemple pour changer l'aspect du pointeur).
Event.MOUSE_EXIT
public boolean mouseExit (Event evt, int x, int y)
Méthode appelée quand le pointeur de la souris sort d'un composant.
Event.MOUSE_DOWN
public boolean mouseDown (Event evt, int x, int y)
Méthode appelée le bouton de la souris est enfoncé.
Event.MOUSE_UP
public boolean mouseUp (Event evt, int x, int y)
Méthode appelée le bouton de la souris est relâché.
Event.MOUSE_MOVE
public boolean mouseMove (Event evt, int x, int y)
Méthode appelée quand le pointeur de la souris est déplacé.
Event.MOUSE_DRAG
public boolean mouseDrag (Event evt, int x, int y)
Méthode appelée quand le pointeur de la souris est déplacé, avec le bouton de la souris enfoncé.
Event.KEY_PRESS
Event.KEY_ACTIONpublic boolean keyDown (Event evt, int key)
Méthode appelée quand une touche du clavier est enfoncée.
Event.KEY_RELEASE
Event.KEY_ACTION_RELEASEpublic boolean keyUp (Event evt, int key)
Méthode appelée quand une touche du clavier est relâchée.
Event.GOT_FOCUS
Méthode appelée quand un composant obtient le focus. Un composant qui a le focus est celui qui reçoit les entrées du clavier.
Event.LOST_FOCUS
Méthode appelée quand un composant perd le focus.
Event.ACTION_EVENT
Méthode appelée quand l'utilisateur effectue une action dans un composant : Suivant la classe du composant, ceci peut prendre un sens différent.
Nota : La liste de tous les événements reconnus en Java est donnée dans la classe Event décrite ci-après.
Pour les événements MOUSE_..., x et y représentent les coordonnées du pointeur de la souris relatives au repère du composant où vous recevez l'événement.
Pour les événements KEY_..., key représente le code UNICODE de la touche enfoncée ou l'une des valeurs Event.HOME à Event.F12 pour les touches spéciales du clavier.
Pour l'événement ACTION_EVENT, arg peut prendre une valeur différente suivant la classe du composant où est survenu l'événement :
- Pour les composants de classe Button, l'événement ACTION_EVENT est envoyé quand l'utilisateur clique sur un bouton. arg est alors égal au label du bouton (de classe String).
- Pour les composants de classe Checkbox (que ce soit une boite à cocher ou un bouton radio) l'événement ACTION_EVENT est envoyé quand l'utilisateur clique sur le composant. arg est alors égal à l'état (coché ou non) de ce composant (arg de classe Boolean).
- Pour les composants de classe Choice, l'événement ACTION_EVENT est envoyé quand l'utilisateur choisit un élément de la liste. arg est alors égal à la valeur de ce choix (de classe String).
- Pour les composants de classe List, l'événement ACTION_EVENT est envoyé quand l'utilisateur a double-cliqué sur un élément de la liste. arg est alors égal à la valeur de cet élément (de classe String).
- Pour les composants de classe TextField, l'événement ACTION_EVENT est envoyé quand l'utilisateur a appuyé sur return dans le champ de saisie. arg est alors égal à la chaîne saisie (de classe String).
- Pour les composants de classe MenuItem, l'événement ACTION_EVENT est envoyé quand l'utilisateur choisit un élément de menu. arg est alors égal au label de cet élément de menu (de classe String).
- Pour les composants de classe CheckboxMenuItem, deux événements ACTION_EVENT sont envoyés quand l'utilisateur coche ou décoche un élément de menu. arg du premier événement est égal au label de cet élément de menu (de classe String) et arg du second événement est égal à l'état (coché ou non) de de cet élément (arg de classe Boolean)
Finalement, l'applet MiseAJourHorloge peut être programmée comme ceci :
import java.applet.Applet; import java.awt.*; import java.util.Date; public class MiseAJourHorloge extends Applet { private Label heure = new Label (new Date ().toLocaleString ()); private Button miseAHeure = new Button ("Mise \u00e0 l'heure"); public void init () { // Ajout des deux composants add (miseAHeure); add (heure); } // Méthode appelée par la machine virtuelle à la suite d'une action public boolean action (Event event, Object arg) { // Si l'événement est un clic sur le bouton, mise à jour de l'horloge if ("Mise \u00e0 l'heure".equals (arg)) heure.setText (new Date ().toLocaleString ()); return true; } }
Si vous outrepassez handleEvent () ET une des méthodes précédentes dans la même classe, n'oubliez pas l'appel super.handleEvent (event); pour les événements que vous ne traitez pas dans handleEvent (). Sinon ces méthodes ne seront pas appelées.
Les applets DrawIt et PaperBoardClient sont des exemples d'utilisation des méthodes mouseDown (), mouseDrag () et mouseUp ().
L'applet PaperBoardClient est un exemple d'utilisation des méthodes mouseDown (), mouseUp (), mouseEnter () et mouseExit ().
L'applet EchoClient est un exemple d'utilisation de la méthode keyDown ().La classe java.awt.Event
La classe Event est la classe qui regroupe tous les événements qui peuvent survenir dans un programme. Les méthodes de gestion événementielle (handleEvent () ou autre) que vous outrepassez dans vos classes reçoivent un événement de cette classe créé par la Machine Virtuelle Java.
Vous pouvez aussi créer vous-même des événements que vous envoyez à un composant par la méthode postEvent () de la classe Component. Le principal avantage d'envoyer un événement à un composant de classe Comp1 à partir d'une autre classe CompEmetteur plutôt que d'appeler une méthode que vous créez dans la classe Comp1, est que vous rendez indépendantes ces deux classes l'une de l'autre.Contrairement à la plupart des classes de la librairie Java, les champs de la classe Event sont public, et vous pouvez consulter directement les caractéristiques d'un événement par ces champs.
Champs
public Object targetDésigne l'objet cible de l'événement (généralement le composant où est survenu l'événement).
public long whenReprésente le moment où est survenu l'événement.
public int idCaractérise le type d'événement qui est survenu (égal aux valeurs WINDOW_DESTROY à LOST_FOCUS décrites ci-après).
public int x public int yPour les événements souris, x et y sont les coordonnées du pointeur de la souris. Ces coordonnées sont relatives au repère du composant où vous consultez l'événement.
public int keyPour les événements clavier, key représente le code UNICODE de la touche enfoncée ou l'une des valeurs HOME à F12 décrites ci-après pour les touches spéciales du clavier.
public int modifiersReprésente la combinaison des valeurs SHIFT_MASK à ALT_MASK, représentant l'état enfoncé ou non des touches Shift, Control, Meta et Alt. Si par exemple les touches Shift et Control sont enfoncées modifiers sera égal à SHIFT_MASK | CTRL_MASK.
public int clickCountPour les événements MOUSE_DOWN, représente le nombre de clics consécutifs (égal à 2 pour un double clic,...).
public Object argarg peut prendre n'importe quelle valeur. Il est utilisé comme argument utilisateur pour fournir éventuellement des renseignements supplémentaires au composant récepteur de l'événement courant. Par exemple, l'événement ACTION_EVENT émis par la plupart des composants Java l'utilise pour communiquer le label du composant.
public Event evtDésigne l'événement suivant quand les événements sont mis dans une liste chaînée.
public final static int SHIFT_MASK public final static int CTRL_MASK public final static int ALT_MASKCes constantes représentent la combinaison de l'état enfoncé ou non des touches Shift (Majuscule), Control et Alt.
public final static int META_MASKCette constante représente la combinaison de l'état enfoncé ou non de la touche Pomme sous Mac OS ou du bouton droit de la souris sur les autres systèmes.
public final static int HOME public final static int END public final static int PGUP public final static int PGDN public final static int UP public final static int DOWN public final static int LEFT public final static int RIGHT public final static int F1 public final static int F2 public final static int F3 public final static int F4 public final static int F5 public final static int F6 public final static int F7 public final static int F8 public final static int F9 public final static int F10 public final static int F11 public final static int F12Ces constantes représentent les touches spéciales du clavier.
public final static int WINDOW_DESTROY public final static int WINDOW_EXPOSE public final static int WINDOW_ICONIFY public final static int WINDOW_DEICONIFY public final static int WINDOW_MOVED public final static int KEY_PRESS public final static int KEY_RELEASE public final static int KEY_ACTION public final static int KEY_ACTION_RELEASE public final static int MOUSE_DOWN public final static int MOUSE_UP public final static int MOUSE_MOVE public final static int MOUSE_ENTER public final static int MOUSE_EXIT public final static int MOUSE_DRAG public final static int SCROLL_LINE_UP public final static int SCROLL_LINE_DOWN public final static int SCROLL_PAGE_UP public final static int SCROLL_PAGE_DOWN public final static int SCROLL_ABSOLUTE public final static int LIST_SELECT public final static int LIST_DESELECT public final static int ACTION_EVENT public final static int LOAD_FILE public final static int SAVE_FILE public final static int GOT_FOCUS public final static int LOST_FOCUSCes constantes représentent tous les événements qui peuvent survenir dans un programme Java. Pour certains de ces événements, la méthode handleEvent () de la classe Component appelle des méthodes que vous pouvez outrepasser.
Constructeurs
public Event (Object target, long when, int id, int x, int y, int key, int modifiers, Object arg) public Event (Object target, long when, int id, int x, int y, int key, int modifiers) public Event (Object target, int id, Object arg)Ces constructeurs permettent de créer un événement. Les paramètres correspondent aux champs de la classe Event.
Méthodes
public void translate (int x, int y)Effectue une translation de (x,y) sur les coordonnées de l'événement.
public boolean shiftDown () public boolean controlDown () public boolean metaDown ()Ces méthodes permettent de savoir si lors d'un événement les touches Shift, Control et Meta sont enfoncées (true) ou non.
protected String paramString () public String toString ()Ces méthodes sont utilisées pour fabriquer une chaîne de caractères décrivant le composant (toString () outrepasse la méthode de la classe Object et appelle la méthode paramString ()).
Pour essayer le traitement des événements, vous pouvez par exemple améliorer l'applet du piano du chapitre sur les applets, en ajoutant des raccourcis clavier aux différentes notes (ceci vous permettra de tester le mixage des sons en jouant des accords).
A partir de la version de Java 1.1 un traitement des événements différents de Java 1.0 a été mis en place. Ce sujet sera traité dans une version ultérieure de ce manuel.
Exemples
Applets Piano, PaperBoardClient, TraitementTexte, BorderBuilder, MiseAJourHorloge , ListePolices, Nuancier et BoutonsNavigation. Voir aussi ci-dessus.
La classe java.awt.Graphics
La classe Graphics qui est abstract représente un contexte graphique et regroupe toutes les méthodes permettant de dessiner (ligne, rectangle, arc de cercle, polygone, texte et image), quelque soit le support final (écran, imprimante, image en mémoire). Il n'est pas possible de créer directement d'objet de cette classe grâce à l'opérateur new, mais vous pouvez récupérer une instance de cette classe en paramètre des méthodes paint () et update () ou par la méthode getGraphics () de la classe Component.
Constructeur
protected Graphics ()Méthodes
public abstract Graphics create ()Crée une copie d'un contexte graphique.
public Graphics create (int x, int y, int width, int height)Crée une copie d'un contexte graphique, en effectuant en plus une translation (x,y) sur le repère courant et en créant une zone de clipping de largeur width et hauteur height. Seuls les dessins effectués à l'intérieur de cette zone de clipping seront affichés.
public abstract void translate (int x, int y)Cette méthode effectue une translation (x,y) sur le repère courant. Tous les ordres graphiques seront ensuite calculés par rapport à ce nouveau repère.
public abstract Rectangle getClipRect () public abstract void clipRect (int x, int y, int width, int height)Ces méthodes permettent d'interroger ou de modifier la zone de clipping courante. Seuls les dessins effectués à l'intérieur de cette zone de clipping seront affichés. S'il existe déjà un rectangle de clipping, le rectangle de clipping résultant de l'appel à la méthode clipRect () est l'intersection entre le rectangle courant et celui passé en paramètre.
public abstract Color getColor () public abstract void setColor (Color c)Ces méthodes permettent d'interroger ou de modifier la couleur courante utilisée pour dessiner.
public abstract void setPaintMode () public abstract void setXORMode (Color c1)Ces méthodes permettent de choisir le mode d'utilisation de la couleur au cours d'un dessin. setPaintMode () positionne le mode le plus usuel où tout dessin est effectué avec la couleur courante. setXORMode () positionne le mode XOR : Dans ce mode, tout ordre graphique effectué deux fois aux mêmes coordonnées s'annule ; si la couleur d'un pixel (ou d'un point) à dessiner est égale à la couleur courante, il prend la couleur c1, les pixels d'une autre couleur prennent une couleur non prévisible. Ce mode est surtout utilisé pour dessiner des rectangles élastiques quand l'utilisateur doit désigner un ensemble d'objets ou dessiner un rectangle élastique. A chaque déplacement du pointeur de la souris, avant de dessiner un rectangle aux nouvelles coordonnées, vous annulez le rectangle précédent en le redessinant à la même position.
public abstract Font getFont () public abstract void setFont (Font font)Ces méthodes permettent d'interroger ou de modifier la police de caractère courante utilisée pour dessiner les textes.
public FontMetrics getFontMetrics () public abstract FontMetrics getFontMetrics (Font font)Ces méthodes permettent d'interroger les tailles de la police de caractère courante ou de la police de caractère font.
public abstract void drawLine (int x1, int y1, int x2, int y2)Permet de dessiner une ligne reliant les points de coordonnées (x1,y1) et (x2,y2).
public void drawRect (int x, int y, int width, int height)Permet de dessiner le contour du rectangle au point de coordonnées (x,y), de largeur (vers la droite) width et de hauteur (vers le bas) height.
Ce rectangle s'étend en fait du pixel de coordonnées (x,y) à celui de coordonnées (x + width,y + height), ce qui donne une largeur de width + 1 pixels et une hauteur de height + 1 pixels.public abstract void fillRect (int x, int y, int width, int height) public abstract void clearRect (int x, int y, int width, int height)Ces méthodes permettent de remplir le rectangle au point de coordonnées (x,y), de largeur width et de hauteur height. fillRect () utilise la couleur courante comme couleur de remplissage et clearRect () utilise la couleur de fond.
Contrairement à la méthode drawRect (), ce rectangle s'étend du pixel de coordonnées (x,y) à celui de coordonnées (x + width - 1,y + height - 1), ce qui donne une largeur de width pixels et une hauteur de height pixels.public abstract void drawRoundRect (int x, int y, int width int height, int arcWidth, int arcHeight) public abstract void fillRoundRect (int x, int y, int width, int height, int arcWidth, int arcHeight)Ces méthodes permettent de dessiner ou de remplir un rectangle dont les bords sont arrondis.
public void draw3DRect (int x, int y, int width, int height, boolean raised) public void fill3DRect (int x, int y, int width, int height, boolean raised)Ces méthodes permettent de dessiner ou de remplir un rectangle avec effet 3D. Si raised est égal à true, le rectangle sera en relief, sinon il sera en creux.
public abstract void drawOval (int x, int y, int width, int height) public abstract void fillOval (int x, int y, int width, int height)Ces méthodes permettent de dessiner le contour d'un oval ou de remplir un ovale (ou une ellipse) contenu dans le rectangle de coordonnées (x,y), de largeur width et de hauteur height.
Pour les deux méhodes, ce rectangle s'étend en fait du pixel de coordonnées (x,y) à celui de coordonnées (x + width,y + height), ce qui donne une largeur de width + 1 pixels et une hauteur de height + 1 pixels.public abstract void drawArc (int x, int y, int width, int height, int startAngle, int arcAngle) public abstract void fillArc (int x, int y, int width, int height, int startAngle, int arcAngle)Ces méthodes permettent de dessiner le contour d'un arc ou de remplir un arc d'ellipse contenu dans le rectangle de coordonnées (x,y), de largeur width et de hauteur height. L'arc est dessiné à partir de l'angle startAngle degrés (correspondant à l'angle de 3 heures), et s'étend sur arcAngle degrés dans le sens trigonométrique, si arcAngle est positif.
Le rectangle englobant s'étend du pixel de coordonnées (x,y) à celui de coordonnées (x + width,y + height), ce qui donne une largeur de width + 1 pixels et une hauteur de height + 1 pixels.public abstract void drawPolygon (int xPoints [ ], int yPoints [ ], int nPoints) public void drawPolygon (Polygon p) public abstract void fillPolygon (int xPoints [ ], int yPoints [ ], int nPoints) public void fillPolygon (Polygon p)Ces méthodes permettent de dessiner ou de remplir un polygone. Les points du polygone peuvent être donnés soit dans les tableaux xPoints et yPoints représentant les coordonnées (x,y) de chaque point, soit par uns instance de la classe Polygon.
public abstract void drawString (String str, int x, int y) public void drawChars (char data [ ], int offset, int length, int x, int y) public void drawBytes (byte data [ ], int offset, int length, int x, int y)Ces méthodes permettent de dessiner une chaîne de caractères avec la police de caractère courante au point de coordonnées (x,y) : l'ordonnée y de ce point est la ligne de base sur laquelle sera dessinée la chaîne. La chaîne de caractères peut être donnée soit par une instance de String, soit par les length premiers caractères à partir de l'indice offset du tableau data.
public abstract void copyArea (int x, int y, int width, int height, int dx, int dy)Permet de copier au point de coordonnées (x + dx,y + dy) la partie du composant contenue dans le rectangle au point de coordonnées (x,y), de largeur width et de hauteur height.
public abstract boolean drawImage (Image img, int x, int y, ImageObserver observer) public abstract boolean drawImage (Image img, int x, int y, int width, int height, ImageObserver observer) public abstract boolean drawImage (Image img, int x, int y, Color bgcolor, ImageObserver observer) public abstract boolean drawImage (Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer)Ces méthodes permettent de dessiner l'image img, au point de coordonnées (x,y). La largeur et la hauteur width et height permettent éventuellement de d'agrandir ou de diminuer la taille de l'image. Si vous voulez ne dessiner qu'une partie d'une image, utiliser la méthode clipRect (). Voir aussi le chapitre sur les images.
public abstract void dispose ()Permet de détruire le contexte graphique. Une fois détruit, le contexte graphique n'est plus utilisable et la translation et la zone de clipping éventuellement actives sur ce contexte graphique sont annulées.
public void finalize ()Détruit le contexte graphique (appel de dispose ()). Cette méthode outrepasse celle de la classe Object.
public String toString ()Renvoie une chaîne de caractère représentant le contexte graphique. Cette méthode outrepasse celle de la classe Object.
Les méthodes de dessin (comme drawRect (), drawOval ()) prenant en paramètre une largeur et une hauteur (width et height), n'acceptent que des valeurs positives pour ces paramètres.
Voici l'applet DrawIt, vous permettant de dessiner interactivement des formes en désignant un rectangle englobant avec la souris. Les boutons radios à droite vous permettent de choisir le type de dessin que vous voulez réaliser. Cette applet permet de tester le mode XOR, la plupart des méthodes de dessins de la classe Graphics et l'utilisation des méthodes mouseDown (), mouseDrag () et mouseUp () de la classe Component :
et le programme Java correspondant (à copier dans un fichier dénommé DrawIt.java et invoqué à partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; import java.util.Random; public class DrawIt extends Applet { private CheckboxGroup choixDessin = new CheckboxGroup (); private Panel zoneDessin = new DrawItComponent (choixDessin); public void init () { // Choix d'un layout BorderLayout (FlowLayout par défaut) setLayout (new BorderLayout ()); // Création de boutons radios permettant de choisir // la fonction de dessin à utiliser Panel panel = new Panel (); panel.setLayout (new GridLayout (7, 1)); panel.add (new Checkbox ("Ligne", choixDessin, true)); panel.add (new Checkbox ("Rectangle", choixDessin, false)); panel.add (new Checkbox ("Rectangle 3D", choixDessin, false)); panel.add (new Checkbox ("Polygone", choixDessin, false)); panel.add (new Checkbox ("Ovale", choixDessin, false)); panel.add (new Checkbox ("Arc de cercle", choixDessin, false)); panel.add (new Checkbox ("Texte", choixDessin, false)); // Ajout à droite des boutons radios add ("East", panel); // Ajout au centre de la zone de saisie add ("Center", zoneDessin); } } // Classe DrawItComponent class DrawItComponent extends Panel { private int xDebut, yDebut, xFin, yFin; private CheckboxGroup choixDessin; private Color couleurDessin; private int angleDebut, angle; private String typeDessin = ""; // Constructeur DrawItComponent (CheckboxGroup choixDessin) { this.choixDessin = choixDessin; } // Méthodes mouseDown (), mouseDrag (), mouseUp () // appelées à l'enfoncement du bouton de la souris, // au déplacement du pointeur, et au relâchement du bouton public boolean mouseDown (Event evt, int x, int y) { xDebut = x; yDebut = y; dessinerElastique (x , y); return true; } public boolean mouseDrag (Event evt, int x, int y) { // Effacement du rectangle aux anciennes coordonnées // puis dessin d'un nouveau rectangle aux coordonnées courantes dessinerElastique (xFin, yFin); dessinerElastique (x, y); return true; } public boolean mouseUp (Event evt, int x, int y) { // Effacement du dernier rectangle dessiné dessinerElastique (xFin, yFin); // Récupération du type de dessin demandé, d'une couleur et deux angles // et redessin du composant typeDessin = choixDessin.getCurrent ().getLabel (); Random generateur = new Random (); couleurDessin = new Color (generateur.nextFloat (), generateur.nextFloat (), generateur.nextFloat ()); angleDebut = generateur.nextInt () % 360; angle = generateur.nextInt () % 360; repaint (); return true; } // Méthode dessinerElastique () : mémorise les coordonnées // courantes, puis trace un rectangle en mode XOR private void dessinerElastique (int xFin, int yFin) { this.xFin = xFin; this.yFin = yFin; Graphics gc = getGraphics (); gc.setXORMode (getBackground ()); gc.drawRect (Math.min (xDebut, xFin), Math.min (yDebut, yFin), Math.abs (xFin - xDebut), Math.abs (yFin - yDebut)); } // Méthode appelée à la mise à jour du composant public void paint (Graphics gc) { // Sélection de la couleur gc.setColor (couleurDessin); // Appel de la méthode de dessin suivant le type de dessin choisi int x = Math.min (xDebut, xFin); int y = Math.min (yDebut, yFin); int largeur = Math.abs (xFin - xDebut); int hauteur = Math.abs (yFin - yDebut); if (typeDessin.equals ("Ligne")) gc.drawLine (x, y, x + largeur, y + hauteur); else if (typeDessin.equals ("Rectangle")) gc.fillRect (x, y, largeur, hauteur); else if (typeDessin.equals ("Rectangle 3D")) gc.fill3DRect (x, y, largeur, hauteur, true); else if (typeDessin.equals ("Polygone")) { int xPoints [ ] = {x, x , x + largeur, x + largeur}; int yPoints [ ] = {y, y + hauteur, y, y + hauteur}; gc.fillPolygon (xPoints, yPoints, xPoints.length); } else if (typeDessin.equals ("Ovale")) gc.fillOval (x, y, largeur, hauteur); else if (typeDessin.equals ("Arc de cercle")) { gc.drawOval (x, y, largeur, hauteur); gc.fillArc (x, y, largeur, hauteur, angleDebut, angle); } else if (typeDessin.equals ("Texte")) { gc.setFont (new Font ("Helvetica", Font.PLAIN, hauteur)); FontMetrics tailles = gc.getFontMetrics (); gc.drawString ("Texte", x, y + tailles.getAscent () + tailles.getLeading ()); } } }Autres exemples
Les applets Chrono, EchoClient, PaperBoardClient, ListePolices et ScrollText sont des exemples d'utilisation de la méthode drawString ().
Les applets AfficheurDeCalcul, ObservateurCalcul, PaperBoardClient, Piano, ListePolices et Horloge sont des exemples de tracés de lignes et de polygones.
Les applets BoutonsNavigation, MultiImages, ImageSimple, ChargementImage, ImageTableau, ImageNoirEtBlanc, NegatifImage, AnimationFleche et Horloge sont des exemples d'utilisation de la méthode drawImage ().
Le package java.awt définit aussi un ensemble de classes utiles pour la classe Graphics décrites ci-après, qui permettent de manipuler les polices de caractères, les couleurs et les objets représentant des dimensions (point, rectangle, polygone,...) :
La classe java.awt.Font
Cette classe permet de manipuler les polices de caractères. Une police de caractères se caractérise par un nom, un style (normal, gras, italique) et une taille exprimée en points (voir aussi la classe FontMetrics).
Toutes les polices de caractères du système ne sont pas disponibles en Java. Vous pouvez en obtenir la liste (généralement, Courier, TimesRoman et Helvetica) grâce à la méthode getFontList () de la classe Toolkit, utilisé dans l'applet ListePolices.
Champs
public final static int PLAIN public final static int BOLD public final static int ITALICCes constantes permettent de spécifier le style de la police de caractères à sa création (normal, gras ou italique). Il est possible de combiner les styles avec l'opérateur | (par exemple, Font.BOLD | Font.ITALIC).
protected String name protected int style protected int sizeCes champs protected permettent d'accéder aux caractéristiques d'une police de caractères, dans les classes dérivées de Font.
Constructeur
public Font (String name, int style, int size)Construit une police de caractères de nom name, de style style et de taille size.
Méthodes
public String getName () public int getStyle () public int getSize ()Ces méthodes permettent d'interroger le nom, le style et la taille d'une police de caractères`.
public boolean isPlain () public boolean isBold () public boolean isItalic ()Ces méthodes renvoient true si une police de caractères a un style normal, gras ou italique.
public String getFamily ()Renvoie le nom de la famille à laquelle appartient une police de caractères. La famille d'une police dépend du système sur lequel fonctionne la Machine Virtuelle Java, tandis que le nom d'une police est un nom logique qui est toujours le même quelque soit le système pour rendre un programme Java portable.
public static Font getFont (String prop) public static Font getFont (String prop, Font font)Ces méthodes renvoient la police de caractère mémorisée par la propriété prop du système (voir la classe System). Si cette propriété n'existe pas, la seconde méthode renvoie la valeur par défaut font.
public int hashCode () public boolean equals (Object obj) public String toString ()Ces méthodes outrepassent celles de la classe Object, pour renvoyer un code de hash, comparer une police de caractères à un objet ou renvoyer une chaîne de caractères décrivant une police.
Exemples
Applets DrawIt, ListePolices. et ScrollText.
La classe java.awt.FontMetrics
Cette classe décrit les différentes tailles (hauteurs par rapport à la ligne de base, largeurs diverses) d'une police de caractères (de classe Font).
Champ
protected Font fontMémorise la police de caractères décrite.
Constructeur
protected FontMetrics (Font font)Ce constructeur est protected ce qui empêche de créer directement une instance de la classe FontMetrics. Les méthodes getFontMetrics () des classes Graphics et Toolkit vous permettent d'interroger les tailles d'une police de caractères.
Méthodes
public Font getFont ()Renvoie la police de caractères décrite par une instance de la classe FontMetrics.
public int getHeight () public int getLeading () public int getAscent () public int getDescent ()Ces méthodes revoient la hauteur, l'interligne, la hauteur au-dessus de la ligne de base et le jambage d'une police de caractères. La hauteur, différente de la taille de la police donnée à sa création, est égale à la somme des trois autres dimensions.
public int getMaxAscent () public int getMaxDescent ()Ces méthodes revoient la hauteur maximum au-dessus de la ligne de base et le jambage maximum de tous les caractères d'une police.
public int getMaxAdvance ()Renvoie la largeur du plus large des caractères d'une police.
public int charWidth (int ch) public int charWidth (char ch)Ces méthodes renvoient la largeur du caractère ch d'une police.
public int stringWidth (String str) public int charsWidth (char data [ ], int offset, int length) public int bytesWidth (byte data [ ], int offset, int length)Ces méthodes renvoient la largeur d'une chaîne de caractères. La chaîne de caractères peut être donnée soit par une instance de String, soit par les length premiers caractères à partir de l'indice offset du tableau data.
public int [ ] getWidths ()Renvoie un tableau décrivant la taille des 256 premiers caractères d'une police.
public String toString ()Cette méthode outrepasse la méthode toString () de la classe Object, pour renvoyer une chaîne de caractères décrivant les principales tailles d'une police de caractères.
L'applet suivante décrit la liste de l'ensemble des polices de caractères disponibles avec Java. Cliquez sur un élément de la liste ou saisissez une taille de police de caractères dans le champ Size, pour afficher un exemple de texte et les caractéristiques de la police choisie :
Voici le programme Java correspondant (à copier dans un fichier dénommé ListePolices.java et invoqué à partir d'un fichier HTML) :
import java.awt.*; import java.applet.*; public class ListePolices extends Applet { AfficheurTexte exemple = new AfficheurTexte (); List listePolices = new List (); TextField taillePolice = new TextField ("24"); Label labelHeight = new Label (); Label labelLeading = new Label (); Label labelAscent = new Label (); Label labelDescent = new Label (); Label labelMaxAdvance = new Label (); public void init () { // Choix d'un layout BorderLayout (FlowLayout par défaut) setLayout (new BorderLayout (5, 0)); // Création d'un panel contenant la liste des polices // et la zone de saisie de la taille Panel panelSaisie = new Panel (); panelSaisie.setLayout (new BorderLayout ()); // Récupération de la liste des polices disponibles String [ ] ensemblePolices = getToolkit ().getFontList (); for (int i = 0; i < ensemblePolices.length; i++) listePolices.addItem (ensemblePolices [i]); panelSaisie.add ("Center", listePolices); Panel panelTaille = new Panel (); panelTaille.add (new Label ("Size :")); panelTaille.add (taillePolice); panelSaisie.add ("South", panelTaille); // Ajout du panel de saisie add ("West", panelSaisie); // Ajout du composant affichant une chaîne d'exemple add ("Center", exemple); // Création d'un panel utilisant un layout de grille // et affichant un ensemble de labels qui permettent // de décrire les caractéristiques de la police sélectionnée Panel panelResultat = new Panel (); panelResultat.setLayout (new GridLayout (5, 2)); panelResultat.add (new Label ("Height :")); panelResultat.add (labelHeight); panelResultat.add (new Label ("Leading :")); panelResultat.add (labelLeading); panelResultat.add (new Label ("Ascent :")); panelResultat.add (labelAscent); panelResultat.add (new Label ("Descent :")); panelResultat.add (labelDescent); panelResultat.add (new Label ("MaxAdvance :")); panelResultat.add (labelMaxAdvance); // Ajout du panel de résultat add ("East", panelResultat); } // Gestion des événements sur la liste et la zone de saisie public boolean handleEvent (Event event) { // Si un événement de sélection de la liste ou un // événement de changement de texte survient, // mise à jour des labels décrivant la police et de l'exemple if ( event.id == Event.LIST_SELECT || ( event.id == Event.ACTION_EVENT && event.target == taillePolice)) { Font police = new Font (listePolices.getSelectedItem (), Font.PLAIN, Integer.parseInt (taillePolice.getText ())); FontMetrics metrics = getToolkit ().getFontMetrics (police); labelHeight.setText (String.valueOf (metrics.getHeight ())); labelLeading.setText (String.valueOf (metrics.getLeading ())); labelAscent.setText (String.valueOf (metrics.getAscent ())); labelDescent.setText (String.valueOf (metrics.getDescent ())); labelMaxAdvance.setText (String.valueOf (metrics.getMaxAdvance ())); exemple.modifierTexte (police, "Bonjour"); return true; } return super.handleEvent (event); } } // Classe AfficheurTexte affiche un texte avec une police de caractères class AfficheurTexte extends Panel { Font police; String texte; // La méthode modifierTexte () permet de modifier // la police de caractères et le texte du composant public void modifierTexte (Font police, String texte) { this.police = police; this.texte = texte; repaint (); } public void paint (Graphics gc) { if (texte != null) { // Dessin d'un cadre autour du composant gc.drawRect (0, 0, size ().width - 1, size ().height - 1); // Dessin des rectangles représentant les tailles FontMetrics metrics = gc.getFontMetrics (police); int y = (size ().height - metrics.getHeight ()) / 2; int largeurTexte = metrics.stringWidth (texte); gc.setColor (Color.blue.darker ()); gc.drawRect (5, y, largeurTexte, metrics.getHeight ()); gc.drawRect (5, y + metrics.getLeading (), largeurTexte, metrics.getAscent ()); // Dessin du texte dans les rectangles gc.setColor (Color.black); gc.setFont (police); gc.drawString (texte, 5, y + metrics.getAscent () + metrics.getLeading ()); } } }Autres exemples
Applets DrawIt et ScrollText.
La classe java.awt.Color
Cette classe permet de manipuler une couleur. Elle déclare un ensemble de constantes décrivant les couleurs les plus communément utilisées. Ses constructeurs permettent de créer des couleurs à partir de leurs composantes RGB (Red Green Blue : Rouge Vert Bleu), mais les méthodes brighter () et darker () sont aussi très pratiques pour créer des couleurs plus claire ou plus foncée à partir d'une couleur existante.
Champs
public final static Color white public final static Color lightGray public final static Color gray public final static Color darkGray public final static Color black public final static Color red public final static Color pink public final static Color orange public final static Color yellow public final static Color green public final static Color magenta public final static Color cyan public final static Color blueCes constantes permettent de récupérer directement des couleurs prédéfinies (blanc, gris clair, gris, gris foncé, noir, rouge, rose, orange, jaune, vert, magenta, cyan et bleu).
Constructeurs
public Color (int r, int g, int b)Construit une couleur à partir de ses composantes entières rouge r, vert g et bleu b comprises entre 0 et 255.
public Color (int rgb)Construit une couleur à partir de l'entier rgb combinaison des composantes rouge (bits 16 à 23), vert (bits 8 à 15) et bleu (bits 0 à 7).
public Color (float r, float g, float b)Construit une couleur à partir de ses composantes décimales rouge r, vert g et bleu b comprises entre 0.0 et 1.0.
Méthodes
public int getRed () public int getGreen () public int getBlue ()Ces méthodes renvoient les composantes rouge, vert ou bleu d'une couleur comprises entre 0 et 255.
public int getRGB ()Renvoie un entier combinaison des composantes rouge (bits 16 à 23), vert (bits 8 à 15) et bleu (bits 0 à 7) d'une couleur.
public Color brighter () public Color darker ()Ces méthodes renvoient une couleur plus claire ou plus foncée d'une couleur.
public static Color getColor (String name) public static Color getColor (String name, Color v) public static Color getColor (String name, int v) public static int HSBtoRGB (float hue, float saturation, float brightness)Renvoie un entier combinaison des composantes rouge, vert et bleu d'une couleur exprimée par sa teinte hue, sa saturation saturation et sa luminosité brightness comprises entre 0.0 et 1.0.
public static float [ ] RGBtoHSB (int r, int g, int b, float hsbvals [ ])Renvoie un tableau décrivant la teinte, la saturation et la luminosité (aux indices 0, 1 et 2) d'une couleur à partir de ses composantes rouge, vert et bleu comprises entre 0 et 255. Les valeurs sont stockées dans hsbvals s'il est différent de null, sinon un nouveau tableau est créé.
public static Color getHSBColor (float hue, float saturation, float brightness)Crée une couleur à partir de sa teinte hue, sa saturation saturation et sa luminosité brightness comprises entre 0.0 et 1.0.
public int hashCode () public boolean equals (Object obj) public String toString ()Ces méthodes outrepassent celles de la classe Object, pour renvoyer un code de hash, comparer une une couleur à un objet ou renvoyer une chaîne de caractères décrivant la couleur.
L'applet suivante dessine un nuancier. Les couleurs utilisent le mode HSB (Teinte, Saturation, Luminosité) pour avoir plus simplement les couleurs de toute la palette à partir d'une teinte. Quand vous cliquez sur une couleur, le label en dessous du nuancier indique la couleur choisie. Cette applet vous permet de tester la palette des couleurs disponibles sur une Machine Virtuelle :
Voici le programme Java correspondant (à copier dans un fichier dénommé Nuancier.java et invoqué à partir d'un fichier HTML) :
import java.awt.*; import java.applet.*; public class Nuancier extends Applet { // Label bidon utilisé pour afficher en couleur de fond la couleur choisie Label labelColorise = new Label (" "); Label labelCouleur = new Label ("Cliquez sur une couleur..."); public void init () { // Choix d'un layout BorderLayout (FlowLayout par défaut) setLayout (new BorderLayout ()); // Ajout d'un composant affichant le nuancier add ("Center", new ComposantNuancier ()); // Création et ajout d'un panel de deux labels d'information Panel panelInfo = new Panel (); panelInfo.setLayout (new BorderLayout (5, 0)); panelInfo.add ("West", labelColorise); panelInfo.add ("Center", labelCouleur); add ("South", panelInfo); } public boolean action (Event event, Object arg) { // Si une action est reçue du composant nuancier // modifier la couleur de fond du label sans texte // et afficher les composantes RGB de la couleur choisie if (event.target instanceof ComposantNuancier) { Color couleur = (Color)arg; labelColorise.setBackground (couleur); labelColorise.repaint (); labelCouleur.setText ("Couleur : Rouge " + couleur.getRed () + ", Vert " + couleur.getGreen () + ", Bleu " + couleur.getBlue ()); } return true; } } // Classe ComposantNuancier class ComposantNuancier extends Panel { private static final int TAILLE = 40; private Rectangle [ ] carreaux = new Rectangle [TAILLE * TAILLE]; private Color [ ] couleurCarreaux = new Color [TAILLE * TAILLE]; // Constructeur : crée l'ensemble des couleurs des carreaux ComposantNuancier () { for (int i = 0; i < TAILLE; i++) { // Première boucle réalisant un fondu du noir vers la teinte (moitié supérieure) int j; for (j = 0; j < TAILLE / 2; j++) couleurCarreaux [i * TAILLE + j] = Color.getHSBColor ((float)i / TAILLE, // Teinte 1, // Saturation (float)j / TAILLE * 2); // Luminosité // Seconde boucle diminuant la saturation de la couleur (moitié inférieure) for ( ; j < TAILLE; j++) couleurCarreaux [i * TAILLE + j] = Color.getHSBColor ((float)i / TAILLE, // Teinte (float)(TAILLE - 1 - j) / TAILLE * 2, // Saturation 1); // Luminosité } } // Méthode appelée quand le composant change de taille public void reshape (int x, int y, int width, int height) { super.reshape (x, y, width, height); // Calcul de la largeur et de la hauteur des carreaux int largeur = size ().width / TAILLE; int hauteur = size ().height / TAILLE; // Création des rectangles représentant les carreaux de couleur for (int i = 0; i < TAILLE; i++) for (int j = 0; j < TAILLE; j++) carreaux [i * TAILLE + j] = new Rectangle (largeur * i, hauteur * j, largeur, hauteur); } public void paint (Graphics gc) { for (int i = 0; i < carreaux.length; i++) { // Sélection d'une couleur et dessin du carreau gc.setColor (couleurCarreaux [i]); gc.fillRect (carreaux [i].x, carreaux [i].y, carreaux [i].width, carreaux [i].height); } } public boolean mouseDown (Event evt, int x, int y) { // Recherche du carreau dans lequel l'utilisateur à cliquer // et envoi d'un événement d'action for (int i = 0; i < carreaux.length; i++) if (carreaux [i].inside (x, y)) postEvent (new Event (this, Event.ACTION_EVENT, couleurCarreaux [i])); return true; } }Autres exemples
Applets ObservateurCalcul, DrawIt, ListePolices, MultiImages et ScrollText.
La classe java.awt.Dimension
Cette classe permet de manipuler les dimensions d'un objet (largeur et hauteur) grâce à ses deux champs public width et height.
Champs
public int width public int heightConstructeurs
public Dimension () public Dimension (Dimension d) public Dimension (int width, int height)Méthode
public String toString ()Cette méthode outrepasse la méthode toString () de la classe Object, pour renvoyer une chaîne de caractères décrivant les dimensions.
Exemples
Applets BoutonsNavigation, MultiImages, ImageTableau, ImageNoirEtBlanc, ScrollText et Horloge.
La classe java.awt.Insets
Cette classe qui implémente l'interface Cloneable, permet de manipuler les bordures d'un container, qui délimitent une zone dans laquelle il n'est pas possible de dessiner.
Champs
public int top public int left public int bottom public int rightCes champs public désignent les bordures en haut, à gauche, en bas et à droite.
Constructeur
public Insets (int top, int left, int bottom, int right)Méthodes
public String toString () public Object clone ()Ces méthodes outrepassent celles de la classe Object, pour renvoyer une chaîne de caractères décrivant les valeurs des bordures ou un clone d'une instance de la classe Insets.
La classe java.awt.Point
Cette classe permet de manipuler des points de coordonnées (x,y).
Champs
public int x public int yConstructeur
public Point (int x, int y)Méthodes
public void move (int x, int y)Déplace le point en (x,y).
public void translate (int x, int y)Effectue une translation (x,y) sur un point.
public int hashCode () public boolean equals (Object obj) public String toString ()Ces méthodes outrepassent celles de la classe Object, pour renvoyer un code de hash, comparer un point à un objet ou renvoyer une chaîne de caractères décrivant le point.
La classe java.awt.Polygon
Cette classe permet de manipuler des polygones, ensemble de npoints points dont les coordonnées sont enregistrées dans les tableaux xpoints et ypoints.
Champs
public int npoints public int xpoints [ ] public int ypoints [ ]Constructeurs
public Polygon () public Polygon (int xpoints [ ], int ypoints [ ], int npoints)Méthodes
public void addPoint (int x, int y)Ajoute le point de coordonnées (x,y) à la fin de l'ensemble des points.
public Rectangle getBoundingBox ()Renvoie le rectangle englobant tous les points du polygone.
public boolean inside (int x, int y)Renvoie true si le point de coordonnées (x,y) est à l'intérieur du polygone.
Exemple
AppletPaperBoardClient.
La classe java.awt.Rectangle
Cette classe permet de manipuler des rectangles, mémorisés sous forme d'un point origine de coordonnées (x,y) représentant le coin supérieur gauche, de sa largeur width et de sa hauteur height.
Champs
public int x public int y public int width public int heightConstructeurs
public Rectangle () public Rectangle (int x, int y, int width, int height) public Rectangle (int width, int height) public Rectangle (Point p, Dimension d) public Rectangle (Point p) public Rectangle (Dimension d)Méthodes
public void reshape (int x, int y, int width, int height)Permet de changer l'origine, la largeur et la hauteur d'un rectangle.
public void move (int x, int y)Déplace l'origine du rectangle en (x,y).
public void translate (int x, int y)Effectue une translation (x,y) sur l'origine du rectangle.
public void resize (int width, int height)Modifie la largeur et la hauteur d'un rectangle.
public boolean inside (int x, int y)Renvoie true si le point de coordonnées (x,y) est à l'intérieur d'un rectangle.
public boolean intersects (Rectangle r)Renvoie true si le rectangle r et le rectangle sur lequel la méthode est invoquée ont une intersection.
public Rectangle intersection (Rectangle r) public Rectangle union (Rectangle r)Ces méthodes renvoie un rectangle résultat de l'intersection ou de l'union entre deux rectangles.
public void add (int newx, int newy) public void add (Point pt)Ces méthodes ajoutent un point à un rectangle qui est agrandit si nécessaire pour contenir le point passé en paramètre.
public void add (Rectangle r)Ajoute le rectangle r au rectangle sur lequel la méthode est invoquée. Le résultat est l'union des deux rectangles.
public void grow (int horiz, int vert)Agrandit un rectangle de horiz points à gauche et à droite, et de vert points en haut et en bas.
public boolean isEmpty ()Renvoie true si la largeur ou la hauteur d'un rectangle est négative ou nulle.
public int hashCode () public boolean equals (Object obj) public String toString ()Ces méthodes outrepassent celles de la classe Object, pour renvoyer un code de hash, comparer un rectangle à un objet ou renvoyer une chaîne de caractères décrivant le rectangle.
Dans les trois exemples précédents, les classes DrawItComponent, AfficheurTexte et ComposantNuancier dérivent de la classe Panel. Bien que ces applets fonctionnent correctement, Panel est une classe de container donc prévue pour contenir d'autres composants.
Pour créer de nouveaux composants, il est plutôt recommandé de dériver de nouvelles classes à partir de la classe Canvas.La classe java.awt.Canvas
Cette classe qui dérive de la classe Component, est la classe du package java.awt dont vous devez dériver pour créer vos propres classes de composants.
Constructeur
public Canvas ()Méthodes
public synchronized void addNotify ()Cette méthode outrepasse la méthode addNotify () de la classe Component pour créer le peer d'une instance de Canvas.
public void paint (Graphics gc)Cette méthode outrepasse la méthode paint () de la classe Component, pour remplir le composant de la couleur de fond.
L'applet suivante utilise une nouvelle classe de composant BoutonImage. Ce composant est un bouton utilisant deux images de même taille, pour représenter l'état relâché et l'état enfoncé du bouton :Le programme Java correspondant a été divisé en deux fichiers. Comme la classe BoutonImage (à copier dans un fichier dénommé BoutonImage.java) peut être appelée à être réutilisée, elle est rangée dans un package tools :
// Les classes de ce fichier appartiennent au package tools package tools; import java.awt.*; import java.net.*; public class BoutonImage extends Canvas { private boolean boutonEnfonce = false; private boolean boutonSourisEnfonce = false; private Object argAction; private Image imageRelache; private Image imageEnfonce; // Constructeur public BoutonImage (Object argAction, URL urlImageRelache, URL urlImageEnfonce) { try { this.argAction = argAction; // Création des images enfoncé/relâché du bouton imageRelache = getToolkit ().getImage (urlImageRelache); imageEnfonce = getToolkit ().getImage (urlImageEnfonce); // Création d'un MediaTracker pour charger les images // afin que leur taille soit disponible pour le layout MediaTracker imageTracker = new MediaTracker (this); imageTracker.addImage (imageRelache, 0); imageTracker.addImage (imageEnfonce, 0); imageTracker.waitForAll (); // En cas d'erreur, déclenchement d'une exception if (imageTracker.isErrorAny ()) throw new IllegalArgumentException ("Images introuvables"); } catch (InterruptedException e) { } } // Il est conseillé d'outrepasser les méthodes preferredSize () // et minimumSize () pour que les layouts utilisant ces méthodes // puissent dimensionner ce composant correctement public Dimension preferredSize () { return new Dimension (imageRelache.getWidth (this), imageRelache.getHeight (this)); } public Dimension minimumSize () { return preferredSize (); } // La méthode paint () dessine l'image suivant l'état du bouton public void paint (Graphics gc) { if (boutonEnfonce) gc.drawImage (imageEnfonce, 0, 0, this); else gc.drawImage (imageRelache, 0, 0, this); } // Les méthodes mouseDown () et mouseUp () modifient l'image du // bouton à l'enfoncement/relâchement du bouton de la souris public boolean mouseDown (Event event, int x, int y) { modifierEnfoncementBouton (true); boutonSourisEnfonce = true; return true; } public boolean mouseUp (Event event, int x, int y) { boolean boutonEnfonce = this.boutonEnfonce; modifierEnfoncementBouton (false); boutonSourisEnfonce = false; // Si le bouton est resté enfoncé, envoi d'un événement d'action if (boutonEnfonce) postEvent (new Event (this, Event.ACTION_EVENT, argAction)); return true; } // Les méthodes mouseEnter () et mouseExit () modifient // l'image du bouton si le bouton de la souris est enfoncé public boolean mouseEnter (Event event, int x, int y) { if (boutonSourisEnfonce) modifierEnfoncementBouton (true); return true; } public boolean mouseExit (Event event, int x, int y) { if (boutonSourisEnfonce) modifierEnfoncementBouton (false); return true; } private void modifierEnfoncementBouton (boolean nouvelEtat) { // Si l'état enfoncé/relâché du bouton a changé // mettre à jour le dessin du bouton if (boutonEnfonce != nouvelEtat) { boutonEnfonce = nouvelEtat; paint (getGraphics ()); } } }L'autre fichier décrit l'applet (à copier dans un fichier dénommé BoutonsNavigation.java et invoqué à partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; import java.net.*; // Importation de la classe BoutonImage du package tools import tools.BoutonImage; public class BoutonsNavigation extends Applet { public void init () { try { // Création et ajout des deux boutons à l'applet add (new BoutonImage (new URL (getDocumentBase (), "awtlayouts10.html"), new URL (getCodeBase (), "prevup.gif"), new URL (getCodeBase (), "prevdown.gif"))); add (new BoutonImage (new URL (getDocumentBase (), "image10.html"), new URL (getCodeBase (), "nextup.gif"), new URL (getCodeBase (), "nextdown.gif"))); } catch (MalformedURLException e) { } } // Les boutons de classe BoutonImage émettent des événements ACTION_EVENT public boolean action (Event evt, Object arg) { // Chargement d'un document HTML suivant le bouton enfoncé if (arg instanceof URL) getAppletContext ().showDocument ((URL)arg); return true; } }En récupérant les valeurs de paramètres utilisant la balise PARAM, cette applet pourrait être généralisée pour qu'elle configure les images et les actions des boutons, sans avoir à modifier son code source à chaque utilisation différente dans un fichier HTML.
|