Applets
Applets
Applets
On peut passer des paramètres à l’applet en les désignant dans la page HTML. Pour cela on utilise la balise
<PARAM NAME="nomDuParamètre" VALUE="valeurDuParamètre">
Ces paramètres sont des chaînes de caractères qui peuvent être récupérées par la méthode getParameter décrite
plus loin (voir 1.4.1).
Exemple de page HTML incluant une applet contenue dans le fichier Anime.class placé dans le répertoire applets
et à laquelle on transmet un paramètre Couleur de valeur rouge et un paramètre Vitesse de valeur 50 (cette valeur
n’est par un entier et devra être convertie) :
<HTML>
<HEAD>
<TITLE> Essai d'Applet : Animation paramétrée </TITLE>
</HEAD>
<BODY>
<P>
<APPLET CODE="Parametres.class" CODEBASE="applets" WIDTH="100%" HEIGHT=200 ALIGN=middle>
<PARAM NAME="Couleur" VALUE="rouge">
<PARAM NAME="Vitesse" VALUE="50"> </APPLET>
</P>
</BODY>
</HTML>
Depuis la version 4 de HTML il est préférable d'utiliser la balise object plutôt que la balise APLLET. Ceci se
fait comme suit:
<object
codetype="application/java-archive"
classid="java:Parametres.class"
codebase="applets"
width="100%" height="200" align=middle
standby="texte affiché pendant que l'applet se charge"
>
<PARAM NAME="Couleur" VALUE="rouge">
<PARAM NAME="Vitesse" VALUE="50"> </APPLET>
On peut mettre ici un texte qui sera affiché si l'applet ne démarre pas
</object>
Le tableau suivant décrit l’ordre des appels se produisant lors des principales situations que peut rencontrer le
navigateur :
(1) L’appel de paint n’a lieu que si cette mise en premier plan rend visible une partie de l’applet qui était
cachée.
L’applet s’exécute dans l’emplacement que lui a réservé le navigateur qui est vu par l’applet comme une fenêtre
l’est par une application. Chaque fois que le navigateur doit rafraîchir le contenu de cet emplacement il fait appel
à la méthode paint de l’applet. Il faudra donc parfois surcharger cette méthode :
public void paint(Graphics fenetre) {
// tout ce qui doit être affiché dans la fenêtre se fait ici en utilisant les possibilités de la classe Graphics
}
Remarque : Lorsque l'on utilise une interface dans l'applet, la surcharge de paint est inutile puisque la méthode
paint héritée de JApplet se charge de l'affichage de l'interface.
Remarque : Pour les images l'URL utilisée est en général obtenue à partir de celle où se trouve l'applet. On peut
donc la créer en utilisant : new URL(getCodeBase(), chemin-et-nom_du_fichier_image);
Bien entendu il faudra prévoir un try catch pour traiter l'exception de classe MalformedURLException liée au
new.
Pour les sons on utilise la classe AudioClip. Elle permet de récupérer des sons que l'on peut ensuite jouer. Les
fichiers son utilisables sont ceux au format SUN (.au), Windows (.wav), Macintosh (.aif) et midi (.mid). Ses
principales méthodes sont :
AudioClip getAudioClip(URL) retourne le son contenu dans le fichier spécifié par l’URL donnée en
paramètre. On peut ensuite jouer ce son en utilisant sa méthode play().
AudioClip getAudioClip(URL,String) retourne le son situé dans l’URL donnée en premier paramètre et
dont le nom est spécifié en second paramètre. On peut ensuite jouer ce son en utilisant sa méthode play().
AudioClip newAudioClip(URL) retourne le son spécifié par l’URL donnée en paramètre. Cette méthode
présente l'avantage d'être statique c'est à dire de pouvoir être appelée par n'importe quel objet et pas
seulement par un objet de classe Applet ou dérivée. On l'appelle par : Applet.newAudioClip On peut
ensuite jouer ce son en utilisant sa méthode play().
play(URL) déclenche la diffusion du son spécifié par l’URL donnée en paramètre.
play(URL,String) déclenche la diffusion du son situé dans l’URL donnée en premier paramètre et dont le
nom est spécifié en second paramètre.
Remarque : Pour les sons l'URL utilisée est en général obtenue à partir de celle où se trouve l'applet. On peut
utiliser : getAudioClip(getCodeBase(), chemin-et-nom_du_fichier_son);
JLabel
2.1 Réalisation d’une interface graphique
JList Une applet hérite de la classe Container ce qui lui permet de se
placer dans une page HTML. On placera ensuite dans cette zone des
JMenubar
composants comme des boutons, des zones de saisie etc. Tous ces
JPopupMenu composants appartiennent à des classes héritant de la classe
JComponent dont nous allons maintenant décrire les principales
JScrollbar méthodes.
JProgressbar
2.1.1 Les classes Component et JComponent
JSlider C’est de là que dérivent tous les composants de l’interface
JToolBar
graphique. La classe JComponent hérite de Component et propose
quelques méthodes supplémentaires. Les principales méthodes de
JToolTip ces classes sont les suivantes :
JColorChooser Celles propres à la classe Component :
JTextComponent
boolean isShowing() indique si le composant est visible à
l ’écran
void setVisible(boolean) rend le composant visible on non à
JTextArea l’écran
JTextField
void requestFocus() rend le composant actif (les saisies au
clavier le concernent). Il faut que le composant soit visible.
JFileChooser boolean isEnabled() indique si le composant est sensible aux
événements
JAbstractButton void setEnabled(boolean) permet de rendre le composant
sensible ou pas aux événements
JToggleButton Color getForeground() retourne la couleur utilisée pour
dessiner et écrire dans ce composant
void setForeground(Color) définit la couleur de tracé
JCheckBox
Color getBackground() retourne la couleur de fond de ce
JRadioButton composant
void setBackground(Color) définit la couleur de fond
JButton Font getFont() retourne la fonte de caractères utilisée par ce
composant
JMenuItem
void setFont(Font) définit la fonte de caractères
Cursor getCursor() retourne le curseur de souris utilisé sur ce
JMenu composant
void setCursor(Cursor) définit le curseur de souris pour ce
JRadioButtonMenuitem
composant
JCheckBoxMenuItem int getWidth() et int getHeight() retournent la largeur et la
hauteur du composant.
void setSize(int , int) définit la taille du composant
int getx() et int gety() retournent les coordonnées de ce composant
void setLocation(int , int) définit la position du composant
Toolkit getToolkit() retourne un objet boîte à outils permettant de gérer les images, les fontes de caractères
etc. (voir 2.2)
Graphics getGraphics() retourne un objet permettant de dessiner (voir 2.2.1)
boolean prepareImage(Image,ImageObserver) provoque le chargement d'une image. Le premier
paramètre une image (par exemple retournée par getImage() voir 2.2.1) et en second le composant qui la
gère (en général c'est celui dont on utilise la méthode prepareImage que l'on désignera donc par this). Ce
Remarque : Cette liste n’est pas exhaustive. Il existe aussi des groupes de cases à cocher, des boîtes de dialogue,
des sous menus etc.
Ces composant possèdent les méthodes communes contenues dans la classe JComponent (voir 2.1.1) auxquelles
viennent s’ajouter leurs méthodes propres. Nous allons maintenant en décrire les principales :
Remarque : le constructeur de JList avec un tableau d'objets permet de créer une liste initialisée mais pas de la
modifier dynamiquement. Pour créer une liste modifiable dynamiquement (ajout/suppression d'éléments) il faut
lui associer un contenu sous forme d'un modèle :
DefaultListModel contenu = new DefaultListModel ();
JList listeDynamique = new JList(contenu);
On pourra alors ajouter des éléments à la liste en les ajoutant au modèle par :
contenu.addelement(Object)
ou contenu.insertElementAt(Object,int)
Et en enlever par :
contenu.removeElementAt(int)
ou contenu.removeElement(Object)
La classe Document
Prend en charge l’édition de texte. Ses principales méthodes sont :
int getLength() qui retourne le nombre de caractères du document
String getText(int,int) qui retourne la partie du texte qui commence à la position donnée en premier
paramètre et dont la longueur est donnée par le second paramètre
void removeText(int,int) qui supprime la partie du texte qui commence à la position donnée en premier
paramètre et dont la longueur est donnée par le second paramètre
Remarque : Ces deux dernières méthodes peuvent lever une exception de classe BadLocationException si les
paramètres sont incorrects
La classe JTextField
Elle permet de définir des zones de texte sur une seule ligne modifiables Ses principales
méthodes sont :
JTextField(String) qui la crée avec un contenu initial
JTextField(String,int) qui la crée avec un contenu initial et définit le nombre de colones
void addActionListener(ActionListener) pour associer l'objet qui traitera les modifications du texte
(voir 2.1.6.3)
Remarque : Lorsque l’on saisit du texte dans un tel composant celui-ci adapte sa taille au texte saisi au fur et à
mesure. Ce comportement n’est pas toujours souhaitable, on peut l’éviter en lui définissant une taille
préférentielle par sa méthode setPreferredSize et une taille minimale par sa méthode SetMinimumSize
(voir 2.1.1). On procédera comme suit : texte.setPreferedSize(texte.getPreferredSize()) ;
texte.setMinimumSize(texte.getPreferredSize()) ;
La classe JTextArea
Elle permet de définir des zones de texte sur plusieurs lignes modifiables sans ascenseurs (pour disposer
d’ascenseurs il faut faire appel à un contenant en possédant voir 2.1.3.4). Ses principales méthodes sont :
JTextArea(String) qui crée une zone de texte avec un contenu initial
JTextArea(String,int,int) qui crée une zone de texte avec un contenu initial et
précise le nombre de lignes et de colonnes de la zone de texte
void append(String) qui ajoute la chaîne à la fin du texte affiché
void insert(String,int) qui insère la chaîne au texte affiché à partir du rang donné
void setTabSize(int) qui définit la distance entre tabulations.
void setLineWrap(boolean) qui détermine si les lignes longues doivent ou non
être repliées.
void setWrapStyleWord(boolean) qui détermine si les lignes sont repliées en fin de mot (true) ou pas.
Remarque : Lorsque l’on saisit du texte dans une zone de texte celle-ci adapte sa taille au texte saisi au fur et à
mesure. Ce comportement n’est pas toujours souhaitable, on peut l’éviter en mettant ce composant dans un
JScrollPane pour disposer d’ascenseurs.
La classe JPanel
Elle correspond au contenant le plus simple. Elle offre deux constructeurs :
JPanel() qui se contente de créer l’objet.
JPanel(LayoutManager) qui accepte en paramètre un objet de placement et construit le JPanel associé à cet
objet.
La classe JScrollPane
C’est une version améliorée de JPanel qui possède des ascenseurs de défilement vertical et horizontal. Ses
principales méthodes sont :
JScrollPane() qui crée un JScrollPane vide
JScrollPane(Component) qui crée un JScrollPane contenant un seul composant (celui passé en paramètre).
JScrollPane(int,int) qui crée un JScrollPane vide en précisant le comportement des ascenseurs (voir
ci_dessous).
JScrollPane(Component,int,int) qui crée un JScrollPane contenant un seul composant (celui passé en
paramètre) en précisant le comportement des ascenseurs.
Le premier entier définit le comportement de l’ascenseur vertical, il peut prendre les valeurs :
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED (l’ascenseur n’apparaît que s’il est nécessaire),
JScrollPane.VERTICAL_SCROLLBAR_NEVER (pas d’ascenseur) ou
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS (l’ascenseur est toujours présent).
Le dernier entier définit le comportement de l’ascenseur horizontal, il peut prendre les valeurs :
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED (l’ascenseur n’apparaît que s’il est
nécessaire), JScrollPane.HORIZONTAL_SCROLLBAR_NEVER (pas d’ascenseur) ou
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS (l’ascenseur est toujours présent).
La classe JLayeredPane
Elle permet de définir des couches superposées. Quand on ajoute un élément à un JLayeredPane, on précise à
quelle profondeur il se situe. Les couches de profondeur moindre cachent les autres. Ses principales méthodes
sont :
void add(Component,Integer) qui ajoute ce composant au contenant dans une couche donnée. Plus le
second paramètre est élevé moins la couche est profonde.
int getLayer(Component) qui retourne le numéro de la couche où se trouve le composant passé en
paramètre.
void setLayer(Component,int) qui déplace le composant dans la couche dont le numéro est passé en second
paramètre.
int lowestLayer() qui retourne le numéro le plus élevé correspondant à une couche occupée.
int highesterLayer() qui retourne le numéro le plus faible correspondant à une couche occupée.
La classe JTabbedPane
Elle permet de placer les éléments selon des onglets. Ses principales méthodes sont :
JTabbedPane(int) crée l’objet en précisant où se placent les onglets. Le paramètre peut prendre les valeurs :
JTabbedPane.TOP, JTabbedPane.BOTTOM, JTabbedPane.LEFT ou JTabbedPane.RIGHT.
void addTab(String,Component) ajoute un onglet dont le libellé est donné par le premier paramètre et y
place le composant donné en second paramètre
void addTab(String,ImageIcon,Component) ajoute un onglet dont le libellé est donné par le premier
paramètre et auquel est associée une icône (second paramètre) et y place le composant donné en dernier
paramètre
void addTab(String,ImageIcon,Component,String) ajoute un onglet dont le libellé est donné par le
premier paramètre et auquel est associée une icône (second paramètre) et y place le composant donné en
troisième paramètre. Le dernier est une bulle d’aide qui apparaîtra lorsque la souris passera sur l’onglet.
void insertTab(String,ImageIcon,Component,String,int) insère un onglet dont le libellé est donné par le
premier paramètre et auquel est associée une icône (second paramètre) et y place le composant donné en
troisième paramètre. Le quatrième paramètre est une bulle d’aide qui apparaîtra lorsque la souris passera
sur l’onglet. Le dernier indique la position à laquelle doit être inséré l’onglet.
void removeTabAt(int) qui supprime l’onglet désigné.
void setIconAt(int , ImageIcon) associe une icône à l'onglet désigné
int getSelectedIndex() qui retourne le numéro de l'onglet sélectionné
void setSelectedIndex(int) qui sélectionne l'onglet dont le numéro est passé en paramètre
int getTabCount() qui retourne le nombre d'onglets disponibles.
int indexOfTab(ImageIcon) retourne le premier onglet associé à l'icône passée en paramètre
int indexOfTab(String) retourne le premier onglet associé au nom passé en paramètre
Remarque : les deux méthodes précédentes peuvent lever une exception de classe
ArrayIndexOutOfBoundsException si la position de l’onglet n’est pas correcte.
La classe BorderLayout
Cette classe définit 5 zones. Les composants y sont ajoutés par la méthode add(Component, int) dont le second
paramètre indique dans quelle zone doit être placé le composant. Ce paramètre peut prendre les valeurs :
BorderLayout.NORTH, BorderLayout.SOUTH, BorderLayout.EAST, BorderLayout.WEST ou
BorderLayout.CENTER
La classe FlowLayout
Cette classe permet un placement ligne par ligne. Elle possède un constructeur qui définit la façon dont les
composants seront ajoutés par la suite à l'aide de la méthode add(Component). Ce constructeur accepte trois
paramètres selon le modèle suivant FlowLayout(int,int,int). Le premier paramètre indique comment seront
alignés les composants, il peut prendre les valeur suivantes : FlowLayout.CENTER, FlowLayout.LEFT ou
FlowLayout.RIGHT. Le deuxième paramètre donne l'espacement horizontal entre composants (en pixels). Le
dernier paramètre donne l'espacement vertical entre composants (en pixels).
La classe GridLayout
Cette classe permet un placement sur un tableau. Elle possède un constructeur qui définit les dimensions de ce
tableau et les espacements entre les composants. Ce constructeur accepte quatre paramètres selon le modèle
suivant GridLayout(int,int,int,int). Le premier paramètre est le nombre de lignes du tableau tandis que le
deuxième est le nombre de colonnes du tableau.. Le troisième paramètre donne l'espacement horizontal entre
composants (en pixel). Le dernier paramètre donne l'espacement vertical entre composants (en pixels). Toutes les
cases du tableau ont la même taille (celle déterminée par le composant le plus grand).
Les composants seront ajoutés par la suite à l'aide de la méthode add(Component) qui remplira le tableau ligne
par ligne.
La classe GridBagLayout
Cette classe permet un contrôle plus précis du placement des composants grâce à l'utilisation d'un objet de classe
GridBagConstraints qui permet de définir les règles de placement pour chaque composant. GridBagLayout
permet de placer les composants dans une grille dont les cases sont numérotées de gauche à droite et de haut en
bas à partir de 0. Chaque composant peut occuper une ou plusieurs cases et la taille des cases est ajustée en
fonction des composants qu’elles contiennent. Toutes les cases d’une même ligne ont la même hauteur qui
correspond à la hauteur nécessaire pour placer le composant le plus haut de cette ligne. De même toutes les cases
d’une même colonne ont la même largeur qui correspond à la largeur nécessaire pour placer le composant le plus
large de cette colonne.
Pour placer un composant il faut suivre la procédure suivante :
- appeler la méthode setLayout avec en paramètre le nom de l’objet de placement de classe GridBagLayout
- préparer un objet de classe GridBagConstraints permettant de définir la position, la taille et le
comportement de l’objet à placer
- utiliser la méthode setConstraints de l’objet de placement en lui donnant en paramètre le composant
d’interface graphique à placer et l’objet de classe GridBagConstraints précédemment préparé.
- ajouter ce composant à l’interface graphique par la méthode add
La classe CardLayout
Cette classe permet d'organiser les éléments de l'interface en pages superposées. Il n'y a pas d'onglets mais il est
possible à l'applet de faire apparaître l'une des pages en premier plan. Si l'on veut que l'utilisateur puisse changer
de page, il faudra prévoir dans chaque page des composants dont l'action associée consiste à changer de page.
Lorsque l'on a créé un objet de classe CardLayout (construction sans paramètre) on va le définir comme objet
de placement du contenant (méthode setLayout de ce dernier). Ensuite de quoi il suffit d'ajouter les pages en
définissant pour chacune l'élément qu'elle contient (cet élément peut être un simple composant ou un contenant
de classe Panel si l'on veut pouvoir mettre plus d'un composant par page). L'addition d'un élément à une page se
fait par la méthode add du contenant auquel a été associé l'objet de classe CardLayout par la méthode :
void add(String,Component) où le premier paramètre est le nom de la page et le second l'élément qu'elle
contient
La mise en premier plan d'une page donnée se fera grâce à la méthode show de l'objet de classe CardLayout :
void show(Container, String) où le premier paramètre est le contenant auquel est associé l'objet de classe
CardLayout et le second paramètre le nom de la page à mettre en premier plan.
Bouton
Nom
Bouton
Zone de Valider
texte
Bouton
Prénom
Liste Case à
cocher :
Marié
de
prénoms Titre
import javax.swing.*;
import java.awt.*;
// Ajout d'un JPanel pour placer les autres composants dans la case
// du milieu en bas et création d'un objet de placement pour ce JPanel
GridBagLayout panelPlaceur=new GridBagLayout(); // objet de placement pour le panel
GridBagConstraints panelContraintes=new GridBagConstraints(); // règles de placement
Panel caseDuBas=new Panel(panelPlaceur); //création du Panel avec son objet de placemt
Les écouteurs seront obtenus par héritage de la classe modèle. Les classes modèles et les méthodes associées à
ces événements sont décrits par le tableau ci-dessous :
ATTENTION : Lorsqu'un événement clavier se produit, il est envoyé au composant actif. Un composant peut être
rendu actif par l'utilisateur (à la souris) ou en utilisant sa méthode requestFocus() voir (2.1.1)
Pour les événements clavier ou souris il est possible de tester le contexte précis de l'événement (touches
modificatrices du clavier et boutons de la souris). Pour cela on utilise la méthode getModifiers() de l ’événement
qui retourne un entier représentant ce contexte. Les tests suivants indiquent comment interprêter cette valeur (le
nom evt désigne l’événement clavier ou souris testé , il est de classe KeyEvent ou MouseEvent) :
if ((evt.getModifiers() & InputEvent.SHIFT_MASK)!=0) // la touche shift est appuyée
if ((evt.getModifiers() & InputEvent.ALT_MASK)!=0) // la touche alt est appuyée
if ((evt.getModifiers() & InputEvent.CTRL_MASK)!=0) // la touche control est appuyée
if ((evt.getModifiers() & InputEvent.BUTTON1_MASK)!=0) // le bouton gauche de la souris est enfoncé
if ((evt.getModifiers() & InputEvent.BUTTON3_MASK)!=0) // le bouton droit de la souris est enfoncé
La méthode void consume() est utilisée pour les événements clavier et souris. Elle permet de signaler à java que
l’événement a été traité et qu’il n’est donc plus nécessaire de le diffuser.
Chaque composant est susceptible de réagir à certains de ces événements mais pas à tous. Le tableau suivant
donne, pour chaque composant, les événements auxquels il est sensible :
Remarque : Les croix marquées en gras correspondent aux événements généralement traités pour ce type de
composant. Par exemple l'événement 'changement' pour un JButton est produit quand on enfonce le bouton et
quand on le lâche alors que l'événement 'action' est produit quand on clique le bouton ce qui est généralement
l'utilisation normale d'un tel composant.
Les écouteurs seront obtenus par une classe implémentant l'interface associée. Ces interfaces et les méthodes
associés à ces événements sont décrits par le tableau ci-dessous :
ATTENTION : lorsque l'interface de contrôle possède plusieurs méthodes, toutes doivent être écrites même si
elles sont vides.
Par exemple pour définir la classe associée aux clics sur le bouton ‘Valider’ de notre interface graphique du 2.1.4
il faudra faire :
private class ActionValider implements ActionListener {
public synchronized void actionPerformed(ActionEvent e) {
// action associée au clic du bouton valider
// le paramètre permet de savoir quel événement s’est produit et dans quelle conditions
}
}
Remarque : Cette classe sera une classe interne à celle qui définit l’applet.
Pour associer ceci au bouton il faudra ajouter, dans le constructeur de l’applet (après la création de l’objet
correspondant à ce bouton), la ligne suivante :
valider.addActionListener(new actionValider());
Pour aller plus loin il faudra se reporter à la documentation de java pour y trouver plus d’informations sur les
classes de composants et d’événements ainsi que toutes les classes qui n’ont pas été évoquées ici.
Pour utiliser la documentation enligne se reporter à l'URL :
java.sun.com/j2se/1.4.2/docs/api
Chaque fois que le composant devra être dessiné ou redessiné à l’écran java fera appel à sa méthode update.
Cette méthode efface le fond puis le remplit avec sa couleur et enfin invoque la méthode paint du composant. Il
est possible de surcharger, dans une classe dérivée de celle du composant, les méthodes update et/ou paint pour
les doter d’un comportement particulier. Elles sont définies comme suit :
public void update (Graphics g)
public void paint (Graphics g)
Lorsque l’on désire rafraîchir l’affichage d’un composant en dehors des instants où java le fait, on peut appeler la
méthode repaint dont le fonctionnement est le même que celui décrit ci-dessus (appel de update etc.).
L’utilisation directe d’un objet de classe Canvas pose le problème de la mise à jour de l’affichage puisque la
méthode paint d'origine ne fait rien. Il est donc nécessaire de créer sa propre classe dérivée de Canvas pour la
doter d’une méthode paint. La solution la plus générale est de créer une classe possédant une zone de mémoire
dans laquelle seront faits les dessins. La méthode paint de cette classe se contentera alors d’afficher cette zone
de mémoire à l’écran. On peut obtenir une telle zone de mémoire pour tout composant par la méthode
createImage. De plus, afin d’éviter les clignotements, on peut réécrire la méthode update de façon à ce qu’elle
n’efface pas le fond. La classe définie ci-dessous permet ce fonctionnement :
import java.awt.*;
import javax.swing.*;
boutons de choix de la
météo
Tout d’abord le fichier HTML contenant cette applet (c’est le strict minimum) :
<html>
<head> textes HTML
<title>METEO</title>
</head>
<body>
<h1>Montaury</h1>
<hr>
<APPLET CODE="Meteo.class" CODEBASE="applets" WIDTH="307" HEIGHT="250">
</APPLET>
<hr>
<h1>Sale temps</h1> Applet
</body>
</html>
import javax.swing.*;
import java.awt.*;
import java.net.*;
import java.awt.event.*;
// placement de l'image
pays = new Paysage(fond); //le processus qui fait la météo
contraintes.gridx=0; contraintes.gridy=0; // coordonnées 0,0
contraintes.gridwidth=3; contraintes.gridheight=1; // occupe 3 cases de largeur
contraintes.fill=GridBagConstraints.BOTH; // occupe toute la place disponible
contraintes.anchor=GridBagConstraints.CENTER;
contraintes.weightx=100; contraintes.weighty=100; // récupère toute la place
contraintes.insets=new Insets(1,1,1,1);
contraintes.ipadx=2; contraintes.ipady=2;
placeur.setConstraints(pays, contraintes);
getContentPane().add(pays); // ajout à l'interface
La zone graphique :
La zone graphique est un objet de classe "Paysage" qui hérite de Canvas de façon à pouvoir être inséré dans
l'interface de l'applet et est un processus java pour faire l'animation des gouttes de pluie ou des flocons de neige.
Elle utilise une collection (Vector) "d'objets volants" qui seront, selon le cas, des gouttes de pluie ou des flocons
de neige. Pour l'affichage elle utilise un objet de classe Image qui est un buffer en mémoire. Dans ce buffer elle
dessinera l'image de fond puis ajoutera les objets volants. Lorsque l'image est prête, elle est affichée dans la zone
graphique du Canvas. Ceci est obtenu en surchargeant la méthode paint de Canvas.
Le code de la classe Paysage est le suivant :
import java.awt.*;
import javax.swing.*;
import java.util.*;
/* Classe processus qui ajoute des gouttes de pluie ou des flocons de neige sur une image
*/
public class Paysage extends Canvas implements Runnable {
Paysage(ImageIcon img) {
table = new Vector(0,1); // création de la collection de gouttes ou de flocons
mem = null;
photo = img;
processus = null;
delai = 50;
}
import java.awt.*;
import java.util.*;
/* Classe mère des objets volants : flocons ou gouttes de pluie */
public class ObjetVolant {
protected int x,y; //position de l'objet
protected double angle; //direction de déplacement
protected int vitesse; //vitesse de déplacement
private Random tirage; //pour tirer des valeurs au hasard
Enfin pour les gouttes de pluie et les flocons de neige on utilise les classes suivantes :
import java.awt.*;
public class Pluie extends ObjetVolant {
int longueur; // les gouttes de pluie apparaissent comme des traits de cette longueur
import java.awt.*;
public class Flocon extends ObjetVolant {