Fascicule de cours 2 - Laboratoire d`Informatique de Paris 6

Transcription

Fascicule de cours 2 - Laboratoire d`Informatique de Paris 6
L3 Monnaie - Finance
Algorithmique et initiation à la
programmation java
Seconde partie
O. Auzende
2012-2013
2
Licence Monnaie - finance
2012-2013
Algorithmique et programmation java
LE PAQUETAGE GRAPHIQUE JAVA.AWT ............................................................. 5
Construction d’une fenêtre graphique ................................................................................................................ 5
Création d’interfaces : bilan ................................................................................................................................ 9
LA GESTION DES EVENEMENTS ............................................................................ 9
Principe de la gestion des événements ................................................................................................................. 9
Principe de mise en œuvre en java....................................................................................................................... 9
Programmation ................................................................................................................................................... 10
Application à la fenêtre précédente ................................................................................................................... 11
LES SAISIES ET RECUPERATIONS DE DONNEES ............................................. 14
Champ de saisie de type texte ............................................................................................................................ 14
Choix dans un List ou Choice ............................................................................................................................ 14
Choix d’un Checkbox dans un groupe .............................................................................................................. 15
LES CONVERSIONS ET LES CALCULS................................................................ 15
Donnée = chaîne de caractères ........................................................................................................................... 15
Conversion d’une chaîne ch en nombre ............................................................................................................ 15
Conversions d’un nombre en chaîne ................................................................................................................. 15
Exemple ................................................................................................................................................................ 15
LES APPLETS JAVA .............................................................................................. 17
Qu’est-ce qu’une applet ? ................................................................................................................................... 17
Différences entre applet et application .............................................................................................................. 17
Méthodes d’une applet........................................................................................................................................ 17
Exécution d’une applet ....................................................................................................................................... 18
Méthodes à programmer .................................................................................................................................... 18
Lancement d’une applet ..................................................................................................................................... 18
3
Transformation d’une application en applet .................................................................................................... 18
Création directe d’une applet ............................................................................................................................ 20
Les images dans les applets ................................................................................................................................ 22
Paramètres provenant de la page HTML ......................................................................................................... 25
ANNEXES ................................................................................................................ 30
Noms des variables .............................................................................................................................................. 30
Casse ..................................................................................................................................................................... 30
Mots clés............................................................................................................................................................... 30
Portée des variables ............................................................................................................................................ 30
4
Licence Monnaie - finance
2012-2013
Algorithmique et programmation java
Le paquetage graphique java.awt
Le paquetage java.awt fournit les classes permettant de bâtir des fenêtres graphiques
Component : à l’origine …
En italiques, les classes abstraites (qui n’autorisent
…
Une classe abstraite a pour rôle de proposer des méthodes qui seront
classes
Dans la parabole, ce qui est
En pointillé, les …
…
…
).
par toutes les sous-
au paquetage java.awt, mais dérive d’une classe de java.awt.
Button
Canvas
Checkbox
Choice
Component
Panel
Applet
Container
Dialog
Label
FileDialog
Window
Frame
List
Scrollbar
TextArea
TextComponent
TextField
MenuBar
MenuComponent
MenuItem
BorderLayout
CardLayout
FlowLayout
GridBagConstraints
LayoutManager
GridBagLayout
GridLayout
Construction d’une fenêtre graphique
Les composants (textes, boutons, cases à cocher, etc.) sont insérés dans un objet dérivant de Container
Container contient Panel et Window
o Les objets de type Panel sont
…
permettant de ranger des composants
o Les objets de type Window sont …
Frame est une sous-classe de Window
o Les objets de type Frame sont des fenêtres avec …
5
Chaque container possède un LayoutManager (
sont placés les objets qu’il contient.
…
) qui définit comment
LayoutManager est une interface utilisée par :
o BorderLayout : répartit les objets au Nord, Sud, Est, Ouest et Centre (option par défaut pour
o FlowLayout : les répartit de gauche à droite puis passe à la ligne suivante (option par défaut pour
)
…
)
…
o GridLayout : les répartit dans un tableau dont toutes les cases ont la même taille
Exemples
Appli1.java
import java.awt.* ;
class Appli1 {
public static void main(String arg[]) {
Frame w = new Frame("Exemple") ;
w.add("North", new Label("Un")) ;
w.add("Center", new Label("Deux")) ;
w.add("South", new Label("Trois")) ;
w.show() ;
w.pack() ;
}
}
Gestionnaire par défaut : BorderLayout
Appli2.java
import java.awt.* ;
class Appli2 {
public static void main(String arg[]) {
Frame w = new Frame("Exemple") ;
w.setLayout(new FlowLayout()) ;
w.add(new Label("Un")) ;
w.add(new Label("Deux")) ;
w.add( new Label("Trois")) ;
w.show() ;
w.pack() ;
}
}
Gestionnaire demandé : FlowLayout
Appli3.java
import java.awt.* ;
class Appli3 {
public static void main(String arg[]) {
Frame w = new Frame("Exemple") ;
w.setLayout(new GridLayout(2,2)) ;
w.add(new Label("Un")) ;
w.add(new Label("Deux")) ;
w.add( new Label("Trois")) ;
w.add( new Label("Quatre")) ;
w.show() ;
w.pack() ;
}
}
6
Gestionnaire demandé : GridLayout
Licence Monnaie - finance
2012-2013
Algorithmique et programmation java
Exemple : construction de fenêtre
Les objets de type Panel n’ont pas d’apparence physique propre
o Ils permettent de
…
des composants, dont d’autres …
Chaque Panel gère ses propres composants avec le LayoutManager qui …
La fenêtre correspond ainsi au schéma suivant :
Les différents éléments sont systématiquement déclarés …
Le fichier UtilFenetre.java comporte deux classes :
o la classe Fenetre …
o la classe publique UtilFenetre constituant …
Les deux classes construisent la fenêtre souhaitée.
Mais pour le moment
…
n’est pris en compte sur cette fenêtre.
import java.awt.* ;
class Fenetre extends Frame {
protected Panel p1, p2, p3, p31, p32 ;
protected TextArea txt ;
protected Button bouton1, bouton2, bouton3 ;
protected CheckboxGroup cbg ;
protected Checkbox chb1, chb2, chb3 ;
protected List selection1, selection2 ;
7
Fenetre() {
setLayout(new FlowLayout()) ;
// construction du Panel p1
p1 = new Panel() ;
p1.setLayout(new GridLayout(4,1)) ;
p1.add(new Label("Jour")) ;
selection1 = new List(3) ;
selection1.addItem("lundi") ;
selection1.addItem("mardi") ;
selection1.addItem("mercredi") ;
selection1.addItem("jeudi") ;
selection1.addItem("vendredi") ;
selection1.addItem("samedi") ;
selection1.addItem("dimanche") ;
p1.add(selection1) ;
p1.add(new Label("Horaire")) ;
selection2 = new List(3) ;
selection2.addItem("9 h - 12 h") ;
selection2.addItem("12 h - 15 h") ;
selection2.addItem("15 h - 18 h") ;
selection2.addItem("18 h - 21 h") ;
p1.add(selection2) ;
add(p1) ;
// construction du Panel p2
p2 = new Panel() ;
p2.setLayout(new GridLayout(4,1)) ;
p2.add(new Label("Localisation")) ;
cbg = new CheckboxGroup();
chb1 = new Checkbox("Paris", cbg, true);
p2.add(chb1) ;
chb2 = new Checkbox("Lyon", cbg, false);
p2.add(chb2) ;
chb3 = new Checkbox("Marseille", cbg, false);
p2.add(chb3) ;
add(p2) ;
}
// construction du Panel p3
p3 = new Panel() ;
p3.setLayout(new BorderLayout()) ;
p31 = new Panel();
bouton1 = new Button("Valider") ;
p31.add(bouton1) ;
bouton2 = new Button("Désélectionner") ;
p31.add(bouton2) ;
p3.add("North", p31) ;
txt = new TextArea(5,30) ;
p3.add("Center",txt) ;
p32 = new Panel() ;
bouton3 = new Button("Quitter") ;
p32.add(bouton3) ;
p3.add("South", p32) ;
add(p3) ;
}
// fin du constructeur
// fin de la classe Fenetre
public class UtilFenetre {
// classe utilisateur
public static void main(String args[]) {
Fenetre f = new Fenetre() ;
f.pack() ;
f.show() ;
}
}
8
Licence Monnaie - finance
2012-2013
Algorithmique et programmation java
Création d’interfaces : bilan
Création d’un panel :
Création d’une zone de texte statique :
Création d’une zone de saisie de texte :
Création d’une liste de sélection :
Création d’un objet de type Choice :
Création de checkbox associés dans un groupe :
Création d’un bouton :
La gestion des événements
Principe de la gestion des événements
La fenêtre graphique délègue la gestion des événements à d’autres classes : c’est le modèle MVC (
…
)
Fenêtre =
…
(instance d’une classe)
Prise de décision =
Action =
…
…
…
(instance d’une autre classe)
(instance d’une troisième classe)
Principe de mise en œuvre en java
La fenêtre graphique contient des objets.
On attache un
Window, …)
…
(surveillant) aux objets graphiques que l’on souhaite surveiller (Button, List,
9
o
Il existe différents
…
.
…
dépendant du type d’objet à surveiller, mais tous sont des instances
On a donc besoin d’une classe implémentant les interfaces nécessaires ; on appellera cette classe la classe …
Un objet de la classe Adaptateur, étant de fait devenu un listener, sera alors automatiquement averti des
événements (event) qui se produisent sur …
Il décidera alors des actions à entreprendre en fonction …
Il donnera l’ordre à un
…
d’effectuer ces actions.
L’exécuteur sera un objet d’une classe que l’on appellera la classe
…
Il exécutera les actions demandées par l’objet Adaptateur et
en modifier l’apparence.
…
pour
Illustration par deux exemples
Clic sur un bouton contenu dans la fenêtre
Clic sur le bouton de fermeture de la fenêtre
Programmation
La VUE est
…
. C’est une instance d’une classe graphique.
Le CONTROLEUR est une instance d’une classe implémentant
…
On appellera cette classe la classe Adaptateur car elle décide comment
actions demandées par l’utilisateur.
…
La METHODE est une instance d’une classe contenant
…
On appellera cette classe la classe Delegue car le CONTROLEUR
responsabilité des actions à entreprendre sur la fenêtre.
10
…
la fenêtre aux
à la METHODE la
Licence Monnaie - finance
2012-2013
Algorithmique et programmation java
Application à la fenêtre précédente
Résultat attendu :
Pour les étapes suivantes, complétez chaque fois que nécessaire le fichier
figurant pages 13 et 14
Etape 1. Dans le constructeur de la fenêtre, on déclare un attribut de nom delegue de la classe Delegue
protected Delegue delegue ;
Puis on demande à la classe Delegue la création d’un objet Delegue par appel au constructeur en lui envoyant
…
delegue = new Delegue(this) ;
// this = ...
L’adresse du délégué ainsi créé est donc stockée dans
…
tandis que le délégué stocke dans son attribut fen l’adresse de la fenêtre pour pouvoir ultérieurement …
Analogie avec le courrier :
Nous écrivons à un destinataire que nous venons de découvrir (à une adresse que nous gardons en mémoire) et
nous lui envoyons notre propre adresse (this) pour qu’il puisse lui-même la stocker et nous répondre plus tard.
Etape 2. On définit une classe Adaptateur qui
…
les événements et décide des actions à
faire accomplir par le délégué. Pour cela, la classe Adaptateur implémente
…
selon le type
…
11
Exemple : pour surveiller les éléments sur un bouton et sur une fenêtre, il faut écrire :
class Adaptateur implements WindowListener, ActionListener {
...
}
et définir dans la classe Adaptateur
ActionListener (…).
…
des interfaces WindowListener (…) et
Etape 3. On déclare dans le constructeur de la fenêtre un attribut appelé adapt de la classe Adaptateur :
protected Adaptateur adapt ;
Puis on demande au constructeur de la classe Adaptateur de créer un objet de la classe Adaptateur en lui
envoyant l’adresse du délégué, puisque
…
adapt = new Adaptateur(delegue) ;
Penser encore à l’analogie avec le courrier : nous écrivons à un second destinataire (l’Adaptateur adapt), mais
nous lui demandons de répondre ultérieurement au premier destinataire (le delegue), dont il n’a pas a priori
l’adresse. Il faut donc lui passer cette adresse, pour qu’il puisse la stocker.
La fenêtre stocke l’adresse
L’adaptateur stocke l’adresse
…
…
dans son attribut adapt.
dans un attribut delegue :
Etape 4. Dans le constructeur de la fenêtre, on “enregistre” l’Adaptateur adapt sur …
Les méthodes d’enregistrement des adaptateurs dépendent …
Exemple : si bouton1 est un objet de la classe Button, et si adapt doit surveiller bouton1, on écrira :
bouton1. ...
12
Licence Monnaie - finance
2012-2013
Algorithmique et programmation java
Etape 5. On complète dans la classe Adaptateur les méthodes obligatoires provenant
…
On écrit dans la classe Delegue les méthodes nécessaires pour que le délégué puisse effectuer …
import java.awt.* ;
import ...
class Fenetre extends Frame {
// la classe de la fenêtre (la VUE)
protected Panel p1, p2, p3, p31, p32 ;
protected TextArea txt ;
protected Button bouton1, bouton2, bouton3 ;
protected CheckboxGroup cbg ;
protected Checkbox chb1, chb2, chb3 ;
protected List selection1, selection2 ;
protected ...
protected ...
Fenetre() {
// construction des Panel p1, p2 et p3
...
// ajouts pour la gestion des événements
// création du délégué et de l’adaptateur
delegue = ...
adapt = ...
// enregistrement de l’adaptateur comme listener
addWindowListener...
bouton1.addActionListener...
bouton2.addActionListener...
bouton3.addActionListener...
}
}
public class UtilFenetre { // la classe utilisateur
public static void main(String args[]) {
Fenetre f = new Fenetre() ;
f.pack() ; f.show() ;
}
}
class Delegue {
protected Fenetre fen ;
// partie traitement (la METHODE)
Delegue(Fenetre f) {
fen = f ;
}
public void quitter() {
...
}
public void annulle() {
fen.selection1.deselect...
fen.selection2.deselect...
fen.chb1.setState...
fen.chb2.setState...
fen.chb3.setState...
fen.txt.setText...
}
public void affichetexte() {
String res = "Vous avez choisi le " + ...
res=res + "\ndans la tranche horaire " + ...
res=res + "\nà " + ...
fen.txt.setText...
}
}
13
class Adaptateur implements ActionListener, WindowListener {
// aiguillage (le CONTROLEUR)
protected Delegue delegue ;
Adaptateur(Delegue d) {
delegue = d ;
}
// méthode indispensable comme ActionListener
public void actionPerformed(ActionEvent e) {
Object src = ...
String param = ...
if (param == "Quitter") delegue.quitter() ;
else if (param == "Désélectionner")
delegue.annulle() ;
else delegue.affichetexte() ;
}
// méthodes indispensables comme WindowListener
public void windowClosing(WindowEvent e) {
delegue.quitter() ;
}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowOpened(WindowEvent e) {}
}
Les saisies et récupérations de données
Champ de saisie de type texte
Création
txt = new TextField() ;
txt = new TextField(10) ;
Remplissage
txt...
Récupération
String res = ...
Vidage
txt...
Choix dans un List ou Choice
Création
ll = new List() ;
ll = new List(10) ;
ll = new Choice() ;
Remplissage
ll...
Récupération
String res = ...
int n = ...
Remplissage par boucle : ajouter une suite de nombres dans un objet de type Choice ou List
Choice c = new Choice();
for (int i=1 ; i < 20; i++) {
// autorisés, au choix :
c...
OU c...
}
14
Licence Monnaie - finance
2012-2013
Algorithmique et programmation java
Choix d’un Checkbox dans un groupe
Création
cbg = new CheckboxGroup() ;
c1=new Checkbox("prop 1",...
c2=new Checkbox("prop 2",...
);
);
Récupération
String res = cbg.getSelectedCheckbox()...
boolean etat1 = c1...
boolean etat2 = c2...
Les conversions et les calculs
Donnée = chaîne de caractères
Toute donnée entrée dans un champ de saisie ou récupérée d’une liste de sélection est
…
Pour être utilisable en vue de calculs, elle doit être convertie en …
Les méthodes de conversion dépendent …
Conversion d’une chaîne ch en nombre
En un entier n :
o
o
int n = ...
int n = ...
En un flottant f :
o
o
float f = ...
float f = ...
En un double d :
o
o
double d = ...
double d = ...
Conversions d’un nombre en chaîne
Conversions inverses pour l’affichage du …
Toute donnée à afficher dans une fenêtre graphique doit être de type …
Conversion d’un entier n en chaîne ch
o
String ch = ...
Conversion d’un flottant f en chaîne ch
o
String ch = ...
Conversion d’un double d en chaîne ch
o
String ch = ...
Exemple
Compléter l’application UtilCalculs.java suivante pour qu’elle exécute la conversion d’euros en dollars :
import java.awt.* ;
import java.awt.event.* ;
class Fenetre extends Frame {
static double t = 1.4 ;
protected Panel p0,p1,p2 ;
protected TextField txt1, txt2 ;
protected Button bouton ;
protected Delegue delegue ;
protected Adaptateur adapt ;
15
Fenetre() {
p0 = new Panel() ;
p0.add(new Label("Conversion euros --> dollars"));
add("North", p0);
p1 = new Panel() ;
p1.setLayout(new GridLayout(2,3));
p1.add(new Label("montant en €"));
p1.add(new Label(" ")) ;
p1.add(new Label("montant en $")) ;
txt1 = new TextField(3) ; p1.add(txt1);
bouton = new Button(" = "); p1.add(bouton) ;
txt2 = new TextField(3) ; p1.add(txt2);
add("Center", p1) ;
p2 = new Panel() ;
p2.add(new Label("Taux actuel : 1 euro vaut " + t + " $"));
add("South", p2);
delegue = new Delegue(this) ;
adapt = new Adaptateur(delegue) ;
addWindowListener(adapt) ;
bouton.addActionListener(adapt) ;
}
}
public class UtilCalculs {
public static void main(String args[]) {
Fenetre f = new Fenetre() ;
f.pack() ; f.show() ;
}
}
class Delegue {
protected Fenetre fen
Delegue(Fenetre f) {
fen = f ;
}
public void quitter()
System.exit(0)
}
public void calcule()
...
...
...
...
}
}
;
{
;
{
class Adaptateur implements ActionListener, WindowListener {
protected Delegue delegue ;
public Adaptateur(Delegue d) {
delegue = d ;
}
public void actionPerformed(ActionEvent e) {
delegue.calcule() ;
}
public void windowClosing(WindowEvent e) {
delegue.quitter() ;
}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowOpened(WindowEvent e) {}
}
16
Licence Monnaie - finance
2012-2013
Algorithmique et programmation java
Les applets Java
Qu’est-ce qu’une applet ?
Une applet est une
…
même temps que la page HTML.
, insérée dans une page HTML et chargée par un navigateur en
Insertion d’une applet dans une page HTML : balises <applet> et </applet>
en gras les lignes obligatoires
URL où on cherche le fichier .java
nom du fichier de pseudo-code
texte si navigateur non compatible
nom de l’applet dans la page html
largeur puis hauteur de la
zone d’affichage de l’applet
paramètres
éventuels
<applet
codebase=codebase_URL
code="nomclasse.class"
alt="texte_de_remplacement"
name="nom_instance"
width="pixels"
height="pixels" >
<param name=nom_param1 value="valeur1">
<param name=nom_param2 value="valeur2">
</applet>
Exécutée par l’interpréteur java du navigateur, l’applet permet de
…
certains
(calculs, animations graphiques, vérification de la validité d’un formulaire, etc) chez …
traitements
Du point de vue informatique, une applet est une instance d’une classe java héritant de …
import java.applet.* ;
class monApplet extends Applet {
...
}
Elle gère seule son apparence dans la zone …
Différences entre applet et application
Stockage
Une application réside généralement
…
Une applet, chargée à travers le réseau, reste
le disque dur de la machine qui l’exécute.
de l’ordinateur qui l’exécute.
…
; elle n’est
… stockée sur
Lancement
Une application est lancée
…
, pour …
Une applet est initialisée et démarrée au premier chargement d’une page HTML, puis
à chaque fois que l’utilisateur recharge la même page HTML.
…
Droits de lecture et écriture
Une application peut
autre programme,
…
…
Une applet ne peut
…
ne peut communiquer qu’avec …
un fichier sur le disque dur,
avec d’autres machines
un
de fichier sur le disque dur, ni lancer de programme ; elle
Méthodes d’une applet
La classe maître de l’applet est une classe
…
…
17
, dérivant de la classe …
Elle ne comporte jamais de méthode
o
o
o
o
o
o
…
, mais elle dispose de méthodes spécifiques :
le constructeur de la classe, …
init() réalisant …
start() qui lance l’applet au démarrage et à chaque fois que l’applet a été stoppée (rechargement de la
page HTML, par ex)
stop() qui
…
l’applet (lors d’un changement de page, par ex)
destroy() qui
…
lorsque le navigateur est fermé
paint(Graphics g) qui …
en permanence l’applet sur l’écran à l’aide d’un contexte graphique
g fourni.
Exécution d’une applet
Lorsqu’un navigateur a chargé une page HTML contenant une applet, il lance l’interpréteur java qui appelle la
méthode
…
de l’applet.
Cette méthode initialise l’applet et charge
L’interpréteur appelle ensuite les méthodes
pour la lancer et la dessiner.
…
…
et
dont l’applet a besoin
…
de
l’applet
L’applet assume ensuite avec ses propres méthodes la gestion de sa zone d’affichage. Pour être redessinée, elle
fait appel à la méthode
…
Méthodes à programmer
Les méthodes qu’il faut généralement redéfinir sont :
o init() pour …
o paint(Graphics g) si …
Les autres méthodes (héritées de Applet) n’ont généralement pas à être redéfinies.
Si l’on veut permettre à l’utilisateur d’interagir avec l’applet, il faut gérer les événements en définissant (comme
pour les applications) les classes …
(contrôleur) et
…
(exécuteur).
Lancement d’une applet
Il y a deux manières de lancer des applets :
o
faire appel à un
…
(l’appletViewer) à qui on donne le nom de la page HTML contenant
l’applet : appletViewer …
La page HTML n’est pas visible, seule
…
est visualisée
o
faire appel à un
…
en lui faisant charger la page HTML contenant l’applet
Transformation d’une application en applet
Conditions
On peut transformer une application en applet à certaines conditions :
o Ne pas avoir besoin …
o
Ne pas avoir de traitement …
Liste des modifications à effectuer
o
o
o
importer le paquetage …
faire dériver la classe de la fenêtre (la VUE) de la classe
…
supprimer la classe principale de l’application (ce qui impose de
18
(au lieu de la classe Frame)
…
)
Licence Monnaie - finance
o
o
o
o
o
o
2012-2013
Algorithmique et programmation java
la classe de la fenêtre étant devenue la classe maître, la déclarer
…
et
constructeur en ...
modifier la classe
…
pour qu'elle n'implémente plus l'interface …
modifier la classe de la VUE en conséquence
modifier la classe
…
en conséquence
écrire …
compiler et tester avec l’appletViewer et avec un navigateur.
renommer
son
Exemple
Transformer l’application UtilCalculs.java en une applet intégrée dans une page HTML.
import java.awt.* ;
import java.awt.event.* ;
...
class Fenetre extends Frame {
protected Panel p0,p1,p2 ;
protected TextField txt1, txt2 ;
protected Button bouton ;
protected Delegue delegue ;
protected Adaptateur adapt ;
Fenetre() {
p0 = new Panel() ; p0.add(new Label("Conversion euros --> dollars"));
add("North", p0);
p1 = new Panel() ; p1.setLayout(new GridLayout(2,3));
p1.add(new Label("montant en €"));
p1.add(new Label(" ")) ; p1.add(new Label("montant en $")) ;
txt1 = new TextField(3) ; p1.add(txt1);
bouton = new Button(" = "); p1.add(bouton) ;
txt2 = new TextField(3) ; p1.add(txt2);
add("Center", p1) ;
p2 = new Panel() ;
p2.add(new Label("Taux actuel : 1 euro vaut 1,55 $"));
add("South", p2);
delegue = new Delegue(this) ; adapt = new Adaptateur(delegue) ;
addWindowListener(adapt) ;
bouton.addActionListener(adapt) ;
}
}
public class UtilCalculs {
public static void main(String args[]) {
Fenetre f = new Fenetre() ; f.pack() ; f.show() ;
}
}
class Delegue {
protected Fenetre fen ;
Delegue(Fenetre f) {
fen = f ;
}
public void quitter() {
System.exit(0) ;
}
public void calcule() {
String txt1 = fen.txt1.getText() ;
double euros = new Double(txt1).doubleValue() ;
double dollars = euros * 1.55 ;
String txt2 = new Double(dollars).toString() ;
Fen.txt2.setText(txt2);
}
}
19
class Adaptateur implements ActionListener, WindowListener {
protected Delegue delegue ;
public Adaptateur(Delegue d) {
delegue = d ;
}
public void actionPerformed(ActionEvent e) {
delegue.calcule() ;
}
public void windowClosing(WindowEvent e) {
delegue.quitter() ;
}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowOpened(WindowEvent e) {}
}
Page HTML appelant l’applet :
<html>
<head>
<title> Applet</title>
</head>
<body>
<h2><center>Applet Calculs</center></h2>
<center>
<applet code="Fenetre.class" width="300" height="300">
</applet>
</center>
</body>
</html>
Création directe d’une applet
Il faut écrire :
o la classe maître de l’applet dérivant de la classe Applet
o les classes Delegue et Adaptateur si l’utilisateur interagit avec l’applet
o la page HTML
Page valacquise.html :
<HTML>
<HEAD>
<TITLE> Applet</TITLE>
</HEAD>
<BODY>
<center>
<APPLET CODE="ValAcquise.class" WIDTH="300" HEIGHT="150">
</APPLET>
</center>
</BODY>
</HTML>
Les dimensions reserves à l’applet sont …
Le fichier de l’applet comporte :
o la classe dérivant de Applet :
20
Licence Monnaie - finance
2012-2013
Algorithmique et programmation java
import java.awt.* ;
import java.applet.* ;
import java.awt.event.* ;
public class ValAcquise extends Applet {
protected TextField montant, taux, nb, valeur ;
protected Button valider ;
protected Delegue delegue;
protected Adaptateur adapt;
public void init() {
setLayout(new GridLayout(3,3));
add(new Label("Montant"));
add(new Label("Taux"));
add(new Label("Nombre d'années"));
Panel p1 = new Panel();
montant = new TextField(10);
p1.add(montant);
add(p1);
Panel p2 = new Panel();
taux = new TextField(10);
p2.add(taux);
add(p2);
Panel p3 = new Panel();
nb = new TextField(10);
p3.add(nb);
add(p3);
Panel p4 = new Panel();
valider = new Button("Valider");
p4.add(valider);
add(p4);
Panel p5 = new Panel();
p5.add(new Label("Valeur acquise"));
add(p5);
Panel p6 = new Panel();
valeur = new TextField(10);
p6.add(valeur);
add(p6);
delegue = new Delegue(this);
adapt = new Adaptateur(delegue);
valider.addActionListener(adapt);
}
}
o
la classe Adaptateur :
class Adaptateur implements ActionListener {
protected Delegue delegue ;
public Adaptateur(Delegue d) {
delegue = d ; }
// événements surveillés en tant que ActionListener
public void actionPerformed(ActionEvent e) {
delegue.calculeResultat() ;
}
}
o
la classe Delegue :
class Delegue {
protected ValAcquise va ;
Delegue(ValAcquise v) {
va = v ;
}
21
public void calculeResultat() {
}
}
Le fichier doit être enregistré sous le nom …
Exécution :
appletViewer …
ou …
Les images dans les applets
Principe
La classe Applet du paquetage java.applet contient une méthode appelée
…
qui permet à l’applet de
…
(mais pas d’…
) une image provenant du serveur.
Cette méthode renvoie un objet de la classe
On écrira donc, par exemple,
…
(classe du paquetage java.awt.image).
Image im = getImage(getDocumentBase(), "vnus.gif") ;
getDocumentBase()donne le répertoire du serveur où se trouve …
La classe Graphics s’occupe de l’apparence graphique des applications et des applets. Sa méthode drawImage
permet
…
Pour afficher l’image im à partir du point (20,20), pn écrira donc :
Image im = getImage(getDocumentBase(),"vnus.gif") ;
g.drawImage(im, 20, 20, this) ;
Le 4e argument de drawImage doit être un
…
Mais comme la classe Component (dont
dérive Applet) implémente cette interface, l’applet est elle-même un ImageObserver. On écrit donc this comme
4ème argument.
Applet affichant une image
Fichier AppletImage.java :
import java.awt.* ;
import java.applet.* ;
import java.awt.image.* ;
public class AppletImage extends Applet {
private Image im ;
public void init() {
im = getImage(getDocumentBase(),
}
public void paint(Graphics g) {
g.drawImage(im, 20, 20, this) ;
}
}
22
"vnus.gif") ;
Licence Monnaie - finance
2012-2013
Algorithmique et programmation java
Page appletimage.html :
<html>
<head>
<title> Applet</title>
</head>
<body>
<applet code="AppletImage.class" width="300" height="300">
</applet>
</body>
</html>
Applet visualiseur d’images
Lecture sur le serveur d’un fichier appelé « listephotos.txt » contenant des noms d’images
o Affichage de la liste des images dans une liste de sélection
o Choix de l’image par simple clic sur son nom
Fichier listephotos.txt :
13
statuesRamses
DeirElBahari
ballon
Ramasseum
Allee
villageArtisans
villageDetail
coucherSoleil
fresque
valleeRois
portail
esna
temple
nombre de photos
liste des noms des photos
Page visualiseur.html :
<html>
<head>
<title>Applet</title>
</head>
<body>
<center><h2><center>Catalogue de photos</h2>
<applet code="Visualiseur.class" width="410" height="280">
</applet></center>
</body>
</html>
Fichier Visualiseur.java :
import
import
import
import
import
...
public
java.awt.* ;
java.applet.* ;
java.awt.image.* ;
java.io.* ;
java.net.* ;
class Visualiseur extends Applet {
protected Panel p1, p2, p11, p12 ;
protected List liste ;
protected Image image ;
...
...
23
public void init() {
URL url ; // URL pour retrouver listephotos.txt sur le serveur
InputStream stream ;
// flot vers le serveur
BufferedReader fichier ; // buffer de lecture de données
int nblignes;
// nombre de lignes à lire
setLayout(new BorderLayout()) ;
p1 = new Panel() ;
liste = new List() ;
try
{
url = new URL(getDocumentBase(),"listephotos.txt") ;
stream = url.openStream() ;
// ouverture du flot
fichier =new BufferedReader(new
InputStreamReader(stream)); // ouverture du buffer
// recuperation du nombre de lignes à lire
nblignes = Integer.parseInt(fichier.readLine()) ;
// lecture et mise des noms de photos dans la liste
for (int i = 0 ; i < nblignes ; i++)
liste.add(fichier.readLine()) ;
}
catch (IOException e) {}
p1.add(liste) ;
add("North", p1) ;
...
...
...
image = getImage(getDocumentBase(), liste.getItem(0)+".jpg") ;
}
public void paint(Graphics g) {
g.drawImage(image, 55, 60, this) ;
}
}
En exécutant l’applet, on constate que la liste des photos est bien mise à jour, mais que lorsqu’on clique sur un
nom de photo il ne se passe rien.
Or on souhaite qu’en cliquant sur le nom d’une image, celle-ci s’affiche. Il faut donc gérer un événement d’un
type
…
de ceux gérés jusqu’à présent.
L’Adaptateur doit donc implémenter une interface susceptible d’écouter les actions sur un objet de la classe …
Cette interface est l’interface
…
.
Une seule méthode doit être définie : la méthode …
import
import
import
import
import
import
java.awt.* ;
java.applet.* ;
java.awt.image.* ;
java.awt.event.* ;
java.io.* ;
java.net.* ;
public class Visualiseur extends Applet {
protected Panel p1, p2, p11, p12 ;
protected List liste ;
protected Image image ;
protected Delegue delegue ;
protected Adaptateur adapt ;
public void init() {
URL url ;
InputStream stream ;
BufferedReader fichier ;
int nblignes;
setLayout(new BorderLayout()) ;
p1 = new Panel() ;
liste = new List() ;
24
Licence Monnaie - finance
2012-2013
Algorithmique et programmation java
try
{
url = new URL(getDocumentBase(), "listephotos.txt") ;
stream = url.openStream() ;
fichier =new BufferedReader(new
InputStreamReader(stream));
nblignes = Integer.parseInt(fichier.readLine()) ;
for (int i = 0 ; i < nblignes ; i++)
liste.add(fichier.readLine()) ;
}
catch (IOException e) {
}
p1.add(liste) ;
add("North", p1) ;
image = getImage(getDocumentBase(), liste.getItem(0)+".jpg") ;
delegue = new Delegue(this) ;
adapt = new Adaptateur(delegue) ;
...
}
public void paint(Graphics g) {
g.drawImage(image, 55, 60, this) ;
}
}
class Delegue {
protected Visualiseur v ;
Delegue(Visualiseur i) {
v = i ;
}
void afficher() {
...
...
...
}
}
class Adaptateur implements
protected Delegue delegue ;
public Adaptateur(Delegue d) {
delegue = d ;
}
public void
...
...
}
}
...
(...
Paramètres provenant de la page HTML
Principe
Une page HTML peut passer des
…
à une applet.
Si la page HTML contient les lignes :
<applet code= "truc.class" …>
<param name="nom" value="dupont">
</applet>
alors on peut récupérer le nom dans les méthodes de l’applet par :
String nom =...
25
{
e) {
Exemple : version initiale sans paramètre
Dans la page interets0.html :
<html>
<head><title> Applet</title></head>
<body>
<center><h2><center>Calcul d'int&eacute;r&ecirc;ts</h2>
<applet code="Interets0.class" width="310" height="200">
</applet></center>
</body>
</html>
Dans le fichier Interets0.java ci-dessous le taux est donné « en dur » dans la méthode calcule de la classe
Delegue : double taux = 4.5 ;
Changement de taux  …
import java.awt.* ;
import java.applet.* ;
import java.awt.event.* ;
public class Interets0 extends Applet {
protected Panel p1, p2, p3, p4 ;
protected TextField montant, nb, res ;
protected Button ok ;
protected Delegue delegue ;
protected Adaptateur adapt ;
public void init() {
setLayout(new GridLayout(4,1)) ;
p1 = new Panel() ;
p1.add(new Label("Montant initial : ")) ;
montant = new TextField(10);
p1.add(montant) ;
add(p1) ;
p2 = new Panel() ;
p2.add(new Label("Nombre d'années : ")) ;
nb = new TextField(3);
p2.add(nb) ;
add(p2) ;
p3 = new Panel() ;
ok = new Button("OK");
p3.add(ok) ;
add(p3) ;
p4 = new Panel() ;
p4.add(new Label("Montant obtenu : ")) ;
res = new TextField(10);
p4.add(res) ;
add(p4) ;
delegue = new Delegue(this) ;
adapt = new Adaptateur(delegue) ;
ok.addActionListener(adapt);
}
}
class Delegue {
protected Interets0 interets ;
Delegue(Interets0 i) {
interets = i ;
}
void afficher() {
double montant = ...
int annees = ...
double taux = 4.5 ;
26
Licence Monnaie - finance
2012-2013
for (int i = 0; i < annees; i++)
montant = ...
interets.res.setText(
}
Algorithmique et programmation java
...
}
class Adaptateur implements ActionListener {
protected Delegue delegue ;
public Adaptateur(Delegue d) {
delegue = d ;
}
public void actionPerformed(ActionEvent e) {
delegue.afficher() ;
}
}
Version avec un paramètre
Dans la page interets1.html :
<html>
<head><title> Applet</title></head>
<body>
<center><h2><center>Calcul d'int&eacute;r&ecirc;ts</h2>
<applet code="Interets1.class" width="310" height="200">
<param name='taux' value='4.25'>
</applet></center>
</body>
</html>
Dans afficher() de Interets1.java :
import
import
import
public
java.awt.* ;
java.applet.* ;
java.awt.event.* ;
class Interets1 extends Applet {
protected Panel p1, p2, p3, p4 ;
protected TextField montant, nb, res ;
protected Button ok ;
protected Delegue delegue ;
protected Adaptateur adapt ;
public void init() {
setLayout(new GridLayout(4,1)) ;
p1 = new Panel() ;
p1.add(new Label("Montant initial : ")) ;
montant = new TextField(10);
p1.add(montant) ;
add(p1) ;
p2 = new Panel() ;
p2.add(new Label("Nombre d'années : ")) ;
nb = new TextField(3);
p2.add(nb) ;
add(p2) ;
p3 = new Panel() ;
ok = new Button("OK");
p3.add(ok) ;
add(p3) ;
p4 = new Panel() ;
p4.add(new Label("Montant obtenu : ")) ;
res = new TextField(10);
p4.add(res) ;
add(p4) ;
delegue = new Delegue(this) ;
adapt = new Adaptateur(delegue) ;
ok.addActionListener(adapt);
}
}
27
);
class Delegue {
protected Interets1 interets ;
Delegue(Interets1 i) {
interets = i ;
}
void afficher() {
double montant = new Double(interets.montant.getText()).doubleValue();
int annees = new Integer(interets.nb.getText()).intValue();
double taux = ...
for (int i = 0; i < annees; i++)
montant = montant *(1 + taux/100) ;
interets.res.setText(new Double(montant).toString());
}
}
class Adaptateur implements ActionListener {
protected Delegue delegue ;
public Adaptateur(Delegue d) {
delegue = d ;
}
public void actionPerformed(ActionEvent e) {
delegue.afficher() ;
}
}
Il suffit alors de changer la valeur
(sans …
…
de la page HTML pour modifier le taux
).
Version avec trois paramètres
On ajoute deux nouvelles balises <PARAM> dans la page HTML pour un 2ème taux et un montant seuil
permettant de passer d’un taux à l’autre.
Page interets2.html :
<html>
<head><title> Applet</title></head>
<body>
<center><h2><center>Calcul d'int&eacute;r&ecirc;ts</h2>
<applet code="Interets2.class" width="310" height="200">
<param name='taux1' value='4.25'>
<param name='taux2' value='5.25'>
<param name='montant' value='20000'>
</applet></center>
</body>
</html>
Dans le fichier Interets2.java, la seule modification est encore dans afficher() :
import java.awt.* ;
import java.applet.* ;
import java.awt.event.* ;
public class Interets2 extends Applet {
protected Panel p1, p2, p3, p4 ;
protected TextField montant, nb, res ;
protected Button ok ;
protected Delegue delegue ;
protected Adaptateur adapt ;
public void init() {
setLayout(new GridLayout(4,1)) ;
p1 = new Panel() ;
p1.add(new Label("Montant initial : ")) ;
28
Licence Monnaie - finance
2012-2013
Algorithmique et programmation java
montant = new TextField(10);
p1.add(montant) ;
add(p1) ;
p2 = new Panel() ;
p2.add(new Label("Nombre d'années : ")) ;
nb = new TextField(3);
p2.add(nb) ;
add(p2) ;
p3 = new Panel() ;
ok = new Button("OK");
p3.add(ok) ;
add(p3) ;
p4 = new Panel() ;
p4.add(new Label("Montant obtenu : ")) ;
res = new TextField(10);
p4.add(res) ;
add(p4) ;
delegue = new Delegue(this) ;
adapt = new Adaptateur(delegue) ;
ok.addActionListener(adapt);
}
}
class Delegue {
protected Interets2 interets ;
Delegue(Interets2 i) {
interets = i ;
}
void afficher() {
double montant = new Double(interets.montant.getText()).
doubleValue();
int annees = new Integer(interets.nb.getText()).intValue();
double taux1 = ...
double taux2 = ...
double bascule = ...
double taux ;
...
for (int i=0 ; i < annees ; i++)
montant = montant * (1 + taux/100);
interets.res.setText(new Double(montant).toString());
}
}
class Adaptateur implements ActionListener {
protected Delegue delegue ;
public Adaptateur(Delegue d) {
delegue = d ;
}
public void actionPerformed(ActionEvent e) {
delegue.afficher() ;
}
}
Application au projet
Dans le projet, le calcul de la mensualité dépend du taux, qui dépend lui-même d’une valeur (montant emprunté
ou durée de l’emprunt…)
Dans la partie applet :
Si on met les taux et les valeurs de bascule dans la page HTML, il n’est plus nécessaire de recompiler l’applet à
chaque changement de valeur soit du taux, soit des valeurs servant de bascule.
29
Annexes
Noms des variables
Le nom d’une variable est composé d’un seul mot et commence obligatoirement par une lettre. Il peut être
constitué de lettres, de chiffres ou du caractère souligné _ et peut contenir un nombre quelconque de caractères
(se limiter pour la commodité à une taille raisonnable).
Casse
Il y a une distinction entre minuscules et majuscules (java est toujours sensible à la CASSE). Par convention les
noms de variable sont orthographiés en lettres minuscules sauf la première lettre de chaque mot si le nom de la
variable en comporte plusieurs : nomDeFamille par exemple.
Mots clés
Les mots clés du langage ne peuvent en aucun cas être utilisés comme noms de variable.
Ce sont les mots :
abstract
case
continue
extends
for
instanceof
new
public
super
throws
volatile
assert
catch
default
false
goto
int
null
return
switch
transient
while
boolean
char
do
final
if
interface
package
short
synchronized
true
break
class
double
finally
implements
long
private
static
this
try
byte
const
else
float
import
native
protected
strictfp
throw
void
Portée des variables
La portée d’une variable est la portion de code dans laquelle on peut manipuler cette variable. Elle est fonction
de l’emplacement où est située la déclaration de la variable.
La déclaration d’une variable peut être faite dans le bloc de code d’une classe, le bloc de code d’une fonction ou
un bloc de code à l’intérieur d’une fonction (boucle for, while, do while par exemple). Seul le code du bloc où
est déclarée la variable peut utiliser la variable.
Il ne peut pas y avoir deux variables portant le même nom avec la même portée. On peut cependant déclarer une
variable interne à une fonction ou un paramètre d’une fonction ayant le même nom qu’une variable déclarée au
niveau de la classe. La variable déclarée au niveau de la classe est dans ce cas masquée par la variable interne à
la fonction.
30

Documents pareils