Académique Documents
Professionnel Documents
Culture Documents
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
AWT
SWING
// 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);
Les conteneurs,
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
Constante Role
WindowConstants.DISPOSE_ON_CLOSE dtruit la fentre
Exemples de composant :
JLabel : les tiquettes
JButton : les boutons
JTextField : les champs texte
JTextArea : les zones de texte multiligne.
Quelques mthodes :
void setLabel(String) : affecte un libell au bouton.
void setSize(int, int): affecte une dimension au bouton.
Quelques mthodes :
void setText() : affecte du texte a la zone label.
void setSize(int, int): affecte une dimension au a a zone Label.
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.
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());
b.setText("mon bouton");
l.setText("ma zone label");
f.setText("ali va au sook");
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setVisible(true);
pack();
}
b.setText("mon bouton");
l.setText("ma zone label");
f.setText("ali va au sook");
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setVisible(true);
pack();
}
show();
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
Bouhlel Mohamed Salah 45
GridLayout
public MaFenetre() {
super();
setTitle(" Ma Fenetre ");
setSize(300, 150);
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);
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.
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
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.
A. Le systme de coordonnes :
Ou
Exemple
Bouhlel Mohamed Salah 69
Ou vais-je dessiner???
Dessiner dans quel composant ?
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).
AWT
public void paint(Graphics g)
Swing
public void paintComponent(Graphics g)
paint vs paintComponent
Swing en fait implmente paint pour tout objet JComponent en faisant appel
:
paintComponent
paintBorder
paintChildren
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.
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
Fonctions de dessin
drawRectangle fillRectangle
drawRoundRect fillRoundRect
draw3DRect fillDRect
drawPolygon fillPolygon
drawOval fillOval
drawArc fillArc
drawChars
drawLine
drawString
drawImage
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.
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.
Les Applets
Qu'est ce qu'une Applet ?
C'est une classe Java compile (byte code)
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, ...
Exemple :
<html>
<applet
code="HelloWorld.class"
width=ww
height=hh
>
texte de substitution si le navigateur ne comprend pas Java
</applet>
</html>
</applet>
Bouhlel Mohamed Salah 92
La syntaxe de la balise
Code = "test.class" (obligatoire) : nom de la classe principale
start()
stop()
destroy()
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 !
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.
getCodeBase() :
retourne l'URL (java.net.URL) de l'applet
getDocumentBase()
retourne l'URL du document o se trouve l'applet
Excution
Excution
2 formats principaux :
ZIP
JAR (Java ARchive) depuis le JDK 1.1 (le plus utilis)
<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 :
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
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.
MontreFrame(){
res.setHorizontalAlignment(JLabel.CENTER);
f.getContentPane().add(res);
f.setSize(100,200);
f.show();
this.start();
}
class MontreFrameInterne
{
JFrame f=new JFrame("Ma Montre");
JLabel res=new JLabel();
Thread t=new ThreadInterne();
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()
void interrupt()
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
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);
}
}
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)
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.
La diffrence :
la JVM fonctionne tant quil reste des threads utilisateurs
en excution
la JVM sarrte sil ne reste plus que des dmons