Développons en Java 2.30 | |
Copyright (C) 1999-2022 Jean-Michel DOUDOUX | (date de publication : 15/06/2022) |
|
Niveau : | Intermédiaire |
Technologie legacy Ce chapitre est conservé pour des raisons historiques |
Une applet est un programme Java qui s'exécute dans un logiciel de navigation supportant Java ou dans l'appletviewer du JDK.
Il est recommandé de tester les applets avec l'appletviewer car les navigateurs peuvent prendre l'applet contenu dans leurs caches plutôt que la dernière version compilée. |
Les applets ont historiquement permis de réaliser des animations dans les pages web avant de voir arriver d'autres solutions comme Flash.
Attention : pour améliorer leur sécurité, les navigateurs modernes prévoient à terme de retirer le support des plugins de type NPAPI. Ceci conduit à l'arrêt du support de technologies reposant sur des plugins pour exécuter du code comme Flash, Silverlight et bien évidemment Java. Fin 2015, les principaux navigateurs ont annoncé l'arrêt ou une date de l'arrêt du support par les navigateurs. Les applications reposant sur des applets doivent envisager de migrer vers d'autres technologies supportées par les navigateurs. Ainsi à partir de Java 9, l'API Applet est deprecated. Son éviction interviendra dans une version ultérieure de Java. |
Ce chapitre contient plusieurs sections :
Dans une page HTML, il faut utiliser le tag APPLET avec la syntaxe suivante :
<APPLET CODE=« Exemple.class » WIDTH=200 HEIGHT=300 > </APPLET>
Le nom de l'applet est indiqué entre guillemets à la suite du paramètre CODE.
Les paramètres WIDTH et HEIGHT fixent la taille de la fenêtre de l'applet dans la page HTML. L'unité est le pixel. Il est préférable de ne pas dépasser 640 * 480 (VGA standard).
Le tag APPLET peut comporter les attributs facultatifs suivants :
Tag | Rôle |
CODEBASE | permet de spécifier le chemin relatif au dossier de
la page contenant l'applet. Ce paramètre suit le paramètre
CODE.
Exemple : CODE=nomApplet.class CODEBASE=/nomDossier |
HSPACE et VSPACE | permettent de fixer la distance en pixels entre l'applet et le texte |
ALT | affiche le texte spécifié par le paramètre lorsque le navigateur ne supporte pas Java ou que son support est désactivé. |
Le tag PARAM permet de passer des paramètres à l'applet. Il doit être inclus entre les tags APPLET et /APPLET.
<PARAM nomParametre value=« valeurParametre »> </APPLET>
La valeur est toujours passée sous forme de chaîne de caractères donc entourée de guillemets.
Exemple : <APPLET code=« Exemple.class » width=200 height=300>
Le texte contenu entre <APPLET> et </APPLET> est affiché si le navigateur ne supporte pas java.
Le mécanisme d'initialisation d'une applet se fait en deux temps :
Une classe dérivée de la classe java.applet.Applet hérite de méthodes qu'il faut redéfinir en fonction des besoins et doit être déclarée public pour fonctionner.
En général, il n'est pas nécessaire de faire un appel explicite aux méthodes init(), start(), stop() et destroy() : le navigateur se charge d'appeler ces méthodes en fonction de l'état de la page HTML contenant l'applet.
Cette méthode permet l'initialisation de l'applet : elle n'est exécutée qu'une seule et unique fois après le chargement de l'applet.
Cette méthode est appelée automatiquement après le chargement et l'initialisation (par la méthode init()) lors du premier affichage de l'applet.
Le navigateur appelle automatiquement la méthode lorsque l'on quitte la page HTML. Elle interrompt les traitements de tous les processus en cours.
Elle est appelée après l'arrêt de l'applet ou lors de l'arrêt de la machine virtuelle. Elle libère les ressources et détruit les threads restants
Elle est appelée à chaque rafraîchissement de l'écran ou appel de la méthode repaint(). Elle efface l'écran et appelle la méthode paint(). Ces actions provoquent souvent des scintillements. Il est préférable de redéfinir cette méthode pour qu'elle n'efface plus l'écran :
Exemple : |
public void update(Graphics g) { paint (g);} |
Cette méthode permet d'afficher le contenu de l'applet à l'écran. Ce rafraîchissement peut être provoqué par le navigateur ou par le système d'exploitation si l'ordre des fenêtres ou leur taille a été modifié ou si une fenêtre recouvre l'applet.
Exemple : |
public void paint(Graphics g) |
La méthode repaint() force l'utilisation de la méthode paint().
Il existe des méthodes dédiées à la gestion de la couleur de fond et de la couleur de premier plan
La méthode setBackground(Color), héritée de Component, permet de définir la couleur de fond d'une applet. Elle attend en paramètre un objet de la classe Color.
La méthode setForeground(Color) fixe la couleur d'affichage par défaut. Elle s'applique au texte et aux graphiques.
Les couleurs peuvent être spécifiées de trois manières différentes :
utiliser les noms standards prédéfinis | Color.nomDeLaCouleur
Les noms prédéfinis de la classe Color sont : black, blue, cyan, darkGray, gray, green, lightGray, magenta, orange, pink, red, white, yellow |
||
utiliser 3 nombres de type entier représentant le RGB |
(Red,Green,Blue : rouge,vert, bleu)
|
||
utiliser 3 nombres de type float utilisant le système HSB | (Hue, Saturation, Brightness : teinte, saturation, luminance). Ce système est moins répandu que le RGB mais il permet notamment de modifier la luminance sans modifier les autres caractéristiques
dans ce cas 0.0,0.0,0.0 représente le noir et 1.0,1.0,1.0 représente le blanc. |
L'origine des coordonnées en Java est le coin supérieur gauche. Elles s'expriment en pixels avec le type int.
La détermination des dimensions d'une applet se fait de la façon suivante :
Exemple ( code Java 1.0 ) : |
Dimension dim = size();
int applargeur = dim.width;
int apphauteur = dim.height; |
Avec le JDK 1.1, il faut utiliser getSize() à la place de size().
Exemple ( code Java 1.1 ) : |
public void paint(Graphics g) {
super.paint(g);
Dimension dim = getSize();
int applargeur = dim.width;
int apphauteur = dim.height;
g.drawString("width = "+applargeur,10,15);
g.drawString("height = "+apphauteur,10,30);
} |
Ces méthodes renvoient respectivement l'emplacement de l'applet sous forme d'adresse Web ou de dossier et l'emplacement de la page HTML qui contient l'applet.
Exemple : |
public void paint(Graphics g) {
super.paint(g);
g.drawString("CodeBase = "+getCodeBase(),10,15);
g.drawString("DocumentBase = "+getDocumentBase(),10,30);
} |
Affiche un message dans la barre de statut de l'applet
Exemple : |
public void paint(Graphics g) {
super.paint(g);
showStatus("message à afficher dans la barre d'état");
} |
Permet de fournir des informations concernant l'auteur, la version et le copyright de l'applet
Exemple : |
static final String appletInfo = " test applet : auteur, 1999 \n\nCommentaires";
public String getAppletInfo() {
return appletInfo;
} |
Pour voir les informations, il faut utiliser l'option info du menu Applet de l'appletviewer.
Cette méthode permet de fournir des informations sur les paramètres reconnus par l'applet
Le format du tableau est le suivant :
{ {nom du paramètre, valeurs possibles, description} , ... }
Exemple : |
static final String[][] parameterInfo =
{ {"texte1", "texte1", " commentaires du texte 1" } ,
{"texte2", "texte2", " commentaires du texte 2" } };
public String[][] getParameterInfo() {
return parameterInfo;
} |
Pour voir les informations, il faut utiliser l'option info du menu Applet de l'appletviewer.
Elle retourne la zone graphique d'une applet : utile pour dessiner dans l'applet avec des méthodes qui ne reçoivent pas le contexte graphique en paramètres (ex : mouseDown() ou mouseDrag()).
Cette méthode permet l'accès à des fonctionnalités du navigateur.
Cette méthode permet d'attacher l'applet au navigateur.
Cette interface fournit le comportement nécessaire à une applet pour devenir un thread.
Les méthodes start() et stop() de l'applet peuvent démarrer et arrêter un thread pour limiter l'usage des ressources machines lorsque la page contenant l'applet est inactive.
Cette interface permet à l'applet de répondre aux actions de l'utilisateur avec la souris
La méthode actionPerformed() définit les traitements associés aux événements.
Exemple ( code Java 1.1 ) : |
public void actionPerformed(ActionEvent evt) { ... } |
Pour plus d'information, voir le chapitre «L'interception des actions de l'utilisateur».
Exemple ( code Java 1.1 ) : |
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class AppletMouse extends Applet implements MouseListener {
int nbClick = 0;
public void init() {
super.init();
addMouseListener(this);
}
public void mouseClicked(MouseEvent e) {
nbClick++;
repaint();
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void paint(Graphics g) {
super.paint(g);
g.drawString("Nombre de clics : " + nbClick, 10, 10);
}
} |
Pour plus d'information, voir le chapitre sur «L'interception des actions de l'utilisateur».
La méthode getParameter() retourne les paramètres écrits dans la page HTML. Elle retourne une chaîne de caractères de type String.
Exemple : |
Sting parametre;
parametre = getParameter(" nom-parametre "); |
Si le paramètre n'est pas renseigné dans la page HTML alors getParameter() retourne null
Pour utiliser les valeurs des paramètres, il sera souvent nécessaire de faire une conversion de la chaîne de caractères dans le type voulu en utilisant les Wrappers
Exemple : |
String taille;
int hauteur;
taille = getParameter(" hauteur ");
Integer temp = new Integer(taille)
hauteur = temp.intValue(); |
Exemple : |
int vitesse;
String paramvitesse = getParameter(" VITESSE ");
if (paramvitesse != null) vitesse = Integer.parseInt(paramVitesse);
// parseInt ne fonctionne pas avec une chaîne vide |
Attention : l'appel à la méthode getParameter() dans le constructeur pas défaut lève une exception de type NullPointerException. |
Exemple : |
public MonApplet() {
String taille;
taille = getParameter(" message ");
} |
Java supporte deux standards :
Pour la manipulation des images, le package nécessaire est java.awt.image.
La méthode getImage() possède deux signatures : getImage(URL url) et getImage (URL url, String name).
On procède en deux étapes : le chargement puis l'affichage. Si les paramètres fournis à getImage ne désignent pas une image, aucune exception n'est levée.
La méthode getImage() ne charge pas de données sur le poste client. Celles-ci seront chargées quand l'image sera dessinée pour la première fois.
Exemple : |
public void paint(Graphics g) {
super.paint(g);
Image image=null;
image=getImage(getDocumentBase( ), "monimage.gif"); //chargement de l'image
g.drawImage(image, 40, 70, this);
} |
Le sixième paramètre de la méthode drawImage() est un objet qui implémente l'interface ImageObserver. ImageObserver est une interface déclarée dans le package java.awt.image qui sert à donner des informations sur le fichier image. Souvent, on indique représentant l'applet elle-même this à la place de cet argument. La classe ImageObserver détecte le chargement et la fin de l'affichage d'une image. La classe Applet ce charge automatiquement de faire ces actions d'où le fait de mettre this.
Pour obtenir les dimensions de l'image à afficher on peut utiliser les méthodes getWidth() et getHeight() qui retourne un nombre entier en pixels.
Exemple : |
int largeur = 0;
int hauteur = 0;
largeur = image.getWidth(this);
hauteur = image.getHeight(this); |
Seul le format d'extension .AU de Sun est supporté par Java. Pour utiliser un autre format, il faut le convertir.
La méthode play() permet de jouer un son.
Exemple : |
import java.net.URL;
...
try {
play(new URL(getDocumentBase(), " monson.au "));
} catch (java.net.MalformedURLException e) {} |
La méthode getDocumentBase() détermine et renvoie l'URL de l'applet.
Ce mode d'exécution n'est valable que si le son n'est à reproduire qu'une seule fois, sinon il faut utiliser l'interface AudioClip.
Avec trois méthodes, l'interface AudioClip facilite l'utilisation des sons :
Exemple : |
import java.applet.*;
import java.awt.*;
import java.net.*;
public class AppletMusic extends Applet {
protected AudioClip aC = null;
public void init() {
super.init();
try {
AppletContext ac = getAppletContext();
if (ac != null)
aC = ac.getAudioClip(new URL(getDocumentBase(), "spacemusic.au"));
else
System.out.println(" fichier son introuvable ");
} catch (MalformedURLException e) {}
aC.loop();
}
} |
Pour utiliser plusieurs sons dans une applet, il suffit de déclarer plusieurs variables AudioClip.
L'objet retourné par la méthode getAudioClip() est un objet qui implémente l'interface AudioClip définit dans la machine virtuelle car il est très dépendant du système de la plate-forme d'exécution.
Exemple : |
import java.applet.*;
import java.awt.*;
public class AppletAnimation extends Applet implements Runnable {
Thread thread;
protected Image tabImage[];
protected int index;
public void init() {
super.init();
// chargement du tableau d'images
index = 0;
tabImage = new Image[2];
for (int i = 0; i < tabImage.length; i++) {
String fichier = new String("monimage" + (i + 1) + ".gif ");
tabImage[i] = getImage(getDocumentBase(), fichier);
}
}
public void paint(Graphics g) {
super.paint(g);
// affichage de l'image
g.drawImage(tabImage[index], 10, 10, this);
}
public void run() {
// traitements exécutés par le thread
while (true) {
repaint();
index++;
if (index >= tabImage.length)
index = 0;
try {
thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void start() {
// démarrage du thread
if (thread == null) {
thread = new Thread(this);
thread.start();
}
}
public void stop() {
// arrêt du thread
if (thread != null) {
thread.stop();
thread = null;
}
}
public void update(Graphics g) {
// la redéfinition de la méthode permet d'éviter les scintillements
paint(g);
}
} |
La surcharge de la méthode paint() permet d'éviter le scintillement dû à l'effacement de l'écran et à son rafraîchissement. Dans ce cas, seul le rafraîchissement est effectué.
Il faut rajouter une classe main à l'applet, définir sa fenêtre d'affichage, appeler les méthodes init() et start() et afficher la fenêtre.
Exemple ( code Java 1.1 ) : |
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class AppletApplication extends Applet implements WindowListener {
public static void main(java.lang.String[] args) {
AppletApplication applet = new AppletApplication();
Frame frame = new Frame("Applet");
frame.addWindowListener(applet);
frame.add("Center", applet);
frame.setSize(350, 250);
frame.show();
applet.init();
applet.start();
}
public void paint(Graphics g) {
super.paint(g);
g.drawString("Bonjour", 10, 10);
}
public void windowActivated(WindowEvent e) { }
public void windowClosed(WindowEvent e) { }
public void windowClosing(WindowEvent e) {
System.exit(0);
}
public void windowDeactivated(WindowEvent e) { }
public void windowDeiconified(WindowEvent e) { }
public void windowIconified(WindowEvent e) { }
public void windowOpened(WindowEvent e) { }
} |
Une applet est une application Java hébergée sur une machine distante (un serveur Web) et qui s'exécute, après chargement, sur la machine cliente équipée d'un navigateur. Ce navigateur contrôle les accès de l'applet aux ressources locales et ne les autorisent pas systématiquement : chaque navigateur définit sa propre règle.
Le modèle classique de sécurité pour l'exécution des applets, recommandé par Sun, distingue deux types d'applets : les applets non dignes de confiance (untrusted) qui n'ont pas accès aux ressources locales et externes, les applets dignes de confiance (trusted) qui ont l'accès. Dans ce modèle, une applet est par défaut untrusted.
La signature d'une applet permet de désigner son auteur et de garantir que le code chargé par le client est bien celui demandé au serveur. Cependant, une applet signée n'est pas forcément digne de confiance.
|
La suite de ce chapitre sera développée dans une version future de ce document
|
|