Vous êtes sur la page 1sur 181

Dveloppement dInterface

Graphique
Bouhlel Mohamed Salah
2005/2006
Sommaire
Introduction
Les composants SWING
Gestionnaire de disposition
Gestion des vnements
Diffrentes implmentation dun couteurs
Le graphisme en JAVA.
Les applets
Notions particulires : Thread et Srialisation

Bouhlel Mohamed Salah 2


Introduction
Il existe deux grandes familles de composant
graphique en JAVA:

AWT

SWING

Bouhlel Mohamed Salah 3


Introduction
AWT (Abstract Window Toolkit, JDK 1.1)
Swing (JDK/SDK 1.2)

Swing et AWT font partie de JFC (Java Foundation


Classes) qui offre des facilits pour construire des
interfaces graphiques

Swing est construit au-dessus de AWT


mme gestion des vnements
les classes de Swing hritent des classes de AWT

Bouhlel Mohamed Salah 4


AWT
Les classes du toolkit AWT (Abstract Windows
Toolkit) permettent d'crire des interfaces
graphiques indpendantes du systme
d'exploitation sur lesquelles elles vont fonctionner.

Cette librairie utilise le systme graphique de la


plateforme d'excution (Windows, MacOS, X-
Window) pour afficher les objets graphiques.

Le toolkit contient des classes dcrivant les


composants graphiques, les polices, les couleurs
et les images.
Bouhlel Mohamed Salah 5
Hirarchie des Composants AWT

Bouhlel Mohamed Salah 6


SWING
Swing fait partie de la bibliothque Java Foundation
Classes (JFC). C'est une API dont le but est similaire celle
de l'AWT mais dont le mode de fonctionnement et
d'utilisation est compltement diffrent.

Swing a t intgre au JDK depuis sa version 1.2. Cette


bibliothque existe sparment pour le JDK 1.1.

La bibliothque JFC contient :


l'API Swing : de nouvelles classes et interfaces pour construire des
interfaces graphiques.
LAPI AWT.
Accessibility API
2D API: support du graphisme en 2D
API pour l'impression et le cliquer/glisser

Bouhlel Mohamed Salah 7


SWING
Les composants Swing forment un nouvelle hirarchie
parallle celle de l'AWT.

L'anctre de cette hirarchie est le composant


JComponent.

Presque tous ces composants sont crits en pure Java : ils


ne possdent aucune partie native sauf ceux qui assurent
l'interface avec le systme d'exploitation : JApplet, JDialog,
JFrame, et JWindow.

Cela permet aux composants de toujours avoir la mme


apparence quelque soit le systme sur lequel l'application
s'excute.
Bouhlel Mohamed Salah 8
Hirarchie des Composants SWING

Bouhlel Mohamed Salah 9


Swing ou AWT ?
Tous les composants de AWT ont leur
quivalent dans Swing
en plus joli
avec plus de fonctionnalits

Swing offre de nombreux composants qui


nexistent pas dans AWT
Il est fortement conseill dutiliser les
composants Swing et ce cours sera donc
centr sur Swing
Bouhlel Mohamed Salah 10
La classe java.awt.Toolkit
Les sous-classes de la classe abstraite Toolkit
implantent la partie de AWT qui est en contact avec
le systme dexploitation hte.

Quelques mthodes publiques :


getScreenSize,
getScreenResolution,
beep,
getImage,
createImage,
getSystemEventQueue
getDefaultToolkit fournit une instance de la classe qui
implante Toolkit (classe donne par la proprit
awt.toolkit)
Bouhlel Mohamed Salah 11
Exemple
public static void main(String[] args) {
JFrame f=new JFrame("Mon dessin");

// Centrage de la fentre
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension d = tk.getScreenSize();
int hauteurEcran = d.height;
int largeurEcran = d.width;
f.setSize(largeurEcran/2, hauteurEcran/2);
f.setLocation(largeurEcran/4, hauteurEcran/4);

// tant quon y est, ajoutons licne


Image img = tk.getImage("image.gif");
f.setIconImage(img);
f.show ();
f.setDefaultCloseOperation (WindowConstants.EXIT_ON_CLOSE);
}
Bouhlel Mohamed Salah 12
Composants lourds et lgers Classes
Container et JComponent
Composants lourds
Pour afficher des fentres, Java sappuie sur les fentres
fournies par le systme dexploitation hte dans lequel
tourne la JVM

Les composants Java qui, comme les JFrame,


sappuient sur des composants du systme hte sont dit
lourds

L'utilisation de composants lourds amliore la rapidit


d'excution mais nuit la portabilit et impose les
fonctionnalits des composants

Bouhlel Mohamed Salah 13


Composants lourds et lgers Classes
Container et JComponent
Composants lgers
AWT utilise les widgets du systme dexploitation pour
tous les composants graphiques (fentres, boutons,
listes, menus,)

Swing ne les utilise que pour les fentres de base top-


level

Les autres composants, dits lgers, sont dessins par


Swing dans ces containers lourds

Attention, les composants lourds saffichent toujours au-


dessus des composants lgers

Bouhlel Mohamed Salah 14


SWING
Parmi les objets, on distingue trois
catgories.

Les conteneurs,

Les classes d'interactions, c'est--dire les


composants,

Les classes de liaisons (vnements,


gestionnaire de disposition, )
Bouhlel Mohamed Salah 15
Les Conteneurs
Les conteneurs sont des objets graphiques qui
sont destins spcifiquement recevoir dautres
lments graphiques.

Les conteneurs peuvent ventuellement contenir


dautres conteneurs.

Ils hritent de la classe Container.

Un composant graphique doit toujours tre


incorporer dans un conteneur.

Bouhlel Mohamed Salah 16


Containers lourds
Il y a 3 sortes de containers lourds (un autre,
JWindow, est plus rarement utilis) :

JFrame fentre pour les applications


JApplet pour les applets
JDialog pour les fentres de dialogue

Pour construire une interface graphique avec


Swing, il faut crer un (ou plusieurs) container
lourd et placer lintrieur les composants lgers
qui forment l'interface graphique
Bouhlel Mohamed Salah 17
Hirarchie dhritage des containers lourds

Bouhlel Mohamed Salah 18


Container lger
les containers intermdiaires lgers :
JPanel,
JScrollPane,
JSplitPane,
JTabbedPane,
Box (ce dernier est lger mais nhrite pas de
JComponent)

Bouhlel Mohamed Salah 19


Classe abstraite JComponent

Bouhlel Mohamed Salah 20


Exemple de Container lger : JPanel
JPanel est la classe mre des containers
intermdiaires les plus simples.

Un JPanel sert regrouper des composants dans


une zone d'cran.

Il na pas daspect visuel dtermin ; son aspect


visuel est donn par les composants qu'il contient.

Il peut aussi servir de composant dans lequel on


peut dessiner ce que lon veut, ou faire afficher une
image (par la mthode paintComponent).
Bouhlel Mohamed Salah 21
Exemples de Conteneur Lourd : JFrame
La Classe JFrame:

Elle reprsente une fentre principale qui


possde un titre, une taille modifiable et
ventuellement un menu

Elle utilise un conteneur ou panneau de contenu


(content pane) pour insrer des composants (ils
ne sont plus insrer directement au JFrame
mais l'objet contentPane qui lui est associ).

Bouhlel Mohamed Salah 22


Exemples de Conteneur Lourd : JFrame
La classe JFrame possde plusieurs constructeurs
parmi les quel on site :
JFrame() : Constructeur par default
JFrame(String titre) : Cration dune instance en
prcisant le Titre de la fentre.

Parmi les mthodes de cette classe on site :


setSize(int, int): permet de prciser les dimensions de
ma Fentre.
setVisible (boolean) : par default la fentre est invisible,
pour la rendre visible on fait appel cette mthode.
setResizable(boolean): par default la fentre peut
changer de dimension. Pour la rendre figer on utilise
cette mthode.

Bouhlel Mohamed Salah 23
Exemples de Conteneur Lourd : JFrame
import javax.swing.*;

class MaFenetre extends JFrame {

public MaFenetre() {
super(" Ma premire Fenetre ");
setSize(200,100);
setVisible(true);
setSize(400,200);
}
public static void main(String [] args){
MaFenetre maFrame = new MaFenetre();
}
}
Bouhlel Mohamed Salah 24
Exemples de Conteneur Lourd : JFrame
Le comportement par dfaut la fermeture

Il est possible de prciser comment un objet JFrame, JInternalFrame,


ou JDialog ragit sa fermeture grce la mthode
setDefaultCloseOperation().

Cette mthode attend en paramtre une valeur qui peut tre :

Constante Role
WindowConstants.DISPOSE_ON_CLOSE dtruit la fentre

WindowConstants.DO_NOTHING_ON_CLOSE rend le bouton de


fermeture inactif
WindowConstants.HIDE_ON_CLOSE cache la fentre
WindowConstants.EXIT_ON_CLOSE Quitte le programme

Bouhlel Mohamed Salah 25


Rsum : Liste de Conteneurs
Conteneur Rle

JPanel conteneur sans fentre propre. Utile pour ordonner les


controles.
JWindow Fentre principale sans cadre ni menu. Les objets
descendants de cette classe peuvent servir
implmenter des menus
JDialog raliser des botes de dialogue simples
JFrame classe de fentre compltement fonctionnelle

JApplet pas de menu. Pas de bote de dialogue sans tre


incorpore dans une classe Frame.

Bouhlel Mohamed Salah 26


Insertion de composant

Une fois jai construit ma


fentre, comment vais-je
crer les composants et ou
vais-je les insrer.

Bouhlel Mohamed Salah 27


Les composants
Pour utiliser un composant, il faut crer un nouvel
objet reprsentant le composant et l'ajouter un de
type conteneur qui existe avec la mthode add().

Exemples de composant :
JLabel : les tiquettes
JButton : les boutons
JTextField : les champs texte
JTextArea : les zones de texte multiligne.

Bouhlel Mohamed Salah 28


Exemple de Composant
Les Boutons:
Il faut utiliser un objet de la classe javax.swing.JButton

Cette classe possde deux constructeurs :


JButton() : bouton sans Nom.
JButton(String): Permet de prciser le libell du bouton.

Quelques mthodes :
void setLabel(String) : affecte un libell au bouton.
void setSize(int, int): affecte une dimension au bouton.

Bouhlel Mohamed Salah 29


Exemple de Composant
Les Labels:
Il faut utiliser un objet de la classe javax.swing.JLabel

Cette classe possde deux constructeurs :


JLabel() : zone Label vide.
JLabel(String): Crer une zone label avec le texte passer comme
paramtre.

Quelques mthodes :
void setText() : affecte du texte a la zone label.
void setSize(int, int): affecte une dimension au a a zone Label.

Bouhlel Mohamed Salah 30


Exemple de Composant
Les zones de texte:
Il faut utiliser un objet de la classe javax.swing.JTextField

Cette classe possde deux constructeurs :


JTextField () : zone de texte vide.
JTextField (String): Crer une zone de texte avec le texte passer
comme paramtre.

Quelques mthodes :
void setText() : affecte du texte a la zone label.
void setSize(int, int): affecte une dimension a la zone de texte.
String getTexte() : retourne le texte ce trouvant dans la zone
texte.

Bouhlel Mohamed Salah 31


Layout managers
Lutilisateur peut changer la taille dune fentre ; les
composants de la fentre doivent alors tre
repositionns.

Les fentres (plus gnralement les containers)


utilisent des gestionnaires de mise en place (layout
manager) pour repositionner leurs composants.

Il existe plusieurs types de layout managers avec


des algorithmes de placement diffrents.

Bouhlel Mohamed Salah 32


Layout managers
Quand on ajoute un composant dans un container on ne
donne pas la position exacte du composant.

On donne plutt des indications de positionnement au


gestionnaire de mise en place.
explicites (BorderLayout.NORTH)
ou implicites (ordre dajout dans le container)

Un layout manager place les composants au mieux


suivant
lalgorithme de placement qui lui est propre
les indications de positionnement des composants
la taille du container
les tailles prfres des composants

Bouhlel Mohamed Salah 33


Layout managers
Chaque layout manager implmente l'interface
java.awt.LayoutManager. Par dfaut, c'est la classe
FlowLayout qui est utilise pour la classe Panel et la classe
BorderLayout pour Frame et Dialog.

Les layout manager ont 3 avantages :

l'amnagement des composants graphiques est dlgu


aux layout manager (il est inutile d'utiliser les
coordonnes absolues)

en cas de redimensionnement de la fentre, les


contrles sont automatiquement agrandis ou rduits.

ils permettent une indpendance vis vis des


plateformes.
Bouhlel Mohamed Salah 34
Tailles des composants
Tous les composants graphiques (classe
Component) peuvent indiquer leurs tailles
pour laffichage
taille maximum
taille prfre
taille minimum

Accesseurs et modificateurs associs :


{get|set}{Maximum|Preferred|Minimum}Size
Bouhlel Mohamed Salah 35
Tailles des composants
Taille prfre
La taille prfre est la plus utilise par les layout managers ; un composant
peut lindiquer en redfinissant la mthode Dimension getPreferredSize()

On peut aussi limposer de lextrieur avec la mthode void


setPreferredSize(Dimension)

Mais le plus souvent, les gestionnaires de mise en place ne tiendront pas


compte des tailles imposes de lextrieur

Taille minimum
Quand un composant na plus la place pour tre affich sa taille prfre, il
est affich sa taille minimum sans passer par des tailles intermdiaires.

Si la taille minimum est trs petite, a nest pas du plus bel effet ; il est alors
conseill de fixer une taille minimum, par exemple par
c.setMinimumSize(c.getPreferredSize());

Bouhlel Mohamed Salah 36


Types de Gestionnaires de disposition
Les types les plus courants de gestionnaire de
mise en place :
BorderLayout : placer aux 5 points cardinaux

FlowLayout : placer la suite

GridLayout : placer dans une grille

BoxLayout : placer verticalement ou horizontalement

GridBagLayout : placements complexes

Bouhlel Mohamed Salah 37


Le FlowLayout
La classe FlowLayout (mise en page flot) place les
composants ligne par ligne de gauche droite. Chaque
ligne est complte progressivement jusqu' tre remplie,
puis passe la suivante. Chaque ligne est centre par
dfaut. C'est la mise en page par dfaut des applets.

Il existe plusieurs constructeurs :


FlowLayout( )
FlowLayout( int align) : Permet de prciser l'alignement des
composants dans le conteneur (FlowLayout.CENTER,
FlowLayout.LEFT, FlowLayout.RIGHT ... ). Par dfaut, align vaut
CENTER
FlowLayout(int align, int hgap, int vgap) :Permet de prciser et
l'alignement horizontal et vertival dont la valeur par dfaut est 5.

Bouhlel Mohamed Salah 38


Le FlowLayout
public MaFenetre() {
super("Ma premire Fenetre");
JButton b=new JButton();
JLabel l=new JLabel();
JTextField f=new JTextField();

b.setText("mon bouton");
l.setText("ma zone label");
f.setText("ali va au sook");

this.getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER, 10,10));


this.getContentPane().add(b);
this.getContentPane().add(l);
this.getContentPane().add(f);

this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setVisible(true);
pack();
}

Bouhlel Mohamed Salah 39


Le FlowLayout
public MaFenetre() {
super("Ma premire Fenetre");
JButton b=new JButton();
JLabel l=new JLabel();
JTextField f=new JTextField();

b.setText("mon bouton");
l.setText("ma zone label");
f.setText("ali va au sook");

this.getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER, 10,10));


this.getContentPane().add(b);
this.getContentPane().add(l);
this.getContentPane().add(f);

this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setVisible(true);
pack();
}

Bouhlel Mohamed Salah 40


BorderLayout
Avec ce Layout Manager, la disposition des composants est
commande par une mise en page en bordure qui dcoupe
la surface en cinq zones : North, South, East, West, Center.
On peut librement utiliser une ou plusieurs zones.

BorderLayout consacre tout l'espace du conteneur aux


composants. Le composant du milieu dispose de la place
inutilise par les autres composants.

Il existe plusieurs constructeurs :


BorderLayout( )
BorderLayout (int hgap,int vgap) Permet de prciser
l'espacement horizontal et vertical des composants.

Bouhlel Mohamed Salah 41


Le BorderLayout
public MaFenetre() {
super();
setTitle("Ma Fenetre ");
setSize(300, 150);
getContentPane().setLayout(new BorderLayout(10,10));
getContentPane().add("North", new JButton(" bouton haut "));
getContentPane().add("South", new JButton(" bouton bas "));
getContentPane().add("West", new JButton(" bouton gauche "));
getContentPane().add("East", new JButton(" bouton droite "));
getContentPane().add("Center", new JButton(" bouton milieu "));
pack();
show();
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}

Bouhlel Mohamed Salah 42


Le BorderLayout
public MaFenetre() {
super();
setTitle("Ma Fenetre ");
setSize(300, 150);
getContentPane().setLayout(new BorderLayout(10,10));
getContentPane().add("North", new JButton(" bouton haut "));
getContentPane().add("South", new JButton(" bouton bas "));
getContentPane().add("West", new JButton(" bouton gauche "));
getContentPane().add("East", new JButton(" bouton droite "));
getContentPane().add("Center", new JButton(" bouton milieu "));
pack();
show();
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}

Bouhlel Mohamed Salah 43


GridLayout
Ce Layout Manager tablit un rseau de cellule
identiques qui forment une sorte de quadrillage
invisible : les composants sont organiss en lignes
et en colonnes. Les lments insrs dans la grille
ont tous la mme taille. Les cellules du quadrillage
se remplissent de droite gauche ou de haut en
bas.

Il existe plusieurs constructeurs :


GridLayout( int, int ) : Les deux premiers entiers
spcifient le nombre de lignes ou de colonnes de la
grille.
GridLayout( int, int, int, int ) : permet de prciser en plus
l'espacement horizontal et vertical des composants.

Bouhlel Mohamed Salah 44


GridLayout
public MaFenetre() {
super();
setTitle(" Ma Fenetre ");
setSize(300, 150);

this.getContentPane().setLayout(new GridLayout(2, 3, 10,10));

this.getContentPane().add(new Button("bouton 1"));


this.getContentPane().add(new Button("bouton 2"));
this.getContentPane().add(new Button("bouton 3"));
this.getContentPane().add(new Button("bouton 4"));
this.getContentPane().add(new Button("bouton 5 tres long"));
this.getContentPane().add(new Button("bouton 6"));

show();
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
Bouhlel Mohamed Salah 45
GridLayout
public MaFenetre() {
super();
setTitle(" Ma Fenetre ");
setSize(300, 150);

this.getContentPane().setLayout(new GridLayout(2, 3, 10,10));

this.getContentPane().add(new Button("bouton 1"));


this.getContentPane().add(new Button("bouton 2"));
this.getContentPane().add(new Button("bouton 3"));
this.getContentPane().add(new Button("bouton 4"));
this.getContentPane().add(new Button("bouton 5 tres long"));
this.getContentPane().add(new Button("bouton 6"));

show();
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
Bouhlel Mohamed Salah 46
GridBagLayout
Comme GridLayout, mais un composant peut occuper plusieurs
cases du quadrillage ; la disposition de chaque composant est
prcise par une instance de la classe GridBagConstraints
Cest le layout manager le plus souple mais aussi le plus complexe

Contraintes de base
panel.setLayout(new GridBagLayout());
GridBagConstraints contraintes = new GridBagConstraints();
// ligne et colonne du haut gauche
contraintes.gridx = 0;
contraintes.gridy = 0;
// taille en lignes et colonnes (occupe 2 lignes ici)
contraintes.gridheight = 2;
contraintes.gridwidth = 1;
// Chaque lment peut avoir ses propres contraintes
panel.add(bouton, contraintes);

Bouhlel Mohamed Salah 47


Autres contraintes : placement GridBagLayout
fill dtermine si un composant occupe toute la place dans son espace rserv
(constantes de la classe GridBagConstraint : BOTH, NONE, HORIZONTAL,
VERTICAL) ; par dfaut NONE
anchor dit o placer le composant quand il est plus petit que son espace
rserv (CENTER, SOUTH, ) ; par dfaut CENTER

Rpartition de lespace libre


weightx, weighty (de type double) indique comment sera distribu lespace
libre. Plus le nombre est grand, plus le composant rcuprera despace ; par
dfaut 0. Si tous les poids sont 0, lespace est rparti dans les espaces placs
entre les composants
Algorithme : poids dune colonne = weightx maximum des composants de la
colonne ; total = somme des poids de toutes les colonnes ;
lespace libre dune colonne est donn par weightx/total

La place minimale occupe


insets ajoute des espaces autour des composants : contraintes.insets = new
Insets(5,0,0,0) (ou contraintes.insets.left = 5) ; par dfaut 0 partout
ipadx, iapdy ajoutent des pixels la taille minimum des composants ; par
dfaut 0
Le layout manager tient compte des tailles prfres et minimales pour afficher
les composants
Bouhlel Mohamed Salah 48
GridBagLayout
Remarque sur le positionnement
La valeur par dfaut pour gridx et gridy est
GridBagConstraints.RELATIVE (se place en dessous ou droite du
prcdent)
Il suffit donc de fixer gridx la valeur dune colonne pour les
composant de la colonne et de garder la valeur par dfaut de gridy
pour placer tous les composants de la colonne les uns la suite des
autres (idem pour les lignes en fixant gridy)

Quand faut-il choisir GridBagLayout ?


Ds que linterface devient trop complique, il est souvent plus simple
dutiliser GridBagLayout plutt que de trouver des constructions trs
ruses avec des containers intermdiaires
On peut rendre le code plus lisible avec des mthodes qui facilitent
laffectation des contraintes.

Bouhlel Mohamed Salah 49


Comment insrer les composants
Ayant crer le conteneur.
tendre la classe JFrame

Choisit les composants utiliser.


Cration des boutons et zone de texte

Choisit le layout utiliser


Mthode setLayout()

On peut maintenant insrer les composants dans


le conteneur.

Bouhlel Mohamed Salah 50


Gestion des vnements
Exposition du problme
L'utilisateur utilise le clavier et la souris pour intervenir
sur le droulement du programme.
Le systme dexploitation engendre des vnements
partir des actions de lutilisateur.
Le programme doit lier des traitements ces
vnements.

Types d'vnements
vnements de bas niveau, gnrs directement par
des actions lmentaires de lutilisateur.
vnements logiques de plus haut niveau,
engendrs par plusieurs actions lmentaires, qui
correspondent une action complte de l'utilisateur.

Bouhlel Mohamed Salah 51


Classes d'vnements
Les vnements sont reprsents par des instances de
sous-classes de java.util.EventObject.

vnements lis directement aux actions de lutilisateur :


KeyEvent : appuie sur une touche, relachement,
MouseEvent : click par le bouton de la sourie,

vnements de haut niveau :


FocusEvent : lment ayant gagner le focus ou layant perdu.
WindowEvent : fenetre ouverte, ferm, iconifie, diconifie,
active ou dsactive.
ActionEvent : dclenchement dune action.
ItemEvent : choix dans une liste, dans une bote cocher
ComponentEvent : composant dplac, retaill, cach ou montr

Bouhlel Mohamed Salah 52


Gestion des vnements
couteurs
Chacun des composants graphiques a ses observateurs
(ou couteurs, listeners)
Un couteur doit senregistrer auprs des composants quil
souhaite couter, en lui indiquant le type dvnement qui
lintresse (par exemple, clic de souris)
Il peut ensuite se dsenregistrer

Relation couteurs - couts


Un composant peut avoir plusieurs couteurs (par exemple,
2 couteurs pour les clics de souris et un autre pour les
frappes de touches du clavier)
Un couteur peut couter plusieurs composants.

Bouhlel Mohamed Salah 53


Gestion des vnements
Une question ?
Quel message sera envoy par le composant ses couteurs pour
les prvenir que lvnement qui les intresse est arriv ?

Rponse :
chaque type dcouteur correspond une interface que doit
implmenter la classe de lcouteur ; par exemple
ActionListener, MouseListener ou KeyListener
Le message doit correspondre une des mthodes de cette
interface.

Exemple :
les vnements ActionEvent qui conduisent des traitements simples
(couteur ActionListener)
les vnements KeyEvent, au traitement plus complexe (couteur
KeyListener et adaptateur KeyAdapter).
Bouhlel Mohamed Salah 54
Gestion des vnements
La classe ActionEvent
Cette classe dcrit des vnements de haut niveau qui vont le plus
souvent dclencher un traitement (une action) :
clic sur un bouton
return dans une zone de saisie de texte
choix dans un menu

interface vide qui sert


Interface ActionListener
de marqueur pour tous
Un objet ecouteur
les couteursintress par les vnements de type
action (classe ActionEvent) doit appartenir une
contient classe
des informations
qui implmente linterface java.awt.event.ActionListener
sur lvnement
message qui sera envoy
l'couteur
Dfinition de ActionListener :
public interface ActionListener extends EventListener {
void actionPerformed(ActionEvent e);}

Bouhlel Mohamed Salah 55


Gestion des vnements
Inscription de lcouteur
On inscrit un tel couteur auprs dun composant nomm
composant par la mthode
composant.addActionListener(ecouteur);
On prcise ainsi que ecouteur est intress par les vnements
ActionEvent engendrs par composant.

Message dclench par un vnement


Un vnement unActionEvent engendr par une action de
lutilisateur sur bouton, provoquera l'envoi d'un message
actionPerformed tous les couteurs :
ecouteur.actionPerformed(unActionEvent);

Ces messages sont envoys automatiquement tous les couteurs


qui se sont enregistrs auprs du bouton.

Bouhlel Mohamed Salah 56


La Gestion des vnements
Les vnements utilisateurs sont grs par plusieurs
interfaces EventListener.

Les interfaces EventListener permettent un composants


de gnrer des vnements utilisateurs.

Une classe doit contenir une interface auditeur pour chaque


type de composant :
ActionListener : clic de souris ou enfoncement de la touche Enter.
ItemListener : utilisation d'une liste ou d'une case cocher.
MouseMotionListener : vnement de souris.
WindowListener : vnement de fentre.

Bouhlel Mohamed Salah 57


La Gestion des vnements
Etapes dimplmentation dun couteur (1re Faon):

1. Importer le groupe de classe java.awt.event

2. la classe doit dclarer qu'elle utilisera une ou plusieurs interfaces


d'coute

3. Appel la mthode addXXX() pour enregistrer l'objet qui grera


les vnements XXX du composant faut configurer le
composant pour qu'il possde un "couteur" pour l'vnement
utilisateur concern.

4. implmenter les mthodes dclares dans les interfaces : Chaque


auditeur possde des mthodes diffrentes qui sont appeles
pour traiter leurs venments. Par exemple, l'interface
ActionListener envoie des venements une classe nomme
actionPerformed( ).

Bouhlel Mohamed Salah 58


La Gestion des vnements
Exemple :
Lcouteur ActionListener Possde comme mthode :
public void actionPerformed (ActionEvent e)

Lcouteur WindowListener possede comme mthode :


public void windowOpened (WindowEvent e)
public void windowClosing (WindowEvent e)
public void windowClosed (WindowEvent e)
public void windowIconified (WindowEvent e)
public void windowDeinconified (WindowEvent e)
public void windowActivated (WindowEvent e)
public void windowDeactivated (WindowEvent e)

Bouhlel Mohamed Salah 59


La Gestion des vnements
Remarque :
Dans le cas ou plusieurs composants
implmente le mme couteur on peut utilis la
mthode getSource() pour savoir le composant
ayant gnrer laction ou lvnement
dclench.
public Object getSource()

Bouhlel Mohamed Salah 60


Exemples Complet
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class MaFenetre extends JFrame implements ActionListener{
JButton b=new JButton("jouer");
JButton rejouer=new JButton("refaire une autre partie");
JLabel l=new JLabel("");
JTextField f=new JTextField("insrer un numro");
int cacher=(int) (Math.random()*100);
public MaFenetre() {
super();
setTitle(" Mon Jeux ");
setSize(300,200);
this.getContentPane().setLayout(new GridLayout(4, 1, 10,10));
this.getContentPane().add(f);
this.getContentPane().add(b);
this.getContentPane().add(l);
this.getContentPane().add(rejouer);
b.addActionListener(this);
rejouer.addActionListener(this);
show();
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}

Bouhlel Mohamed Salah 61


Exemples Complet
public void actionPerformed(ActionEvent e) {
Object src=e.getSource();
if(src instanceof JButton) {
JButton var=(JButton) src;
if (var==b) {
try{
int x=Integer.parseInt(f.getText());
if(x==cacher) {
f.setText("bravo!!!");
l.setText("vous avez trouver le bon numro");
b.setEnabled(false);
}
else if(x>cacher) {
l.setText("le nombre donner est suprieur a celui rechercher");
f.setText("");
}
else if(x<cacher) {
l.setText("le nombre donner est infrieur acelui rechercher");
f.setText("");
}
}

Bouhlel Mohamed Salah 62


Exemples Complet
catch(NumberFormatException nfe) {
l.setText("entrer un nombre");
f.setText("");
}
}
else if (var==rejouer) {
cacher=(int) (Math.random()*100);
f.setText("");
l.setText(" bonne chance dans la nouvelle partie");
b.setEnabled(true);
}}
//Mthode de test
public static void main(String [] args){
MaFenetre maFrame = new MaFenetre();
}
}

Bouhlel Mohamed Salah 63


Chapitre 2

Le graphisme en
JAVA
Dessiner en java : comment a marche

A. Le systme de coordonnes :
Le systme de coordonnes de Java utilise le pixel
comme unit de mesure.
Le point d'origine, de coordonne (0,0) correspond
l'angle suprieur gauche du panneau.
La valeur de la coordonne x crot mesure que l'on
s'loigne vers la droite du point 0,0 et la coordonne y
crot mesure que l'on s'loigne vers le bas par
rapport au point 0,0.
Toutes les valeurs de pixels sont des entiers, et on ne
peut donc pas utiliser des nombres virgule flottante
pour reprsenter une valeur.

Bouhlel Mohamed Salah 65


Dessiner en java : comment a marche

A. Le systme de coordonnes :

Bouhlel Mohamed Salah 66


La classe Graphics
Pour dessiner, nous utilisons la classe java.awt.Graphics.
Cest la classe abstraite de base de tous les contextes
graphiques qui contient des mthodes permettant de
dessiner du texte ou des formes sur un composant
graphique comme une Applet ou, dans notre cas, un
javax.swing.JPanel.

Dans un javax.swing.JPanel (ou une applet), il n'est pas


ncessaire de crer un objet java.awt.Graphics (ce n'est
d'ailleurs pas possible car cette classe est abstraite).

En fait, cet objet Graphics est pass en paramtre de la


mthode paint (paintComponent). Pour dessiner sur un
composant, il suffit simplement d'crire une classe qui
hrite d'un composant et qui surcharge la mthode paint.

Bouhlel Mohamed Salah 67


La classe Graphics
Puisque la classe Graphics est abstraite, elle ne
peut pas tre crer directement. Il faut :

Redfinir la mthode paint(Graphics g) de la classe


Component qui est charger de dessiner le composant.
Elle est appele automatiquement par le systme lors
dun premier affichage.

Ou

Appeler la mthode getGraphics sur un composant qui


retourne le contexte graphique du composant.
Graphics mongraph = <composant>.getGraphics();
Bouhlel Mohamed Salah 68
La classe Graphics
Dessiner avec la classe Graphics
Graphics offre plusieurs mthodes pour afficher
divers lments :
drawString() affiche du texte
drawImage() affiche une image
drawLine() affiche un segment
fillOval() affiche une ellipse
drawPolygon() affiche un polygone

Exemple
Bouhlel Mohamed Salah 69
Ou vais-je dessiner???
Dessiner dans quel composant ?

On peut dessiner dans tout JComponent mais il


est recommand de dessiner dans un JPanel
(avec un JComponent, le fond dcran risque
donc de ne pas tre repeint lorsquil le faut).

Pour dessiner, on cre une classe qui hrite de


JPanel, dans laquelle on redfinit la mthode
paint ou paintComponent(), avec le code du
dessin.
Bouhlel Mohamed Salah 70
La mthode paintComponent
criture de la mthode paintComponent()
La mthode paintComponent(Graphics g) doit avoir
super.paintComponent(g) comme premire
instruction.
Cela permet la mthode paintComponent() de la
classe JPanel d'effectuer sa part du travail (en particulier
peindre le fond d'cran).

Attention !
il est souvent indispensable de redfinir les mthodes
getPreferredSize() et getMinimumSize() du composant
qui redfinit la mthode paintComponent()
On peut aussi utiliser la mthode
setPreferredSize(Dimension).

Bouhlel Mohamed Salah 71


Mon premier Exemple
import java.awt.*;
import javax.swing.*;

class Test extends JPanel {


public void paint(Graphics g) {
g.setColor(Color.RED);
g.fillRect(10,10,80,80);
g.setColor(Color.BLUE);
g.fillOval(150,50,80,80);
}
public static void main(String[] args) {
Test t=new Test();
JFrame f=new JFrame("Mon dessin");
f.getContentPane ().add (new Test());
f.setSize (300,200);
f.show ();
f.setDefaultCloseOperation (WindowConstants.EXIT_ON_CLOSE);
}}

Bouhlel Mohamed Salah 72


Le graphisme en JAVA
Dessiner dans un composant
Pour tout composant, il est possible de
dfinir comment celui-ci doit tre dessin en
redfinissant une mthode.

AWT
public void paint(Graphics g)
Swing
public void paintComponent(Graphics g)

Bouhlel Mohamed Salah 73


Le graphisme en JAVA
Redessiner
Les mthodes prcdentes sont appel :
lorsque le systme le juge ncessaire
le composant est rendu visible
le composant a chang de taille
un autre composant a boug et a rendu visible une
portion du composant

Lorsque lapplication le juge ncessaire via un


appel une mthode repaint

Bouhlel Mohamed Salah 74


Le graphisme en JAVA
Mthodes repaint
repaint()
redessine tout le composant
repaint(long milliSeconds)
demande que le composant soit redessine avant milliSeconds
repaint (int x, int y, int width, int height)
redessine la portion du composant

paint vs paintComponent
Swing en fait implmente paint pour tout objet JComponent en faisant appel
:
paintComponent
paintBorder
paintChildren

Il ne faut pas chercher (en gnral) redfinir paintBorder et


paintChildren.

Bouhlel Mohamed Salah 75


Le graphisme en JAVA
Dessiner
Redessiner (systmatiquement) tout un composant
perte de temps
scintillement possible
Il est prfrable :
dutiliser la mthode repaint(x,y,width,height)
de rcuprer un contrleur graphique et de lutiliser
dutiliser un timer

Rcuprer un contrleur graphique


Il suffit dappeler la mthode getGraphics (dfinie dans la classe
Component).
On peut alors utiliser ce contrleur.
Toutefois, les modifications apportes au graphisme sont perdues (
moins quelles ne soient gres) lors dun nouveau paint.

Bouhlel Mohamed Salah 76


Le graphisme en JAVA
Relcher un contrleur graphique
Un contrleur graphique peut tre obtenu :
automatiquement : argument des mthodes paint ou paintComponent
la demande : mthode getGraphics

Dans le premier cas, il est relch automatiquement la fin de la


mthode
Dans le second cas, il faut le relcher avec la mthode dispose.

Utiliser un Timer
Un Timer permet deffectuer une action intervalle rgulier.
Il suffit denregistrer un ActionListener auprs de lui.
On peut donc redessiner tout un composant de faon rgulire.

Bouhlel Mohamed Salah 77


Le graphisme en JAVA
Exemple
Pour redessiner toutes les 20ms un composant
donn , on crira :

Timer t = new Timer(20, new ActionListener() {


public void actionPerformed(ActionEvent e){
composant.repaint();}
});

Bouhlel Mohamed Salah 78


Encore la classe Graphics
Classe Graphics
Propose un ensemble de fonctionnalits simple mais limit .
Les proprits du contrleur sont dfinies par :
void setColor(Color c)
void setFont(Font font)
void setPaintMode()
void setXORMode(Color c1)
void setClip(int x, int y, int width, int height)

Modes de dessin
PaintMode : mode (par dfaut) qui permet de remplacer les pixels
existants par ceux qui sont tracs.
XORMode : mode qui permet de combiner les pixels existants avec
ceux qui sont tracs.
on utilise en gnral la couleur de fond lappel
un second trac efface toujours le prcdent

Bouhlel Mohamed Salah 79


Encore la classe Graphics
Clipping
Toute opration de dessin en dehors de la clipping area est sans
effet.
A comparer avec la mthode repaint prenant les mmes arguments.

Fonctions de dessin
drawRectangle fillRectangle
drawRoundRect fillRoundRect
draw3DRect fillDRect
drawPolygon fillPolygon
drawOval fillOval
drawArc fillArc
drawChars
drawLine
drawString
drawImage

Bouhlel Mohamed Salah 80


Graphics2D
Utiliser Graphics2D
Il est possible de manipuler des objets Graphics2D
pour toute version de Java compatible Java 2D.

Pour utiliser ces objets, il suffit deffectuer un


transtypage car de nombreuses fonctions de Java
manipule des rfrences Graphics.

Or Graphics2D est une sous-classe de Graphics et


pour toute version Java compatible Java 2D, les
objets retourns sont issus de cette sous-classe.
Bouhlel Mohamed Salah 81
Graphics2D
Obtenir un contrleur Graphics2D
De faon automatique :
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D)g;
// dessiner avec g2D

A la demande :
Graphics2D g2D = (Graphics2D)getGraphics();

Fonctions principales
void draw(Shape s) : Dessiner une forme
void fill(Shape s) : Remplir une forme

Shape
Une classe gnrale qui reprsente toute forme.
Cette classe abstraite possde de nombreuses sous-classes.
Chaque sous-classe reprsente un type de formes dont certaines pouvaient tre
dessines directement avec Graphics.

Bouhlel Mohamed Salah 82


Graphics2D

Bouhlel Mohamed Salah 83


Graphics2D
Formes 2D virgule flottante
Avec Java 2D, il est possible deffectuer des conversions
entre une mesure naturelle (en mtres par exemple) et
une mesure en pixels.
Pour cette raison, les coordonnes sont donnes en
virgule flottante, cest dire en float ou double.

Consquence
La plupart des classes reprsentant des formes
possdent deux sous-classes statiques.
Lune permet dutiliser des coordonnes de type float
Lautre permet dutiliser des coordonnes de type
double.
Bouhlel Mohamed Salah 84
Graphics2D
Point2D
Point2D qui nest pas sous-classe de Shape utilise aussi cette technique.
Pour crer un point, il faut crire :
Point2D p = new Point2D.Float(5.0f,10.0f);
ou encore :
Point2D p = new Point2D.Double(5.0,10.0);

Line2D
Pour Line2D sous-classe de Shape, on crira :
Line2D line = new Line2D.Float(p1,p2);

ou encore :
Line2D line = new Line2D.Double(p1,p2);
o p1 et p2 reprsentent deux points.

De mme pour les autres sous-classes.

Bouhlel Mohamed Salah 85


Chapitre 3

Les Applets
Qu'est ce qu'une Applet ?
C'est une classe Java compile (byte code)

Cette classe hrite d'une classe mre java.applet.Applet


ou javax.swing.JApplet qui lui donne une certaine
interface (mthodes) :
init() ,
start() ,
paint() ,
stop() ,
destroy()
elle spcifie son comportement en les redfinissant

Elle rside (en gnral) sur un poste serveur distant

Elle est vhicule dans une page HTML qui contient son
URL
Bouhlel Mohamed Salah 87
Qu'est ce qu'une Applet ?
Lorsqu'un navigateur Web compatible Java (avec une JVM) reoit cette
page HTML, il tlcharge (par HTTP) le code de la classe et l'excute
sur le poste client (ie. invoque ses mthodes init() , start() , etc)

C'est alors une vritable application qui s'excute dans la page HTML
du navigateur qui peut :
construire et grer une interface graphique,
crer de nouveaux threads, ouvrir des connexions rseaux, ...

Pour viter certains ennuis (virus, ) et pour assurer une excution


sre sur le poste client, les navigateurs brident le comportement de
l'applet
pas de lecture/criture de fichiers
pas de communication avec d'autres machines que celle depuis laquelle
l'applet a t charge
pas d'excution de programmes (processus)
pas de chargement de programmes natifs (binaires, DLL, driver, )

Bouhlel Mohamed Salah 88


Les intrts
Il est possible :

de modifier le programme afin de lui donner un nouveau


comportement sans modifier la page HTML.

d'incorporer cette applet dans plusieurs pages HTML et


de lui donner des comportements diffrents selon les
paramtres qui lui sont associs.

que d'autres serveurs lui fassent rfrence

Bouhlel Mohamed Salah 89


Invoquer une applet
la balise <applet>
<applet> dans un document HTML indique au navigateur qu'il doit
charger une applet

Exemple :
<html>
<applet
code="HelloWorld.class"
width=ww
height=hh
>
texte de substitution si le navigateur ne comprend pas Java
</applet>
</html>

Bouhlel Mohamed Salah 90


Syntaxe Complete
<applet
Code = nom du fichier (.class) : contenant la dfinition de la
classe

[codebase = rpertoire ] : localisation, relative ou absolue, du fichier


ci-dessus

Width = largeur de lapplet : largeur initiale en pixels rserv pour


lapplet

height = hauteur de lapplet : hauteur initiale en pixels rserv pour


lapplet

[Align = left | right | top | bottom ] : justification de lapplet dans la


page

[hspace = marge horizontale ] : marge, en pixel, insre gauche et


droite de lapplet
Bouhlel Mohamed Salah 91
Syntaxe Complete
[vspace = marge verticale ] : marge, en pixel, insre au
dessus et en dessous de lapplet

[Name = nom de cette applet ] : nom unique permettant


didentifier lapplet

[alt = texte ] : texte affich si le navigateur est compatible


Java mais que lexcution de code Java a t interdite.
>
[ <param name = un_nom value = une_valeur > ]
[ <param name = un_nom value = une_valeur > ]

[ texte affich par un navigateur non compatible avec


Java ]

</applet>
Bouhlel Mohamed Salah 92
La syntaxe de la balise
Code = "test.class" (obligatoire) : nom de la classe principale

Width = 200, height=30 (obligatoire) : taille en pixels

Hspace =10, vspace=10 : espace en pixels autour de l'applet

Codebase = "codebaseURL" : URL de base pour l'applet (par


dfaut : le rpertoire courant)

Name = "Test_java" : pour nommer une applet (plusieurs applets


nommes peuvent communiquer au sein d'une mme page HTML)

align= (left | right | top | bottom ) : alignement

Archive = "test.jar ou test.zip" : fichier archive contenant les classes


de l'applet
Bouhlel Mohamed Salah 93
Passage de paramtres
De HTML l'applet : paramtres utilisateurs
utilisation de la balise <PARAM>

<applet code="javaclass.class" width=ww height=hh >


<param name = "nom1" value = "value1">
<param name = "nom2" value = "value2">

<param name = "nomn" value = "valuen">
</applet>
Bouhlel Mohamed Salah 94
Ecrire une applet
Il faut driver de la classe java.applet.Applet ou
javax.swing.JApplet

public class MonApplet extends java.applet.Applet {}


ou
public class MonApplet extends javax.swing.JApplet {}

pas de mthode main() mais une mthode init()

et redfinir les mthodes hrites pour spcifier son propre


comportement :
public void init();
public void start();
public void stop();
public void destroy();
public void paint(Graphics);
Bouhlel Mohamed Salah 95
Le cycle de vie
Une fois l'applet charge par le navigateur, une
instance de l'applet est automatiquement cre.

Les excutions successives des mthodes (init() ,


start() , ...) par le navigateur constituent le cycle de
vie de l'applet :
init()

start()

stop()

destroy()

Bouhlel Mohamed Salah 96


Les mthodes du cycle de vie
public void init() :
appele une seule fois par le navigateur l'initialisation de
l'applet lorsqu'elle est charge (ou recharge)

public void start() :


dmarrage de l'applet par le navigateur
appele aprs init() ou stop()

public void stop() :


arrt de l'applet par le navigateur
chaque fois que l'utilisateur change de page, iconifie le
navigateur

public void destroy() :


pour dtruire l'applet
aprs un stop() ou mort du navigateur
Bouhlel Mohamed Salah 97
Exemple du nombre cach

Bouhlel Mohamed Salah 98


Lapplet et le Graphisme
Si l'applet est graphique (la majorit des cas car elle drive
de java.awt.Panel), son activit principale est dfinie dans
sa mthode paint().

paint() est invoque par le navigateur lors d'vnements


ncessitant de redessiner la surface occupe par l'applet.
Elle reoit comme paramtre un objet de la classe Graphics
Graphics dcrit l'environnement graphique courant

import java.awt.Graphics;
public class MonApplet extends java.applet.Applet {
public void paint(Graphics gc) {
gc.drawLine(50, 25, 100, 25);
}
}
Bouhlel Mohamed Salah 99
Les mthodes graphiques
public void repaint() :
rafrachissement du programme graphique provoque
l'appel la mthode paint() par l'AWT ne pas
surcharger !

public void update(Graphics g) :


appele par le navigateur pour redessiner un bout du
programme graphique
dessine un rectangle de la couleur du fond sur la zone
redessiner, puis appelle paint()

public void paint(Graphics g) :


ici : toutes les oprations de dessin
ne doit pas tre appele par le programmeur (repaint() )
Bouhlel Mohamed Salah 100
Exemple
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Applet2 extends JApplet {


int x=0, y=0;
JPanel p=new JPanel();

public void init() {


this.getContentPane ().add (p);
p.addMouseMotionListener (new MouseMotionAdapter(){
public void mouseMoved(MouseEvent e){
Graphics g=p.getGraphics ();
update (g);
x=e.getX ();
y=e.getY ();
g.setFont (new Font("Monospaced", Font.ITALIC, 20));
g.setColor (Color.BLUE);
g.drawString ("x= "+x+" , y= "+y, 50,100);
}
});
}}

Bouhlel Mohamed Salah 101


Rcupration des paramtres
<applet code="javaclass.class" width=ww height=hh>
<param name="File" value="toto.txt">
<param name="Count" value="2">
</applet>

Pour les rcuprer depuis l'applet :


getParameter() rcupre dans une String la valeur associe au paramtre

public class MonApplet extends java.applet.Applet {


public void init() {
String filename = getParameter("File");
if(filename == null) {// parametre non defini}
int count = Integer.parseInt(getParameter("Count"));
}
}

Bouhlel Mohamed Salah 102


Rcupration des paramtres (Exemple)

<applet code=JeuApplet2 width=300 height=200>


< param name = "nom" value = "hamdi >
</applet>

Bouhlel Mohamed Salah 103


Techniques lies aux applets
Rcupration du contexte de l'applet :
AppletContext accde des ressources
externes :
comme accder au navigateur
ou accder aux autres applets de la page HTML
Java.applet.AppletContext

Pour rcuprer cet objet : la mthode


getAppletContext() de la classe Applet :
AppletContext context = getAppletContext()
Bouhlel Mohamed Salah 104
Les mthodes de AppletContext
getApplet() :
retourne la rfrence de l'applet courante

getApplets() :
retourne les rfrences de toutes les applets de la page HTML

getImage(java.net.URL) :
accde une image partir de son URL

showDocument(java.net.URL) :
demande au navigateur de charger un nouveau document HTML
identifi par son URL

showStatus(String) :
Pour afficher des messages d'erreur, des indications sur la manire
d'utiliser le programme (aide, conseils, ), dans la barre dtat.
Bouhlel Mohamed Salah 105
Les mthodes de AppletContext
showDocument()
Pour charger des ressources Internet comme :
page Web, fichier transfr par ftp, etc.

identifies par leur URL (java.net.URL)

URL url = new URL("http://www.google.com");


getAppletContext().showDocument(url);

Bouhlel Mohamed Salah 106


Communiquer entre applets
getApplets()
Les diffrentes applets d'une mme page HTML partagent la mme
JVM et vont donc pouvoir communiquer entre elles
Pour rcuprer la liste des applets :

Enumeration liste = getAppletContext().getApplets();


while(liste.hasMoreElements()){
Applet ap = (Applet) liste.nextElement();
}

Pour rcuprer l'applet identifie par le paramtre NAME de la


balise <applet> :

Applet ap = (Applet) getAppletContext().getApplet("monApplet");

Bouhlel Mohamed Salah 107


Obtenir des informations sur l'applet
getAppletInfo() :
retourne un texte d'information sur l'applet
(String)

getCodeBase() :
retourne l'URL (java.net.URL) de l'applet

getDocumentBase()
retourne l'URL du document o se trouve l'applet

Bouhlel Mohamed Salah 108


Exemple 1
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;

public class AppletParam extends JApplet implements ActionListener{


JPanel p=new JPanel();
JButton b1=new JButton("Mthode getDocumentBase()");
JButton b2=new JButton("Mthode getCodeBase()");
JButton b3=new JButton("getAppletContext ().showStatus (String)");
JButton b4=new JButton("getAppletContext ().showDocument(URL)");
JButton b5=new JButton("optenir une rfence de l'applet getAppletContext ().getApplet");

public void init() {


p.setLayout (new GridLayout(10,1));
p.add (b1); b1.addActionListener (this);
p.add (b2); b2.addActionListener (this);
p.add (b3); b3.addActionListener (this);
p.add (b4); b4.addActionListener (this);
p.add (b5); b5.addActionListener (this);
this.getContentPane ().add (p);
}
Bouhlel Mohamed Salah 109
Exemple 1
public void actionPerformed(ActionEvent e){
JButton src=(JButton)e.getSource ();
if(src==b1)
JOptionPane.showMessageDialog (this, this.getDocumentBase());
if(src==b2)
JOptionPane.showMessageDialog (this, this.getCodeBase ());
if(src==b3)
this.getAppletContext ().showStatus ("mon message de status");
if(src==b4)
try { this.getAppletContext ().showDocument (new
URL("http:\\"+"\\www.google.com"));}
catch(MalformedURLException ee){JOptionPane.showMessageDialog
(this, "erreur URL");}
if(src==b5)
JOptionPane.showMessageDialog (this,this.getAppletContext
().getApplet ("monapplet"));
}
}

Excution

Bouhlel Mohamed Salah 110


Exemple 2
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;

public class AppletParam2 extends JApplet{


Image im;
public void init() {
try{
im=getImage(new URL(getCodeBase().toString ()+"1.GIF"));
}
catch(MalformedURLException ee)
{JOptionPane.showMessageDialog (this, "erreur URL");}
}

public void paint(Graphics g){


g.drawImage (im,10,10,this);
}
}

Excution

Bouhlel Mohamed Salah 111


Obtenir des proprits systmes
Des informations sur le contexte d'excution
Conformment aux rgles de scurit des applets,
le navigateur n'autorise pas l'accs toutes les
informations.

comme celles qui accdent aux ressources


propres du poste d'excution :
nom de l'utilisateur, variable CLASSPATH, etc.
ou toutes informations concernant le disque dur local

Pour accder celles autorises :


String info = System.getProperty("cle");
Bouhlel Mohamed Salah 112
Le dploiement des applets
Mettre l'applet en exploitation sur un serveur Web
intervient en fin de dveloppement : une fois que l'applet
compil et s'excute (appletviewer)

Des problmes peuvent intervenir :


cause du contexte d'excution
du navigateur utilis (version du JDK?)
quelles classes faut-il dployer ?

Une solution Java pour obtenir une version


"dployable"
le fichier archive
Bouhlel Mohamed Salah 113
Le fichier archive
Regroupe l'ensemble des classes et lments
(images,) requis lors de l'excution de l'applet,
en un seul fichier physique

c'est ce seul fichier qu'il faudra dployer sur le serveur,


pas obligatoire mais vivement recommand :

2 formats principaux :
ZIP
JAR (Java ARchive) depuis le JDK 1.1 (le plus utilis)

galit parfaite entre la taille des archives ZIP et JAR


ces 2 formats peuvent tre aussi compresss
Bouhlel Mohamed Salah 114
Contenu du fichier archive
Il doit contenir :
les classes ncessaires au fonctionnement du
programme :
les classes implmentes propres au projet,
les librairies de classes externes

et les fichiers de ressources annexes :


fichiers images, fichiers sons, fichier d'aide HTML,

Il ne doit pas contenir :


la page HTML de lancement
les classes faisant partie du JDK
Bouhlel Mohamed Salah 115
Page de lancement et fichier archive
La proprit ARCHIVE dans la balise <applet> de la page
HTML de lancement indique au navigateur dans quel fichier
archive il trouvera l'ensemble des classes utilises par
l'applet :

<applet
codebase = "Applets/"
code = "HelloWorldApplet.class"
name = "HelloWorld_Applet"
width = 200
height = 200
archive = "HelloWorldApplet.jar;AutresClasses.zip">
</applet>
Bouhlel Mohamed Salah 116
Excution dans un navigateur
Dialogue entre le navigateur et le serveur :

1. Le navigateur charge la page HTML et l'affiche

2. Il y dtecte (balise <applet> ) une applet

3. Il charge depuis le serveur la classe principale (attribut code)

4. Si cette classe est autonome, il l'excute. Sinon, cette classe de base


rfrence une autre classe

5. Il regarde dans les classes charges s'il peut la trouver :


dans les classes connues de la JVM (celles du JDK)
dans celles dj charges dans la mme session
dans les classes et fichiers archives spcifis par son implmentation du Class
Path (dpend du navigateur)

6. Si il la trouve, il l'excute sinon il la demande au serveur en regardant en


priorit dans le fichier archive (balise archive)

Bouhlel Mohamed Salah 117


Exemple de Cration de fichier
JAR
Pour cela il faut dans un premier temps crer un
fichier manifest.txt ayant le contenu suivant:
Manifest-Version: 1.0
Created-By: nomDeLAuteur
Main-Class: ClassePrincipale

Il ne reste plus qu'a gnrer l'archive jar avec la


commande suivante:

jar -cmf manifest.txt fichier.jar *.class *.gif

Bouhlel Mohamed Salah 118


Chapitre 4 :

Multithreading en Java
Quest ce que le multitche
Dfinitions
Un programme est multitche quand il lance (ou
peut lancer) lexcution de plusieurs parties de
son code en mme temps
A un moment donn, il comporte plusieurs points
dexcution lis aux diffrentes parties qui
s'excutent en parallle

Bouhlel Mohamed Salah 120


Threads et processus
Ce multitche s'appuie sur les processus ou les
threads (processus lgers)

Chaque processus a son propre espace mmoire


(espace o sont ranges les valeurs des variables
utilises par le processus)

Un processus peut lancer plusieurs threads qui se


partagent le mme espace mmoire et peuvent
donc se partager des variables

Un thread prend moins de ressources systme


quun processus
Bouhlel Mohamed Salah 121
Les Threads Java
Java supporte l'utilisation des threads A linverse de la
plupart des autres langages, le programmeur n'a pas
utiliser des librairies natives du systme pour crire des
programmes multitches

Avantages :
lgret grce au partage des donnes
meilleures performances au lancement et en excution
partage les ressources systme (pratique pour les I/O)

Utilit :
puissance de la modlisation : un monde multithread
puissance d'excution : paralllisme
simplicit d'utilisation : c'est un objet Java.

Bouhlel Mohamed Salah 122


Les Threads Java
A tout thread Java sont associs
un objet qui dtermine le code qui est excut
par le thread

un objet qui contrle le thread et le


reprsente auprs des objets de lapplication ;
on lappellera le contrleur de thread

Bouhlel Mohamed Salah 123


Contrleur de Thread
Le contrleur dun thread est un objet qui :
est lintercesseur entre le thread et les objets de
lapplication

permet de contrler lexcution du thread (pour


le lancer en particulier)

a des informations sur ltat du thread (son nom,


sa priorit, sil est en vie ou non,)

est une instance de la classe Thread (ou une


classe fille)

Bouhlel Mohamed Salah 124


Classe Thread
Elle implmente l'interface Runnable (mais la
mthode run() ne fait rien)

Une instance dune classe fille de Thread peut


donc tre la fois un contrleur de thread et dfinir
le code excuter.

2 faons de crer un contrleur de thread


Crer une instance dune classe fille de la classe Thread ;
la classe fille doit redfinir la mthode run()
Utiliser le constructeur Thread(Runnable) de la classe
Thread :
crer un Runnable
le passer au constructeur de Thread
Bouhlel Mohamed Salah 125
1re faon : sous classer Thread
public class Proc1 extends java.lang.Thread {
public Proc1() {} // Le constructeur

public void run() { //redfinition de le mthode run
// Ici ce que fait le processus
}
}

Proc1 p1 = new Proc1(); // Cration du processus


p1.start(); // Dmarre le processus et excute p1.run()
Bouhlel Mohamed Salah 126
2me faon : Implmenter Runnable
La classe de lobjet qui dfinit le code
excuter doit implmenter linterface
Runnable

public interface Runnable {


void run();
}

mthode qui contient le code


excuter par le thread
Bouhlel Mohamed Salah 127
2me faon : Implmenter Runnable
public class Proc2 implements java.lang.Runnable
{
public Proc2() {} // Constructeur

public void run() { //implmentation de la mthode run
// Ici ce que fait le processus
}
}

Proc2 p = new Proc2();


Thread p2 = new Thread(p);
p2.start(); // Dmarre un processus qui excute p.run();

Bouhlel Mohamed Salah 128


Quelle solution choisir ?
Mthode 1 : sous-classer Thread
pour parallliser une classe qui n'hrite pas dj
d'une autre classe (attention : hritage simple)
cas des applications autonomes

Mthode 2 : implmenter Runnable


lorsqu'une super-classe est impose
cas des applets :
public class MyThreadApplet extends Applet
implements Runnable {}
Bouhlel Mohamed Salah 129
Exemple1
import javax.swing.*;
import java.util.*;
import java.text.*;

class MontreFrame extends Thread {


JFrame f=new JFrame("Ma Montre");
JLabel res=new JLabel();

MontreFrame(){
res.setHorizontalAlignment(JLabel.CENTER);
f.getContentPane().add(res);
f.setSize(100,200);
f.show();
this.start();
}

public void run(){


while(true){
Date d=new Date();
DateFormat df=DateFormat.getTimeInstance();
res.setText(df.format(d));
try{sleep(1000);}catch(InterruptedException e){}
}
}

public static void main(String[] args){


new MontreFrame();
}
}
Bouhlel Mohamed Salah 130
Exemple2
import javax.swing.*;
import java.util.*;
import java.text.*;

public class MontreApplet extends JApplet implements Runnable {


JLabel res=new JLabel();
Thread t=new Thread(this);

public void init(){


res.setHorizontalAlignment(JLabel.CENTER);
this.getContentPane().add(res);
t.start();
}

public void run(){


while(true){
Date d=new Date();
DateFormat df=DateFormat.getTimeInstance();
res.setText(df.format(d));
try{t.sleep(1000);}catch(InterruptedException e){}
}
}
} Bouhlel Mohamed Salah 131
Exemple 2 : Version2
import javax.swing.*;
import java.util.*;
import java.text.*;
import java.awt.*;

public class MontreApplet2 extends JApplet implements Runnable {


Thread t=new Thread(this);
JPanel p=new JPanel();

public void init(){ this.getContentPane().add(p); }

public void start(){ t.start();}

public void run(){


while(true){
p.repaint();
Date d=new Date();
DateFormat df=DateFormat.getTimeInstance();
p.getGraphics().drawString(df.format(d),50,50);
try{t.sleep(1000);}catch(InterruptedException e){}
}
}

public void stop(){ t.stop(); }


}
Bouhlel Mohamed Salah 132
Lancer lexcution d'un thread
On appelle la mthode start() du contrleur de
thread :
t.start();

Le code du Runnable sexcute en parallle au


code qui a lanc le thread.

Attention, une erreur serait dappeler directement


la mthode run() : la mthode run() serait
excute par le thread qui la appele et pas par
un nouveau thread.
Bouhlel Mohamed Salah 133
Vie du contrleur de thread
Le contrleur de thread existe
indpendamment du thread,
avant le dmarrage du thread, par exemple,
pour initialiser des variables d'instances du
contrleur

aprs la fin de lexcution de ce thread, par


exemple, pour rcuprer des valeurs calcules
pendant lexcution du thread et ranges dans
des variables dinstances du contrleur

Bouhlel Mohamed Salah 134


Utilisation d'une classe interne
La mthode run est public
Si on ne souhaite pas quelle soit appele
directement, on peut utiliser une classe
interne une classe fille de Thread pour
implmenter Runnable

Bouhlel Mohamed Salah 135


Exemple de classe interne
import javax.swing.*;
import java.util.*;
import java.text.*;
import java.awt.*;

class MontreFrameInterne
{
JFrame f=new JFrame("Ma Montre");
JLabel res=new JLabel();
Thread t=new ThreadInterne();

private class ThreadInterne extends Thread{


public void run(){
while(true){
Date d=new Date();
DateFormat df=DateFormat.getTimeInstance();
res.setText(df.format(d));
try{sleep(1000);}catch(InterruptedException e){}
}
}
}
// reste du code identique
}

Bouhlel Mohamed Salah 136


Utilisation d'une classe interne anonyme
Si le code d'une tche comporte peu de lignes, on peut lancer son
excution en parallle en utilisant une classe anonyme :

Thread t = new Thread() {


...
public void run() {
...
}
};

t.start();

Ou encore :
new Thread( new Runnable() {
...
public void run() . . .
}});
Bouhlel Mohamed Salah 137
Exemple classe interne anonyme
import javax.swing.*;
import java.util.*;
import java.text.*;

class MontreFrameAnonyme
{
JFrame f=new JFrame("Ma Montre");
JLabel res=new JLabel();
Thread t=new Thread(){
public void run(){
while(true){
Date d=new Date();
DateFormat df=DateFormat.getTimeInstance();
res.setText(df.format(d));
try { sleep(1000); }catch(InterruptedException e){}
}
}
};
//reste du code identique
Bouhlel Mohamed Salah 138
Mthodes principales de la classe Thread
void start()

static void sleep(long) throws InterruptedException

void join() throws InterruptedException

void interrupt()

static boolean interrupted()

int getPriority() | void setPriority(int)

static Thread currentThread()


static void yield()
Bouhlel Mohamed Salah 139
Thread courant
La mthode currentThread
Place dans une mthode de nimporte quelle
classe, elle retourne lobjet Thread qui contrle
le thread qui excute cette mthode au moment
o currentThread est appel.

On peut ainsi faire un traitement spcial dans le


cas o la mthode est excut par un certain
thread (par exemple le thread de rpartition des
vnements dans un GUI)

Bouhlel Mohamed Salah 140


Attente de la fin dun thread
Soit un thread t
t.join();
attend la fin de lexcution du thread t

On remarquera quaprs la fin de lexcution


du thread t on peut encore envoyer des
messages lobjet contrleur de thread t

On peut ainsi interroger t pour rcuprer le


rsultat dun calcul effectu par le thread
Bouhlel Mohamed Salah 141
Passer la main
La mthode static de la classe Thread
public static void yield()
permet de passer la main un autre thread
de priorit gale ou suprieure.

Elle permet d'crire des programmes plus


portables qui s'adaptent mieux aux systmes
multitches non premptifs (Macintosh ou
Green Threads de Solaris)

Bouhlel Mohamed Salah 142


Dormir
La mthode static de la classe Thread
public static void sleep(long millis) throws
InterruptedException
fait dormir le thread qui l'appelle

Si elle est excute dans du code


synchronis, le thread ne perd pas le
moniteur (au contraire de wait())

Bouhlel Mohamed Salah 143


Interrompre un thread en attente
Un thread peut se mettre en attente par la mthode
sleep, ou par l'attente d'une entre-sortie, ou par
wait ou join.

Un autre thread peut interrompre cette attente par


la mthode interrupt().

Remarque : jusqu la version SDK1.3 de Java,


interrupt n'interrompt pas une attente d'entre-
sortie ; il faut utiliser le paquetage java.nio du SDK
1.4 pour cela.
Bouhlel Mohamed Salah 144
Threads et exceptions
Si une exception nest pas traite (par un
bloc try-catch), elle interrompt lexcution du
thread courant mais pas des autres threads

La mthode run ne peut dclarer lancer une


exception contrle car elle redfinit une
mthode sans clause throws .

Bouhlel Mohamed Salah 145


Cycle de vie dun Thread

Bouhlel Mohamed Salah 146


Problme de Synchronisation
Les Threads partagent les mmes ressources
(mmoire, variables du processus etc.). Dans
certaines situations, il est ncessaire de
synchroniser les threads pour obtenir un rsultat
cohrent.

Prenant lexemple dun MegaPhone et de plusieurs


Orateurs dans une assemble.

De ce fait, nous avons besoin de synchroniser


l'accs au MegaPhone de telle manire ne
donner le MegaPhone a un orateur que lorsque
celui qui le dtient a terminer son discours.

Bouhlel Mohamed Salah 147


Sections critiques
En programmation, des sections de code critiques
ne peuvent tre excutes en mme temps par
plusieurs threads sans risquer de provoquer des
anomalies de fonctionnement.

Exemple simpliste :
x = 2;
x++;
excut par 2 threads, peut donner en fin
dexcution 3 ou 4 suivant lordre dexcution, si
les threads utilisent un cache local (registre par
exemple) pour ranger la valeur de x.
Bouhlel Mohamed Salah 148
Pourquoi synchroniser ?
Il faut donc viter lexcution simultane de
sections de code critiques par plusieurs
threads

Par exemple, si plusieurs threads veulent


modifier en mme temps le mme objet, on
devra les synchroniser pour quils effectuent
ces modifications les uns aprs les autres.

Bouhlel Mohamed Salah 149


Mcanisme de synchronisation
En Java, la synchronisation des threads
repose sur les moniteurs des objets

Chaque objet Java a un moniteur qui


contrle lautorisation dexcuter du code
synchronis sur cet objet : un seul thread
peut possder le moniteur dun objet un
moment donn

Bouhlel Mohamed Salah 150


Notion de Moniteur
Le moniteur est utilis pour synchroniser l'accs une ressource
partage.

Cette ressource peut-tre un segment d'un code donn ou une mthode


(dinstance ou de classe).

Un thread accde cette ressource par l'intermdiaire de ce moniteur.

Ce moniteur est attribu un seul thread la fois (comme dans un


relais 4x100m o un seul coureur tient le tmoin dans sa main pour le
passer au coureur suivant ds qu'il a termin de courir sa distance).

Pendant que le thread excute la ressource partage aucun autre


thread ne peut y accder.

Le thread libre le monitor ds qu'il a termin l'excution du code


synchronis, ou bien s'il a fait appel la mthode wait de l'objet.

Bouhlel Mohamed Salah 151


Code synchronis sur un objet o
Mthode synchronise m (avec un message
envoy lobjet o : o.m()) :
public synchronized int m ( )
{
// Code de la mthode
}

Bloc synchronis sur cet objet :


synchronized (o) {
// le code synchronis
...
}

Bouhlel Mohamed Salah 152


Mcanisme de synchronisation
Un thread t acquiert le moniteur dun objet en
excutant du code synchronis sur cet objet

t rend le moniteur en quittant le code synchronis


(ou en appelant la mthode wait() de lobjet o)

Il peut quitter le code synchronis normalement, ou


si une exception est lance et non saisie

Bouhlel Mohamed Salah 153


Mcanisme de synchronisation
Aucun autre thread ne peut excuter du code
synchronis sur le mme objet o tant que t excute
le code synchronis.

Si un autre thread veut excuter du code


synchronis sur o, il est mis en attente.

Lorsque t rend le moniteur, un des threads en


attente se saisira du moniteur et pourra
redmarrer.

Les autres threads en attente auront la main tour


de rle (si tout se passe bien)
Bouhlel Mohamed Salah 154
Exemple
class Orateur extends Thread{
String nom, discours; MegaPhone mph;
public Orateur(String n, String d, MegaPhone m){
nom=n;
discours= d;
mph=m;
start();
}
public void run(){
mph.parler(nom, discours, this);
}
}

class Assemblee{
public static void main(String[] a){
MegaPhone mph=new MegaPhone();
new Orateur("Orateur1 "," je suis 1 ", mph);
new Orateur("Orateur2 "," je suis 2 ", mph);
new Orateur("Orateur3 "," je suis 3 ", mph);
}
}

Bouhlel Mohamed Salah 155


Exemple (Suite)
//Synchronisation de section de code
class MegaPhone{
void parler(String qui, String dit, Thread t){
synchronized(this){
for(int i=0; i<=4;i++){
System.out.println(qui+" affirme :"+dit);
try{t.sleep (100);}
catch(InterruptedException e){}
}
}
}
}
Bouhlel Mohamed Salah 156
Exemple (Suite)
//synchronisation de mthode
class MegaPhone{
synchronized void parler(String qui, String dit, Thread t){
for(int i=0; i<=4;i++){
System.out.println(qui+" affirme :"+dit);
try{t.sleep (100);}
catch(InterruptedException e){}
}
}
}

Bouhlel Mohamed Salah 157


Mthode synchronise et hritage
La redfinition dune mthode synchronise
dans une classe fille peut ne pas tre
synchronise.

De mme, la redfinition dune mthode non


synchronise peut tre synchronise.

Bouhlel Mohamed Salah 158


wait et notify
Lorsquun programme est multi-tche, la situation
suivante peut se rencontrer :
Un thread t1 ne peut continuer son excution que si une
condition est remplie.
Le fait que la condition soit remplie ou non dpend dun
autre thread t2

Une solution coteuse serait que t1 teste la


condition intervalles rguliers

Les mthodes wait() et notify() de la classe


Object permettent de programmer plus
efficacement ce genre de situation

Bouhlel Mohamed Salah 159


Schma dutilisation de wait-notify
Cette utilisation demande un travail
coopratif entre les threads t1 et t2 :
1. Ils se mettent daccord sur un objet commun
objet
2. Arriv lendroit o il ne peut continuer que si
la condition est remplie, t1 se met en attente :
objet.wait();
3. Quand t2 a effectu le travail pour que la
condition soit remplie, il le notifie :
objet.notify();
Bouhlel Mohamed Salah 160
Besoin de synchronisation
Le mcanisme dattente-notification li un
objet met en jeu ltat interne de lobjet ; pour
viter des accs concurrent cet tat
interne, une synchronisation est ncessaire

Les appels aux mthodes wait() et notify()


(et notifyAll()) dun objet ne peuvent donc
tre effectus que dans du code synchronis
sur lobjet.

Bouhlel Mohamed Salah 161


Mthode wait()
public final void wait()
throws InterruptedException

objet.wait()
ncessite que le thread en cours possde le moniteur de
objet.
bloque le thread qui lappelle, jusqu ce quun autre
thread appelle la mthode objet.notify() ou
objet.notifyAll().
libre le moniteur de lobjet (lopration blocage du
thread libration du moniteur est atomique)

Bouhlel Mohamed Salah 162


Mthode notifyAll()
public final void notifyAll()
objet.notifyAll()
ncessite que le thread en cours possde le
moniteur de objet.
dbloque tous les threads qui staient bloqus
sur lobjet avec objet.wait().

Bouhlel Mohamed Salah 163


Mthode notifyAll()
Un seul des threads dbloqus va rcuprer
le moniteur ; on ne peut prvoir lequel.

Les autres devront attendre quil relche le


moniteur pour tre dbloqus tour de rle,
mais ils ne sont plus bloqus par un wait.

En fait, ils se bloqueront nouveau eux-


mmes le plus souvent (sils sont dans une
boucle while avec wait).
Bouhlel Mohamed Salah 164
Mthode notify()
objet.notify()
idem notifyAll() mais
ne dbloque quun seul thread

On ne peut prvoir quel sera le thread dbloqu et, le


plus souvent, il vaut donc mieux utiliser notifyAll()

Bouhlel Mohamed Salah 165


Dblocage des threads
Le thread dbloqu (et lu) ne pourra
reprendre son excution que lorsque le
thread qui la notifi rendra le moniteur de
lobjet en quittant sa portion de code
synchronis.

Le redmarrage et lacquisition se fait dans


une opration atomique

Bouhlel Mohamed Salah 166


Exemple :
Producteur/Consommateur
une instance dune classe Entrepot contient
un jeton
Ce jeton est
dpos par un producteur
consomm par un consommateur

Le producteur et le consommateur sont des


threads.
Bouhlel Mohamed Salah 167
Exemple (Suite)
public class Producteur extends Thread {
private Entrepot entrepot;
private String nom;

public Producteur(Entrepot entrepot, String nom) {


this.entrepot = entrepot;
this.nom = nom;
}

public void run() {


for (int i = 0; i < 10; i++) {
entrepot.deposer(i);
System.out.println("Le producteur " + this.nom + " produit " + i);
try {
sleep((int) (Math.random() * 100));
} catch (InterruptedException e) {}
}
}
}
Bouhlel Mohamed Salah 168
Exemple (Suite)
public class Consommateur extends Thread {

private Entrepot entrepot;


private String nom;

public Consommateur(Entrepot entrepot, String nom) {


this.entrepot = entrepot;
this.nom = nom;
}

public void run() {


int valeur = 0;
for (int i = 0; i < 10; i++) {
valeur = entrepot.prendre();
System.out.println("Le consommateur " +
this.nom + " consomme" + valeur);
}
}
}
Bouhlel Mohamed Salah 169
Exemple (Suite)
public class Entrepot { public synchronized void deposer(int
private int contenu; valeur) {
private boolean disponible = false; while (disponible == true) {
try {
public synchronized int prendre() {
wait();
while (disponible == false) {
try { }catch (InterruptedException e)
wait(); {}
} catch (InterruptedException e) {} }
} contenu = valeur;
disponible = false; disponible = true;
notifyAll();
notifyAll();
return contenu;
} }}

Bouhlel Mohamed Salah 170


Exemple (Suite)
public class Essaie {
public static void main(String[] args) {
Entrepot entrepot = new Entrepot();
Producteur producteur = new Producteur(entrepot, "P");
Consommateur consommateur = new Consommateur(entrepot, "C");

producteur.start();
consommateur.start();
}
}
Bouhlel Mohamed Salah 171
Priorits : Principe de base
Si plusieurs threads de mme priorit sont
en excution, on ne peut pas prvoir quel
thread va prendre la main.

Sils sont en attente dexcution, un thread


de plus grande priorit prendra toujours la
main avant un autre thread de priorit plus
basse.

Bouhlel Mohamed Salah 172


Niveaux de priorit
Un nouveau thread a la mme priorit que le
thread qui la cr

En gnral, tous les threads ont la mme priorit (


NORM_PRIORITY )

Il faut faire appel la mthode setPriority si on


veut modifier cette priorit par dfaut;

Le paramtre de setPriority doit tre inclus entre


MIN_PRIORITY et MAX_PRIORITY (de 0 10)

Bouhlel Mohamed Salah 173


Threads dmons
2 types de threads
les threads utilisateur
les dmons

La diffrence :
la JVM fonctionne tant quil reste des threads utilisateurs
en excution
la JVM sarrte sil ne reste plus que des dmons

Les dmons sont l seulement pour rendre service


aux threads utilisateur. Exemple : ramasse-miettes
Bouhlel Mohamed Salah 174
Threads dmons
La mthode void setDaemon(boolean on)
de la classe Thread permet dindiquer que le
thread sera un dmon (thread utilisateur par
dfaut)

Elle doit tre appele avant le dmarrage du


thread par lappel de start()

Bouhlel Mohamed Salah 175


Bouhlel Mohamed Salah 176
Bouhlel Mohamed Salah 177
Bouhlel Mohamed Salah 178
Bouhlel Mohamed Salah 179
Bouhlel Mohamed Salah 180
Bouhlel Mohamed Salah 181

Vous aimerez peut-être aussi