SlideShare ist ein Scribd-Unternehmen logo
1 von 32
Downloaden Sie, um offline zu lesen
graphiques avancés et animations le langage java
ProgrammationProgrammation
graphiquegraphique
avancée etavancée et
animationsanimations
II-1 JMF
graphiques avancés et animations le langage java
Les "expositions"
fenêtre A
fenêtre Cfenêtre D
fenêtre B
fenêtre E
Lorsque la fenêtre E passe en premier
plan, elle reçoît des Expose events afin
de redessiner les zones
II-2 JMF
graphiques avancés et animations le langage java
le Graphics
Lors de la réception d'un événement expose,
un objet Graphics est crée par le "moteur
Java". Cet objet contient et décrit tout ce
qu'il faut avoir pour pouvoir dessiner
("boites de crayons de couleurs", les divers
"pots de peinture", les valises de polices de
caractères, les règles, compas pour dessiner
des droites et cercles, ...) ainsi que la toile
de dessin sur laquelle on va dessiner. Cette
toile correspond à la partie qui était
masquée et qui doit être redessinée.
On peut parfois récupérer le Graphics
associé à un Component par la méthode
getGraphics() de la classe Component.
II-3 JMF
graphiques avancés et animations le langage java
Les méthodes graphiques
repaint(), update(Graphics g),
paint(Graphics g)
repaint() est une méthode (qu'il ne faut
jamais redéfinir) "système Java" gérée par
"la thread AWT" qui appelle, dès que cela
est possible, la méthode update(Graphics
g) qui appelle ensuite paint(Graphics g).
update(Graphics g) efface le composant (le
redessine avec sa couleur de fond), puis
appelle paint(Graphics g).
D'ailleurs update(Graphics g) de la classe
Component est :
public void update(Graphics g) {
g.setColor(getBackground());
g.fillRect(0, 0, width, height);
g.setColor(getForeground());
paint(g);
}
Le Graphics repéré par la référence g des
méthodes update() et paint() a été
construit par la thread AWT.
II-4 JMF
graphiques avancés et animations le langage java
Les méthodes graphiques
(suite)
repaint(), update(), paint()
Thread AWT
(en attente)
repaint()
update(Graphics g)
paint(Graphics g)
(efface l'aire puis
appelle paint())
exposition
Lors d'un événement d'exposition, paint()
est lancé sur la partie du composant
graphique qui doit être redessiné : zone de
clipping.
II-5 JMF
graphiques avancés et animations le langage java
Le moteur d'une
animation
On ne relance pas dans paint() un appel à
repaint() car cela aurait pour conséquence
de saturer la thread AWT. D'ailleurs le code
de paint() doit être un code qui est exécuté
rapidement.
La technique consiste alors à créer une
thread d'animation (donc distincte de "la
thread système AWT") qui elle, lancera les
repaint(). Par exemple pour une applet on
a un squelette de code comme :
public
class trameAnimApplet extends java.applet.Applet implements
Runnable {
int frame;
int delay;
Thread animator;
/**
* methode appelée lorsque l'applet devient visible à l'écran.
* Crée une thread et la lance.
*/
public void start() {
animator = new Thread(this);
animator.start();
}
II-6 JMF
graphiques avancés et animations le langage java
/**
* La methode moteur de l'animation.
*/
public void run() {
// Recupere l'heure de lancement de l'animation
// (nombre de mililisecondes depuis le 1er Janvier 1970).
long tm = System.currentTimeMillis();
while (Thread.currentThread() == animator) {
// affiche la prochaine "image" de l'animation.
repaint();
// Delai d'attente qui tient compte du temps de traitement
// pour l'affichage de la précédente image.
try {
tm += delay;
Thread.sleep(Math.max(0, tm -
System.currentTimeMillis()));
} catch (InterruptedException e) {
break;
}
// passe a l'image suivante.
frame++;
}
}
/**
* methode appelée lorsque l'applet n'est plus visible
* a l'écran. Elle arrête la thread d'animation
* (et donc les sons s'il y en a).
*/
public void stop() {
animator = null;
}
}
II-7 JMF
graphiques avancés et animations le langage java
Les Animations
On considère l'applet :
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Font;
public class ColorSwirl extends
java.applet.Applet implements Runnable {
Font f = new
Font("TimesRoman",Font.BOLD,48);
Color colors[] = new Color[50];
Thread runThread;
public void start() {
if (runThread == null) {
runThread = new Thread(this);
runThread.start();
}
}
public void stop() {
if (runThread != null) {
runThread.stop();
runThread = null;
}
}
II-8 JMF
graphiques avancés et animations le langage java
public void run() {
// initialise le tableau de couleurs
float c = 0;
for (int i = 0; i < colors.length; i++) {
colors[i] = Color.getHSBColor(c,
(float)1.0,(float)1.0);
c += .02;
}
// cycle through the colors
int i = 0;
while (true) {
setForeground(colors[i]);
repaint();
i++;
try { Thread.currentThread().sleep(50); }
catch (InterruptedException e) { }
if (i == (colors.length)) i = 0;
}
}
public void paint(Graphics g) {
g.setFont(f);
g.drawString("Diverses couleurs", 15, 50);
}
}
II-9 JMF
graphiques avancés et animations le langage java
Résultat du programme
remarques
- C'est un programme qui passe en revue les
gammes de couleurs de manière continue
- Une telle animation même si elle
fonctionne fait apparaître des
tremblements. Ceci est du à la gestion du
rafraîchissement en Java et plus
précisément à l'effacement dans la méthode
update().
II-10 JMF
graphiques avancés et animations le langage java
Les tremblements dans
les animations
Première solution : redéfinir
update()
on écrit dans update()le seul appel à
paint().
Dans le code ci dessus on ajoute simplement
:
public void update(Graphics g) {
paint(g);
}
et il n'y a plus de tremblements pour le
programme ci dessus. Il faut bien voir que
le nouveau paint() avec la nouvelle couleur
va dessiner par dessus l'ancien et que cela
résout notre problème dans ce cas car les
dessins sont opaques.
II-11 JMF
graphiques avancés et animations le langage java
Les tremblements dans
les animations (suite)
Seconde solution : le double-
buffering
On prépare tout le dessin à afficher à
l'extérieur de l'écran (dans un buffer
annexe). Lorsque ce second buffer est prêt,
on le fait afficher à l'écran. L'écran a ainsi
deux buffers (=> double buffering).
Pour cela on utilise :
1°) deux objets un de la classe Image,
l'autre de la classe Graphics, qu'on
initialise dans la méthode init(). Les deux
objets sont associés.
2°) les dessins se font dans l'instance
Graphics.
3°) quand tout est dessiné, on associe
l'image au contexte graphique de l'applet.
Le corps de update() doit être :
public void update(Graphics g) {
paint(g);
}
II-12 JMF
graphiques avancés et animations le langage java
Les tremblements dans
les animations (suite)
Seconde solution : le double-
buffering
Syntaxe
1°) les initialisations sont :
Image bufImg;
Graphics bufgc;
public void init() {
bufImg = createImage(this.size().width,
this.size().height);
bufgc = bufImg.getGraphics();
}
2°) et 3°) les dessins sont faits dans le
buffer Graphics qu'on finit par associer à
l'écran. Par exemple:
public void paint(Graphics g) {
bufgc.setColor(Color.Black);
bufgc.fillOval(20, 60, 100, 100);
...
// paint() doit obligatoirement se terminer par :
g.drawImage(bufImg, 0, 0, this);
}
II-13 JMF
graphiques avancés et animations le langage java
Double buffering,
exemple : Pierre Cubaud
II-14 JMF
graphiques avancés et animations le langage java
import java.awt.*;
import java.applet.Applet;
public class mandelb extends Applet
{
int haut=400;
int larg=400;
int incligne=1;
int inccolonne=1;
double x1= -2; //-0.67166;
double x2= 0.5; //-0.44953;
double y1= -1.25; //0.49216;
double y2= 1.25; //0.71429;
double limite= 50;
double incx= (x2-x1)/larg;
double incy= (y2-y1)/haut;
Image ofbuff;
Graphics ofg,ong;
boolean premiere_fois=true;
public mandelb()
{
resize(haut,larg);
repaint();
}
II-15 JMF
graphiques avancés et animations le langage java
public boolean action(Event e, Object o)
{
Graphics theg;
if (e.id==Event.MOUSE_UP)
{
if (!premiere_fois)
{
ong.drawLine(e.x,e.y,e.x,e.y);
}
return true;
}
else return false;
}
II-16 JMF
graphiques avancés et animations le langage java
public void paint(Graphics g)
{
int ligne,colonne,compt;
double p0,q0,module,x,y,aux;
if (premiere_fois)
{
ong=g;
ong.setColor(Color.black);
ofbuff=createImage(larg,haut);
ofg=ofbuff.getGraphics();
ofg.setColor(Color.black);
colonne=0;
while (colonne<=larg)
{
p0=x1+colonne*incx;
ligne=0;
while (ligne <= (haut/2))
{
q0=y1+ligne*incy;
x=0;y=0;compt=1;module=0;
while ((compt<=limite)&&(module<4.0))
{
aux=x;
x=x*x-y*y+p0;
y=2*y*aux+q0;
module=x*x+y*y;
compt++;
}
II-17 JMF
graphiques avancés et animations le langage java
if (module<4.0)
{
ofg.drawLine(colonne,ligne,colonne,ligne);
ofg.drawLine(colonne,haut-
ligne,colonne,haut-ligne);
}
// pour patienter pdt le calcul
g.drawLine(colonne,ligne,colonne,ligne);
ligne+=incligne;
}
colonne+=inccolonne;
}
premiere_fois=false;
}
g.drawImage(ofbuff,0,0,null);
}
public static void main(String[] args)
{
Applet m= new mandelb();
}
}
II-18 JMF
graphiques avancés et animations le langage java
Les tremblements dans
les animations (suite)
Optimisation : préciser dans
update() la zone de cliping
zone de cliping = zone sensible de dessin
(i.e. à l'extérieur rien n'est redessiné). On
écrit alors :
public void update(Graphics g) {
g.clipRect(x1, y1, x2, y2);
paint(g);
}
II-19 JMF
graphiques avancés et animations le langage java
Asynchronisme de
drawImage()
On considère l'applet Java :
import java.awt.Graphics;
import java.awt.Image;
public class LadyBug extends java.applet.Applet
{
Image bugimg;
public void init() {
bugimg = getImage(getCodeBase(),
"images/ladybug.gif");
}
public void paint(Graphics g) {
g.drawImage(bugimg,10,10,this);
System.out.println("dans paint()");
}
}
Au moment du getImage() l'image est
"repérée" mais pas chargée. Elle l'est
réellement lors du drawImage().
II-20 JMF
graphiques avancés et animations le langage java
Asynchronisme de
drawImage()(suite)
Le chargement de l'image par drawImage()
est effectué dans une thread et drawImage()
est une méthode asynchrone (i.e. non
bloquante).
Cette méthode rend la main à son appelant
ce qui explique qu'on ait besoin de le
passer (par this).
De plus elle appelle régulièrement cet
appelant i.e. cet observateur d'image, objet
d'une classe qui implémente l'interface
ImageObserver (ce qui est la cas pour la
classe Component) pour qu'il demande à être
redessiné par le lancement de update().
Ceci explique les nombreux passages dans
paint().
II-21 JMF
graphiques avancés et animations le langage java
Asynchronisme de
drawImage()(suite)
II-22 JMF
graphiques avancés et animations le langage java
Image dans une
application Java
Dans une applet, pour repérer une image, on
utilise la méthode getImage() de la classe
Applet. Pour une application Java, on ne
peut utiliser cette méthode. On utilise alors
la méthode getImage() de la classe Toolkit
(qui représente l'environnement
d'exécution de l'application Java) et on
écrit :
Toolkit tk = Toolkit.getDefaultToolkit();
Image im = tk.getImage(fichierImage)
II-23 JMF
graphiques avancés et animations le langage java
Image dans une
application Java (suite)
Par exemple la version application Java de
l'applet ci dessus est :
import java.awt.*;
public class LadyBug extends Frame {
Image bugimg;
public static void main(String args[ ]) {
Toolkit tk = Toolkit.getDefaultToolkit();
Frame fr = new LadyBug(tk, "Coccinelle");
fr.resize(200, 200);
fr.show();
}
public LadyBug (Toolkit tk, String st) {
super(st);
bugimg = tk.getImage("ladybug.gif");
}
public void paint(Graphics g) {
g.drawImage(bugimg,10,10,this);
}
}
II-24 JMF
graphiques avancés et animations le langage java
La classe MediaTracker
Elle permet de gérer l'asynchronisme de
drawImage(). Elle offre des méthodes
indiquant si un ensemble d'images a été
entièrement chargé.
import java.awt.*;
import java.applet.*;
public class testMediaTracker extends Applet {
private Image bugimg;
static final private int numero = 0;
private MediaTracker tracker;
public void init() {
tracker = new MediaTracker(this);
bugimg = getImage(getCodeBase(),
"images/ladybug.gif");
tracker.addImage(bugimg, numero);
try {
tracker.waitForAll();
} catch (InterruptedException e) {
System.out.println("Pb dans le MediaTracker");
}
}
public void paint(Graphics g) {
int resulMT;
resulMT = tracker.statusID(numero, false);
if ((resulMT & MediaTracker.COMPLETE) != 0)
{
g.drawImage(bugimg,10,10,this);
System.out.println("dans paint()");
}
}
}
II-25 JMF
graphiques avancés et animations le langage java
La classe MediaTracker
présentation
Cette classe permet de gérer des objets
multimédia bien que seuls les fichiers
images sont actuellement gérer.
Après avoir créer une instance de cette
classe par le seul constructeur
MediaTracker(Component) qui crée un
mediatracker pour ce composant, on ajoute
les images par
addImage(Image img, int numero)
Le numéro peut contrôler un ensemble
d'images et indique un ordre de chargement
ainsi qu'un identificateur pour cet
ensemble.
Le chargement est contrôlé par 4 variables
static :
ABORTED : le chargement a été abandonné.
COMPLETE : le chargement s'est bien
effectué.
ERRORED : erreur au cours du chargement
LOADING : chargement en cours.
II-26 JMF
graphiques avancés et animations le langage java
La classe MediaTracker
principales méthodes
addImage(Image img, int num)
ajoute l'image img avec le numéro num dans
l'instance.
Il existe 2 familles de méthodes pour cette
classe : les "check" et les "wait".
Les méthodes "wait" sont bloquantes alors
que les "check" ne le sont pas.
Les "wait" attendent que la thread de
chargement soit finie pour rendre la main :
cela ne signifie pas que le chargement des
images ait réellement été effectués (i.e.
délai de garde dans les "wait" par exemple).
Les "check" indiquent si les images ont
bien été chargées.
II-27 JMF
graphiques avancés et animations le langage java
La classe MediaTracker
la famille "wait"
Les méthodes "wait" sont sous contrôle
d'InterruptedException (donc non
masquables) levée lorsqu'une thread a
interrompue la thread courante.
public void waitForAll()
la thread de chargement de toutes les
images mises dans l'instance est lancé.
public synchronized boolean
waitForAll(long delai)
la thread de chargement de toutes les
images mises dans l'instance est lancée et
se terminera au plus tard après delai
millisecondes.
public void waitForID(int num)
la thread de chargement de l'ensemble des
images de numéro num est lancé.
public synchronized boolean
waitForID(int num, long delai)
la thread de chargement de l'ensemble des
images de numéro num est lancé et se
terminera au plus tard après delai
millisecondes.
II-28 JMF
graphiques avancés et animations le langage java
La classe MediaTracker
la famille "check"
public boolean checkAll()
vérifie si toutes les images mises dans
l'instance sont chargées.
public boolean checkAll(boolean
relance)
vérifie si toutes les images mises dans
l'instance sont chargées. Relance le
chargement si relance vaut true.
public boolean checkID(int num)
vérifie si l'ensemble des images repéré par
num mises dans l'instance sont chargées.
public boolean checkID(int num,
boolean relance)
vérifie si l'ensemble des images repéré par
num mises dans l'instance sont chargées.
Relance le chargement si relance vaut true.
II-29 JMF
graphiques avancés et animations le langage java
La classe MediaTracker
le contrôle des erreurs
Il existe des méthodes de contrôle des
erreurs de chargement (elles sont toutes
synchronized)
public synchronized Object[]
getErrorsAny()
retourne une liste de médias qui ont posé
problème lors du chargement dans
l'instance (ou null sinon)
public synchronized Object[]
getErrorsID(int id)
retourne une liste de médias de numéro id
qui ont posé problème lors du chargement
dans l'instance (ou null sinon)
public synchronized boolean
isErrorAny()
renvoie true si une des images à provoquer
une erreur lors du chargement dans
l'instance.
public synchronized boolean
isErrorID(int id)
renvoie true si une des images repérée par
id à provoquer une erreur lors du
chargement dans l'instance.
II-30 JMF
graphiques avancés et animations le langage java
La classe MediaTracker
le contrôle des erreurs
(fin)
public int statusAll(boolean load)
retourne un masque OR (à comparer avec
MediaTracker.COMPLETE, ...) indiquant
comment s'est passé le chargement. Si load
vaut true, la chargement des images non
déjà chargées est relancé.
public int statusID(int id, boolean
load)
retourne un masque OR (à comparer avec
MediaTracker.COMPLETE, ...) indiquant
comment s'est passé le chargement des
images numérotées id. Relance le
chargement si load vaut true.
II-31 JMF
graphiques avancés et animations le langage java
Bibliographie
http://www.javaworld.com/javaworld/jw-
03-1996/jw-03-animation.html
http://java.sun.com:81/applets/Fractal
/1.0.2/example1.html
Teach yourself Java in 21 days : Laura
Lemay, Charles L.Perkins ; ed Sams.net
traduit en français ed S&SM "Le
programmeur Java"
II-32 JMF

Weitere ähnliche Inhalte

Was ist angesagt?

C++ Metaprogramming : multidimensional typelist
C++ Metaprogramming : multidimensional typelistC++ Metaprogramming : multidimensional typelist
C++ Metaprogramming : multidimensional typelistVincent Agnus
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11Microsoft
 
Chapitre4 cours de java
Chapitre4 cours de javaChapitre4 cours de java
Chapitre4 cours de javainfo1994
 
Corrigés exercices langage C
Corrigés exercices langage CCorrigés exercices langage C
Corrigés exercices langage Ccoursuniv
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objetsAziz Darouichi
 
Exercices en langage c
Exercices en langage cExercices en langage c
Exercices en langage cDaoua Lotfi
 
Langage C
Langage  CLangage  C
Langage Cjwilili
 
INF120 - Algo DUT SRC1 - Cours 3
INF120 - Algo DUT SRC1 - Cours 3INF120 - Algo DUT SRC1 - Cours 3
INF120 - Algo DUT SRC1 - Cours 3PGambette
 
TP1 Traitement d'images Génie Logiciel avec Matlab
TP1 Traitement d'images Génie Logiciel avec MatlabTP1 Traitement d'images Génie Logiciel avec Matlab
TP1 Traitement d'images Génie Logiciel avec MatlabMariem ZAOUALI
 
Cours langage c
Cours langage cCours langage c
Cours langage ccoursuniv
 
programmation orienté objet c++
programmation orienté objet c++programmation orienté objet c++
programmation orienté objet c++coursuniv
 
Trivial Java Second
Trivial Java SecondTrivial Java Second
Trivial Java SecondKatia Aresti
 
Cours 1 bases de matlab 2eme annees
Cours 1   bases de matlab 2eme anneesCours 1   bases de matlab 2eme annees
Cours 1 bases de matlab 2eme anneesTarik Taleb Bendiab
 
Slides ceplex
Slides ceplexSlides ceplex
Slides ceplexTECOS
 
System c eniso_jan_fev_07
System c eniso_jan_fev_07System c eniso_jan_fev_07
System c eniso_jan_fev_07haythem_2015
 

Was ist angesagt? (20)

Simplex rapport final1
Simplex rapport final1Simplex rapport final1
Simplex rapport final1
 
C++ Metaprogramming : multidimensional typelist
C++ Metaprogramming : multidimensional typelistC++ Metaprogramming : multidimensional typelist
C++ Metaprogramming : multidimensional typelist
 
Trivial Java - Part 2
Trivial Java - Part 2Trivial Java - Part 2
Trivial Java - Part 2
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11
 
Chapitre4 cours de java
Chapitre4 cours de javaChapitre4 cours de java
Chapitre4 cours de java
 
Tp 1 introduction à matlab
Tp 1 introduction à matlabTp 1 introduction à matlab
Tp 1 introduction à matlab
 
Corrigés exercices langage C
Corrigés exercices langage CCorrigés exercices langage C
Corrigés exercices langage C
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objets
 
Exercices en langage c
Exercices en langage cExercices en langage c
Exercices en langage c
 
Langage C
Langage  CLangage  C
Langage C
 
langage C++
langage C++langage C++
langage C++
 
INF120 - Algo DUT SRC1 - Cours 3
INF120 - Algo DUT SRC1 - Cours 3INF120 - Algo DUT SRC1 - Cours 3
INF120 - Algo DUT SRC1 - Cours 3
 
TP1 Traitement d'images Génie Logiciel avec Matlab
TP1 Traitement d'images Génie Logiciel avec MatlabTP1 Traitement d'images Génie Logiciel avec Matlab
TP1 Traitement d'images Génie Logiciel avec Matlab
 
Cours langage c
Cours langage cCours langage c
Cours langage c
 
programmation orienté objet c++
programmation orienté objet c++programmation orienté objet c++
programmation orienté objet c++
 
Trivial Java Second
Trivial Java SecondTrivial Java Second
Trivial Java Second
 
Langage c
Langage cLangage c
Langage c
 
Cours 1 bases de matlab 2eme annees
Cours 1   bases de matlab 2eme anneesCours 1   bases de matlab 2eme annees
Cours 1 bases de matlab 2eme annees
 
Slides ceplex
Slides ceplexSlides ceplex
Slides ceplex
 
System c eniso_jan_fev_07
System c eniso_jan_fev_07System c eniso_jan_fev_07
System c eniso_jan_fev_07
 

Andere mochten auch

Tecnologí..
Tecnologí..Tecnologí..
Tecnologí..erikasoto
 
La importancia de las tics
La importancia de las ticsLa importancia de las tics
La importancia de las ticsglendatorrez
 
Dispositivo de atención nocturna a transeúntes
Dispositivo de atención nocturna a transeúntesDispositivo de atención nocturna a transeúntes
Dispositivo de atención nocturna a transeúntesntgrupoc12345
 
Crisis.EspañOla.Metaforas
Crisis.EspañOla.MetaforasCrisis.EspañOla.Metaforas
Crisis.EspañOla.Metaforasisidremch
 
Responsabilite et-obligation resume
    Responsabilite et-obligation resume    Responsabilite et-obligation resume
Responsabilite et-obligation resumeRabah HELAL
 
Dossier sur le_conteneur
Dossier sur le_conteneurDossier sur le_conteneur
Dossier sur le_conteneurRabah HELAL
 
Guide médiation arbitrale
  Guide médiation arbitrale  Guide médiation arbitrale
Guide médiation arbitraleRabah HELAL
 
Les fichiers d’autorite et leur fonction dans les bases de données
Les fichiers d’autorite et leur fonction dans les bases de donnéesLes fichiers d’autorite et leur fonction dans les bases de données
Les fichiers d’autorite et leur fonction dans les bases de donnéesEquipex Biblissima
 
Iles de paix et ndc
Iles de paix et ndcIles de paix et ndc
Iles de paix et ndcendcorg
 
Chapitre 2 cours 3eme
Chapitre 2 cours 3emeChapitre 2 cours 3eme
Chapitre 2 cours 3emeHanfi Akram
 
Alia Concept : Communication, Marketing et Evènementiel
Alia Concept : Communication, Marketing et EvènementielAlia Concept : Communication, Marketing et Evènementiel
Alia Concept : Communication, Marketing et EvènementielAliaConcept
 
Code ism decret
Code ism   decret Code ism   decret
Code ism decret Rabah HELAL
 

Andere mochten auch (20)

Tecnologí..
Tecnologí..Tecnologí..
Tecnologí..
 
La importancia de las tics
La importancia de las ticsLa importancia de las tics
La importancia de las tics
 
Garcia mendoza
Garcia mendozaGarcia mendoza
Garcia mendoza
 
07
0707
07
 
Dispositivo de atención nocturna a transeúntes
Dispositivo de atención nocturna a transeúntesDispositivo de atención nocturna a transeúntes
Dispositivo de atención nocturna a transeúntes
 
Tarea2 2-curso e-lerning
Tarea2 2-curso e-lerningTarea2 2-curso e-lerning
Tarea2 2-curso e-lerning
 
Crisis.EspañOla.Metaforas
Crisis.EspañOla.MetaforasCrisis.EspañOla.Metaforas
Crisis.EspañOla.Metaforas
 
Ablacion2
Ablacion2Ablacion2
Ablacion2
 
Responsabilite et-obligation resume
    Responsabilite et-obligation resume    Responsabilite et-obligation resume
Responsabilite et-obligation resume
 
Dossier sur le_conteneur
Dossier sur le_conteneurDossier sur le_conteneur
Dossier sur le_conteneur
 
Guide médiation arbitrale
  Guide médiation arbitrale  Guide médiation arbitrale
Guide médiation arbitrale
 
Les fichiers d’autorite et leur fonction dans les bases de données
Les fichiers d’autorite et leur fonction dans les bases de donnéesLes fichiers d’autorite et leur fonction dans les bases de données
Les fichiers d’autorite et leur fonction dans les bases de données
 
Iles de paix et ndc
Iles de paix et ndcIles de paix et ndc
Iles de paix et ndc
 
Chapitre 2 cours 3eme
Chapitre 2 cours 3emeChapitre 2 cours 3eme
Chapitre 2 cours 3eme
 
2011 04-13 misioneroadultos
2011 04-13 misioneroadultos2011 04-13 misioneroadultos
2011 04-13 misioneroadultos
 
Calendrier 2015
Calendrier 2015Calendrier 2015
Calendrier 2015
 
Document
DocumentDocument
Document
 
Alia Concept : Communication, Marketing et Evènementiel
Alia Concept : Communication, Marketing et EvènementielAlia Concept : Communication, Marketing et Evènementiel
Alia Concept : Communication, Marketing et Evènementiel
 
Biblissima semwebpro2015
Biblissima semwebpro2015Biblissima semwebpro2015
Biblissima semwebpro2015
 
Code ism decret
Code ism   decret Code ism   decret
Code ism decret
 

Ähnlich wie Programmation graphique avancée en java

Tutorial java swing
Tutorial java swingTutorial java swing
Tutorial java swingNataraj Dg
 
Support tutoriel : Créer votre jeu en HTML5
Support tutoriel : Créer votre jeu en HTML5Support tutoriel : Créer votre jeu en HTML5
Support tutoriel : Créer votre jeu en HTML5SmartnSkilled
 
Environnement de développement de bases de données
Environnement de développement de bases de donnéesEnvironnement de développement de bases de données
Environnement de développement de bases de donnéesISIG
 
Monogame Introduction (FR)
Monogame Introduction (FR)Monogame Introduction (FR)
Monogame Introduction (FR)Aloïs Deniel
 
SORTING SYSTEM (ITS PLC MHJ EDITION) PROGRAMMING
SORTING SYSTEM (ITS PLC MHJ EDITION) PROGRAMMING SORTING SYSTEM (ITS PLC MHJ EDITION) PROGRAMMING
SORTING SYSTEM (ITS PLC MHJ EDITION) PROGRAMMING HASSOU mohamed
 
Développement avec Java Micro Edition
Développement avec Java Micro EditionDéveloppement avec Java Micro Edition
Développement avec Java Micro EditionSylvain Wallez
 
Correction examen-java-avancé-1
Correction examen-java-avancé-1Correction examen-java-avancé-1
Correction examen-java-avancé-1vangogue
 
cours-gratuit.com--CoursMatlab-id4508 (1).pdf
cours-gratuit.com--CoursMatlab-id4508 (1).pdfcours-gratuit.com--CoursMatlab-id4508 (1).pdf
cours-gratuit.com--CoursMatlab-id4508 (1).pdfNarjiss Hach
 
Traitement d'image sous Matlab
Traitement d'image sous Matlab  Traitement d'image sous Matlab
Traitement d'image sous Matlab Hajer Dahech
 
Tp circuits electriques( avec logiciel "CADENCE PSD")
Tp circuits electriques( avec logiciel "CADENCE PSD") Tp circuits electriques( avec logiciel "CADENCE PSD")
Tp circuits electriques( avec logiciel "CADENCE PSD") YassineLamgammah
 
Exemple d'utilisation de la génération GWT
Exemple d'utilisation de la génération GWTExemple d'utilisation de la génération GWT
Exemple d'utilisation de la génération GWTFrédéric Menou
 
Les nouveautés d'Android 7.1 (Nougat)
Les nouveautés d'Android 7.1 (Nougat)Les nouveautés d'Android 7.1 (Nougat)
Les nouveautés d'Android 7.1 (Nougat)Edouard Marquez
 
Introduction à MATLAB et Simulink.pdf
Introduction à MATLAB et Simulink.pdfIntroduction à MATLAB et Simulink.pdf
Introduction à MATLAB et Simulink.pdfTarakBenslimane
 
Introduction à MATLAB et Simulink.pdf
Introduction à MATLAB et Simulink.pdfIntroduction à MATLAB et Simulink.pdf
Introduction à MATLAB et Simulink.pdfTarakBenslimane
 
utilisation de MATLAB dans l'asservissement.pdf
utilisation de MATLAB dans l'asservissement.pdfutilisation de MATLAB dans l'asservissement.pdf
utilisation de MATLAB dans l'asservissement.pdfAnesKebbab
 

Ähnlich wie Programmation graphique avancée en java (20)

Tutorial java swing
Tutorial java swingTutorial java swing
Tutorial java swing
 
Support tutoriel : Créer votre jeu en HTML5
Support tutoriel : Créer votre jeu en HTML5Support tutoriel : Créer votre jeu en HTML5
Support tutoriel : Créer votre jeu en HTML5
 
JavaSwing.pdf
JavaSwing.pdfJavaSwing.pdf
JavaSwing.pdf
 
Environnement de développement de bases de données
Environnement de développement de bases de donnéesEnvironnement de développement de bases de données
Environnement de développement de bases de données
 
Monogame Introduction (FR)
Monogame Introduction (FR)Monogame Introduction (FR)
Monogame Introduction (FR)
 
SORTING SYSTEM (ITS PLC MHJ EDITION) PROGRAMMING
SORTING SYSTEM (ITS PLC MHJ EDITION) PROGRAMMING SORTING SYSTEM (ITS PLC MHJ EDITION) PROGRAMMING
SORTING SYSTEM (ITS PLC MHJ EDITION) PROGRAMMING
 
Développement avec Java Micro Edition
Développement avec Java Micro EditionDéveloppement avec Java Micro Edition
Développement avec Java Micro Edition
 
Java Graphisme
Java GraphismeJava Graphisme
Java Graphisme
 
Correction examen-java-avancé-1
Correction examen-java-avancé-1Correction examen-java-avancé-1
Correction examen-java-avancé-1
 
cours-gratuit.com--CoursMatlab-id4508 (1).pdf
cours-gratuit.com--CoursMatlab-id4508 (1).pdfcours-gratuit.com--CoursMatlab-id4508 (1).pdf
cours-gratuit.com--CoursMatlab-id4508 (1).pdf
 
Traitement d'image sous Matlab
Traitement d'image sous Matlab  Traitement d'image sous Matlab
Traitement d'image sous Matlab
 
Tp circuits electriques( avec logiciel "CADENCE PSD")
Tp circuits electriques( avec logiciel "CADENCE PSD") Tp circuits electriques( avec logiciel "CADENCE PSD")
Tp circuits electriques( avec logiciel "CADENCE PSD")
 
Exemple d'utilisation de la génération GWT
Exemple d'utilisation de la génération GWTExemple d'utilisation de la génération GWT
Exemple d'utilisation de la génération GWT
 
Dijkstra kshortest
Dijkstra kshortestDijkstra kshortest
Dijkstra kshortest
 
Les nouveautés d'Android 7.1 (Nougat)
Les nouveautés d'Android 7.1 (Nougat)Les nouveautés d'Android 7.1 (Nougat)
Les nouveautés d'Android 7.1 (Nougat)
 
TRI Automatique.pdf
TRI Automatique.pdfTRI Automatique.pdf
TRI Automatique.pdf
 
Support POO Java Deuxième Partie
Support POO Java Deuxième PartieSupport POO Java Deuxième Partie
Support POO Java Deuxième Partie
 
Introduction à MATLAB et Simulink.pdf
Introduction à MATLAB et Simulink.pdfIntroduction à MATLAB et Simulink.pdf
Introduction à MATLAB et Simulink.pdf
 
Introduction à MATLAB et Simulink.pdf
Introduction à MATLAB et Simulink.pdfIntroduction à MATLAB et Simulink.pdf
Introduction à MATLAB et Simulink.pdf
 
utilisation de MATLAB dans l'asservissement.pdf
utilisation de MATLAB dans l'asservissement.pdfutilisation de MATLAB dans l'asservissement.pdf
utilisation de MATLAB dans l'asservissement.pdf
 

Kürzlich hochgeladen

BOW 2024 - Le bâtiment multicritère porcin
BOW 2024 - Le bâtiment multicritère porcinBOW 2024 - Le bâtiment multicritère porcin
BOW 2024 - Le bâtiment multicritère porcinidelewebmestre
 
Cours polymère presentation powerpoint 46 pages
Cours polymère presentation powerpoint 46 pagesCours polymère presentation powerpoint 46 pages
Cours polymère presentation powerpoint 46 pagesPierreFournier32
 
BOW 2024 - 3-6 - Adaptation climat chaud Porcs
BOW 2024 - 3-6 - Adaptation climat chaud PorcsBOW 2024 - 3-6 - Adaptation climat chaud Porcs
BOW 2024 - 3-6 - Adaptation climat chaud Porcsidelewebmestre
 
Accompagnement de l'agrivoltaisme - Focus sur l'étude système en Merthe et Mo...
Accompagnement de l'agrivoltaisme - Focus sur l'étude système en Merthe et Mo...Accompagnement de l'agrivoltaisme - Focus sur l'étude système en Merthe et Mo...
Accompagnement de l'agrivoltaisme - Focus sur l'étude système en Merthe et Mo...idelewebmestre
 
Actions du vent sur les bâtiments selon lEurocode 1 – Partie 1-4.pdf
Actions du vent sur les bâtiments selon lEurocode 1 – Partie 1-4.pdfActions du vent sur les bâtiments selon lEurocode 1 – Partie 1-4.pdf
Actions du vent sur les bâtiments selon lEurocode 1 – Partie 1-4.pdfalainfahed961
 
Bow 2024 - Plein air à l'intérieur des bâtiments d'élevage de ruminants
Bow 2024 - Plein air à l'intérieur des bâtiments d'élevage de ruminantsBow 2024 - Plein air à l'intérieur des bâtiments d'élevage de ruminants
Bow 2024 - Plein air à l'intérieur des bâtiments d'élevage de ruminantsidelewebmestre
 
SciencesPo_Aix_InnovationPédagogique_Atelier_APC.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_APC.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_APC.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_APC.pdfSKennel
 
BOW 2024 - 3 1 - Les infrastructures équestres et le changement climatique
BOW 2024 - 3 1 - Les infrastructures équestres et le changement climatiqueBOW 2024 - 3 1 - Les infrastructures équestres et le changement climatique
BOW 2024 - 3 1 - Les infrastructures équestres et le changement climatiqueidelewebmestre
 
BOW 2024 - L'écurie ouverte : un concept inspirant pour la filière équine
BOW 2024 - L'écurie ouverte : un concept inspirant pour la filière équineBOW 2024 - L'écurie ouverte : un concept inspirant pour la filière équine
BOW 2024 - L'écurie ouverte : un concept inspirant pour la filière équineidelewebmestre
 
BOW 2024 - Logement des veaux laitiers en plein air
BOW 2024 - Logement des veaux laitiers en plein airBOW 2024 - Logement des veaux laitiers en plein air
BOW 2024 - Logement des veaux laitiers en plein airidelewebmestre
 
BOW 2024 - 3-5 - Des solutions numériques pour se préparer aux pics de chaleur
BOW 2024 - 3-5 - Des solutions numériques pour se préparer aux pics de chaleurBOW 2024 - 3-5 - Des solutions numériques pour se préparer aux pics de chaleur
BOW 2024 - 3-5 - Des solutions numériques pour se préparer aux pics de chaleuridelewebmestre
 
BOW 2024-3-10 - Batcool Petits ruminants
BOW 2024-3-10 - Batcool Petits ruminantsBOW 2024-3-10 - Batcool Petits ruminants
BOW 2024-3-10 - Batcool Petits ruminantsidelewebmestre
 
Cadre réglementaire et développement de l'agrivoltaïsme en France
Cadre réglementaire et développement de l'agrivoltaïsme en FranceCadre réglementaire et développement de l'agrivoltaïsme en France
Cadre réglementaire et développement de l'agrivoltaïsme en Franceidelewebmestre
 
Agrivoltaïsme et filière ovine en Dordogne
Agrivoltaïsme et filière ovine en DordogneAgrivoltaïsme et filière ovine en Dordogne
Agrivoltaïsme et filière ovine en Dordogneidelewebmestre
 
BOW 2024 - Nouveaux modes de logement pour des veaux de boucherie avec accès ...
BOW 2024 - Nouveaux modes de logement pour des veaux de boucherie avec accès ...BOW 2024 - Nouveaux modes de logement pour des veaux de boucherie avec accès ...
BOW 2024 - Nouveaux modes de logement pour des veaux de boucherie avec accès ...idelewebmestre
 
Chapitre 2 : fondations et analyses de données géotechniques
Chapitre 2 : fondations et analyses de données géotechniquesChapitre 2 : fondations et analyses de données géotechniques
Chapitre 2 : fondations et analyses de données géotechniquesangevaleryn
 
BOW 24 - De la réflexion de groupe à l'immersion dans des bâtiments porcins
BOW 24 - De la réflexion de groupe à l'immersion dans des bâtiments porcinsBOW 24 - De la réflexion de groupe à l'immersion dans des bâtiments porcins
BOW 24 - De la réflexion de groupe à l'immersion dans des bâtiments porcinsidelewebmestre
 
Accompagnement de l'agrivoltaïsme dans le département de la Nièvre
Accompagnement de l'agrivoltaïsme dans le département de la NièvreAccompagnement de l'agrivoltaïsme dans le département de la Nièvre
Accompagnement de l'agrivoltaïsme dans le département de la Nièvreidelewebmestre
 
BOW 2024 - 3-8 - Adaptation des bâtiments d'élevages de volailles au changeme...
BOW 2024 - 3-8 - Adaptation des bâtiments d'élevages de volailles au changeme...BOW 2024 - 3-8 - Adaptation des bâtiments d'élevages de volailles au changeme...
BOW 2024 - 3-8 - Adaptation des bâtiments d'élevages de volailles au changeme...idelewebmestre
 

Kürzlich hochgeladen (20)

BOW 2024 - Le bâtiment multicritère porcin
BOW 2024 - Le bâtiment multicritère porcinBOW 2024 - Le bâtiment multicritère porcin
BOW 2024 - Le bâtiment multicritère porcin
 
Cours polymère presentation powerpoint 46 pages
Cours polymère presentation powerpoint 46 pagesCours polymère presentation powerpoint 46 pages
Cours polymère presentation powerpoint 46 pages
 
BOW 2024 - 3-6 - Adaptation climat chaud Porcs
BOW 2024 - 3-6 - Adaptation climat chaud PorcsBOW 2024 - 3-6 - Adaptation climat chaud Porcs
BOW 2024 - 3-6 - Adaptation climat chaud Porcs
 
Accompagnement de l'agrivoltaisme - Focus sur l'étude système en Merthe et Mo...
Accompagnement de l'agrivoltaisme - Focus sur l'étude système en Merthe et Mo...Accompagnement de l'agrivoltaisme - Focus sur l'étude système en Merthe et Mo...
Accompagnement de l'agrivoltaisme - Focus sur l'étude système en Merthe et Mo...
 
Actions du vent sur les bâtiments selon lEurocode 1 – Partie 1-4.pdf
Actions du vent sur les bâtiments selon lEurocode 1 – Partie 1-4.pdfActions du vent sur les bâtiments selon lEurocode 1 – Partie 1-4.pdf
Actions du vent sur les bâtiments selon lEurocode 1 – Partie 1-4.pdf
 
Bow 2024 - Plein air à l'intérieur des bâtiments d'élevage de ruminants
Bow 2024 - Plein air à l'intérieur des bâtiments d'élevage de ruminantsBow 2024 - Plein air à l'intérieur des bâtiments d'élevage de ruminants
Bow 2024 - Plein air à l'intérieur des bâtiments d'élevage de ruminants
 
SciencesPo_Aix_InnovationPédagogique_Atelier_APC.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_APC.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_APC.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_APC.pdf
 
BOW 2024 - 3 1 - Les infrastructures équestres et le changement climatique
BOW 2024 - 3 1 - Les infrastructures équestres et le changement climatiqueBOW 2024 - 3 1 - Les infrastructures équestres et le changement climatique
BOW 2024 - 3 1 - Les infrastructures équestres et le changement climatique
 
BOW 2024 - L'écurie ouverte : un concept inspirant pour la filière équine
BOW 2024 - L'écurie ouverte : un concept inspirant pour la filière équineBOW 2024 - L'écurie ouverte : un concept inspirant pour la filière équine
BOW 2024 - L'écurie ouverte : un concept inspirant pour la filière équine
 
BOW 2024 - Logement des veaux laitiers en plein air
BOW 2024 - Logement des veaux laitiers en plein airBOW 2024 - Logement des veaux laitiers en plein air
BOW 2024 - Logement des veaux laitiers en plein air
 
BOW 2024 - 3-5 - Des solutions numériques pour se préparer aux pics de chaleur
BOW 2024 - 3-5 - Des solutions numériques pour se préparer aux pics de chaleurBOW 2024 - 3-5 - Des solutions numériques pour se préparer aux pics de chaleur
BOW 2024 - 3-5 - Des solutions numériques pour se préparer aux pics de chaleur
 
Note agro-climatique n°2 - 17 Avril 2024
Note agro-climatique n°2 - 17 Avril 2024Note agro-climatique n°2 - 17 Avril 2024
Note agro-climatique n°2 - 17 Avril 2024
 
BOW 2024-3-10 - Batcool Petits ruminants
BOW 2024-3-10 - Batcool Petits ruminantsBOW 2024-3-10 - Batcool Petits ruminants
BOW 2024-3-10 - Batcool Petits ruminants
 
Cadre réglementaire et développement de l'agrivoltaïsme en France
Cadre réglementaire et développement de l'agrivoltaïsme en FranceCadre réglementaire et développement de l'agrivoltaïsme en France
Cadre réglementaire et développement de l'agrivoltaïsme en France
 
Agrivoltaïsme et filière ovine en Dordogne
Agrivoltaïsme et filière ovine en DordogneAgrivoltaïsme et filière ovine en Dordogne
Agrivoltaïsme et filière ovine en Dordogne
 
BOW 2024 - Nouveaux modes de logement pour des veaux de boucherie avec accès ...
BOW 2024 - Nouveaux modes de logement pour des veaux de boucherie avec accès ...BOW 2024 - Nouveaux modes de logement pour des veaux de boucherie avec accès ...
BOW 2024 - Nouveaux modes de logement pour des veaux de boucherie avec accès ...
 
Chapitre 2 : fondations et analyses de données géotechniques
Chapitre 2 : fondations et analyses de données géotechniquesChapitre 2 : fondations et analyses de données géotechniques
Chapitre 2 : fondations et analyses de données géotechniques
 
BOW 24 - De la réflexion de groupe à l'immersion dans des bâtiments porcins
BOW 24 - De la réflexion de groupe à l'immersion dans des bâtiments porcinsBOW 24 - De la réflexion de groupe à l'immersion dans des bâtiments porcins
BOW 24 - De la réflexion de groupe à l'immersion dans des bâtiments porcins
 
Accompagnement de l'agrivoltaïsme dans le département de la Nièvre
Accompagnement de l'agrivoltaïsme dans le département de la NièvreAccompagnement de l'agrivoltaïsme dans le département de la Nièvre
Accompagnement de l'agrivoltaïsme dans le département de la Nièvre
 
BOW 2024 - 3-8 - Adaptation des bâtiments d'élevages de volailles au changeme...
BOW 2024 - 3-8 - Adaptation des bâtiments d'élevages de volailles au changeme...BOW 2024 - 3-8 - Adaptation des bâtiments d'élevages de volailles au changeme...
BOW 2024 - 3-8 - Adaptation des bâtiments d'élevages de volailles au changeme...
 

Programmation graphique avancée en java

  • 1. graphiques avancés et animations le langage java ProgrammationProgrammation graphiquegraphique avancée etavancée et animationsanimations II-1 JMF
  • 2. graphiques avancés et animations le langage java Les "expositions" fenêtre A fenêtre Cfenêtre D fenêtre B fenêtre E Lorsque la fenêtre E passe en premier plan, elle reçoît des Expose events afin de redessiner les zones II-2 JMF
  • 3. graphiques avancés et animations le langage java le Graphics Lors de la réception d'un événement expose, un objet Graphics est crée par le "moteur Java". Cet objet contient et décrit tout ce qu'il faut avoir pour pouvoir dessiner ("boites de crayons de couleurs", les divers "pots de peinture", les valises de polices de caractères, les règles, compas pour dessiner des droites et cercles, ...) ainsi que la toile de dessin sur laquelle on va dessiner. Cette toile correspond à la partie qui était masquée et qui doit être redessinée. On peut parfois récupérer le Graphics associé à un Component par la méthode getGraphics() de la classe Component. II-3 JMF
  • 4. graphiques avancés et animations le langage java Les méthodes graphiques repaint(), update(Graphics g), paint(Graphics g) repaint() est une méthode (qu'il ne faut jamais redéfinir) "système Java" gérée par "la thread AWT" qui appelle, dès que cela est possible, la méthode update(Graphics g) qui appelle ensuite paint(Graphics g). update(Graphics g) efface le composant (le redessine avec sa couleur de fond), puis appelle paint(Graphics g). D'ailleurs update(Graphics g) de la classe Component est : public void update(Graphics g) { g.setColor(getBackground()); g.fillRect(0, 0, width, height); g.setColor(getForeground()); paint(g); } Le Graphics repéré par la référence g des méthodes update() et paint() a été construit par la thread AWT. II-4 JMF
  • 5. graphiques avancés et animations le langage java Les méthodes graphiques (suite) repaint(), update(), paint() Thread AWT (en attente) repaint() update(Graphics g) paint(Graphics g) (efface l'aire puis appelle paint()) exposition Lors d'un événement d'exposition, paint() est lancé sur la partie du composant graphique qui doit être redessiné : zone de clipping. II-5 JMF
  • 6. graphiques avancés et animations le langage java Le moteur d'une animation On ne relance pas dans paint() un appel à repaint() car cela aurait pour conséquence de saturer la thread AWT. D'ailleurs le code de paint() doit être un code qui est exécuté rapidement. La technique consiste alors à créer une thread d'animation (donc distincte de "la thread système AWT") qui elle, lancera les repaint(). Par exemple pour une applet on a un squelette de code comme : public class trameAnimApplet extends java.applet.Applet implements Runnable { int frame; int delay; Thread animator; /** * methode appelée lorsque l'applet devient visible à l'écran. * Crée une thread et la lance. */ public void start() { animator = new Thread(this); animator.start(); } II-6 JMF
  • 7. graphiques avancés et animations le langage java /** * La methode moteur de l'animation. */ public void run() { // Recupere l'heure de lancement de l'animation // (nombre de mililisecondes depuis le 1er Janvier 1970). long tm = System.currentTimeMillis(); while (Thread.currentThread() == animator) { // affiche la prochaine "image" de l'animation. repaint(); // Delai d'attente qui tient compte du temps de traitement // pour l'affichage de la précédente image. try { tm += delay; Thread.sleep(Math.max(0, tm - System.currentTimeMillis())); } catch (InterruptedException e) { break; } // passe a l'image suivante. frame++; } } /** * methode appelée lorsque l'applet n'est plus visible * a l'écran. Elle arrête la thread d'animation * (et donc les sons s'il y en a). */ public void stop() { animator = null; } } II-7 JMF
  • 8. graphiques avancés et animations le langage java Les Animations On considère l'applet : import java.awt.Graphics; import java.awt.Color; import java.awt.Font; public class ColorSwirl extends java.applet.Applet implements Runnable { Font f = new Font("TimesRoman",Font.BOLD,48); Color colors[] = new Color[50]; Thread runThread; public void start() { if (runThread == null) { runThread = new Thread(this); runThread.start(); } } public void stop() { if (runThread != null) { runThread.stop(); runThread = null; } } II-8 JMF
  • 9. graphiques avancés et animations le langage java public void run() { // initialise le tableau de couleurs float c = 0; for (int i = 0; i < colors.length; i++) { colors[i] = Color.getHSBColor(c, (float)1.0,(float)1.0); c += .02; } // cycle through the colors int i = 0; while (true) { setForeground(colors[i]); repaint(); i++; try { Thread.currentThread().sleep(50); } catch (InterruptedException e) { } if (i == (colors.length)) i = 0; } } public void paint(Graphics g) { g.setFont(f); g.drawString("Diverses couleurs", 15, 50); } } II-9 JMF
  • 10. graphiques avancés et animations le langage java Résultat du programme remarques - C'est un programme qui passe en revue les gammes de couleurs de manière continue - Une telle animation même si elle fonctionne fait apparaître des tremblements. Ceci est du à la gestion du rafraîchissement en Java et plus précisément à l'effacement dans la méthode update(). II-10 JMF
  • 11. graphiques avancés et animations le langage java Les tremblements dans les animations Première solution : redéfinir update() on écrit dans update()le seul appel à paint(). Dans le code ci dessus on ajoute simplement : public void update(Graphics g) { paint(g); } et il n'y a plus de tremblements pour le programme ci dessus. Il faut bien voir que le nouveau paint() avec la nouvelle couleur va dessiner par dessus l'ancien et que cela résout notre problème dans ce cas car les dessins sont opaques. II-11 JMF
  • 12. graphiques avancés et animations le langage java Les tremblements dans les animations (suite) Seconde solution : le double- buffering On prépare tout le dessin à afficher à l'extérieur de l'écran (dans un buffer annexe). Lorsque ce second buffer est prêt, on le fait afficher à l'écran. L'écran a ainsi deux buffers (=> double buffering). Pour cela on utilise : 1°) deux objets un de la classe Image, l'autre de la classe Graphics, qu'on initialise dans la méthode init(). Les deux objets sont associés. 2°) les dessins se font dans l'instance Graphics. 3°) quand tout est dessiné, on associe l'image au contexte graphique de l'applet. Le corps de update() doit être : public void update(Graphics g) { paint(g); } II-12 JMF
  • 13. graphiques avancés et animations le langage java Les tremblements dans les animations (suite) Seconde solution : le double- buffering Syntaxe 1°) les initialisations sont : Image bufImg; Graphics bufgc; public void init() { bufImg = createImage(this.size().width, this.size().height); bufgc = bufImg.getGraphics(); } 2°) et 3°) les dessins sont faits dans le buffer Graphics qu'on finit par associer à l'écran. Par exemple: public void paint(Graphics g) { bufgc.setColor(Color.Black); bufgc.fillOval(20, 60, 100, 100); ... // paint() doit obligatoirement se terminer par : g.drawImage(bufImg, 0, 0, this); } II-13 JMF
  • 14. graphiques avancés et animations le langage java Double buffering, exemple : Pierre Cubaud II-14 JMF
  • 15. graphiques avancés et animations le langage java import java.awt.*; import java.applet.Applet; public class mandelb extends Applet { int haut=400; int larg=400; int incligne=1; int inccolonne=1; double x1= -2; //-0.67166; double x2= 0.5; //-0.44953; double y1= -1.25; //0.49216; double y2= 1.25; //0.71429; double limite= 50; double incx= (x2-x1)/larg; double incy= (y2-y1)/haut; Image ofbuff; Graphics ofg,ong; boolean premiere_fois=true; public mandelb() { resize(haut,larg); repaint(); } II-15 JMF
  • 16. graphiques avancés et animations le langage java public boolean action(Event e, Object o) { Graphics theg; if (e.id==Event.MOUSE_UP) { if (!premiere_fois) { ong.drawLine(e.x,e.y,e.x,e.y); } return true; } else return false; } II-16 JMF
  • 17. graphiques avancés et animations le langage java public void paint(Graphics g) { int ligne,colonne,compt; double p0,q0,module,x,y,aux; if (premiere_fois) { ong=g; ong.setColor(Color.black); ofbuff=createImage(larg,haut); ofg=ofbuff.getGraphics(); ofg.setColor(Color.black); colonne=0; while (colonne<=larg) { p0=x1+colonne*incx; ligne=0; while (ligne <= (haut/2)) { q0=y1+ligne*incy; x=0;y=0;compt=1;module=0; while ((compt<=limite)&&(module<4.0)) { aux=x; x=x*x-y*y+p0; y=2*y*aux+q0; module=x*x+y*y; compt++; } II-17 JMF
  • 18. graphiques avancés et animations le langage java if (module<4.0) { ofg.drawLine(colonne,ligne,colonne,ligne); ofg.drawLine(colonne,haut- ligne,colonne,haut-ligne); } // pour patienter pdt le calcul g.drawLine(colonne,ligne,colonne,ligne); ligne+=incligne; } colonne+=inccolonne; } premiere_fois=false; } g.drawImage(ofbuff,0,0,null); } public static void main(String[] args) { Applet m= new mandelb(); } } II-18 JMF
  • 19. graphiques avancés et animations le langage java Les tremblements dans les animations (suite) Optimisation : préciser dans update() la zone de cliping zone de cliping = zone sensible de dessin (i.e. à l'extérieur rien n'est redessiné). On écrit alors : public void update(Graphics g) { g.clipRect(x1, y1, x2, y2); paint(g); } II-19 JMF
  • 20. graphiques avancés et animations le langage java Asynchronisme de drawImage() On considère l'applet Java : import java.awt.Graphics; import java.awt.Image; public class LadyBug extends java.applet.Applet { Image bugimg; public void init() { bugimg = getImage(getCodeBase(), "images/ladybug.gif"); } public void paint(Graphics g) { g.drawImage(bugimg,10,10,this); System.out.println("dans paint()"); } } Au moment du getImage() l'image est "repérée" mais pas chargée. Elle l'est réellement lors du drawImage(). II-20 JMF
  • 21. graphiques avancés et animations le langage java Asynchronisme de drawImage()(suite) Le chargement de l'image par drawImage() est effectué dans une thread et drawImage() est une méthode asynchrone (i.e. non bloquante). Cette méthode rend la main à son appelant ce qui explique qu'on ait besoin de le passer (par this). De plus elle appelle régulièrement cet appelant i.e. cet observateur d'image, objet d'une classe qui implémente l'interface ImageObserver (ce qui est la cas pour la classe Component) pour qu'il demande à être redessiné par le lancement de update(). Ceci explique les nombreux passages dans paint(). II-21 JMF
  • 22. graphiques avancés et animations le langage java Asynchronisme de drawImage()(suite) II-22 JMF
  • 23. graphiques avancés et animations le langage java Image dans une application Java Dans une applet, pour repérer une image, on utilise la méthode getImage() de la classe Applet. Pour une application Java, on ne peut utiliser cette méthode. On utilise alors la méthode getImage() de la classe Toolkit (qui représente l'environnement d'exécution de l'application Java) et on écrit : Toolkit tk = Toolkit.getDefaultToolkit(); Image im = tk.getImage(fichierImage) II-23 JMF
  • 24. graphiques avancés et animations le langage java Image dans une application Java (suite) Par exemple la version application Java de l'applet ci dessus est : import java.awt.*; public class LadyBug extends Frame { Image bugimg; public static void main(String args[ ]) { Toolkit tk = Toolkit.getDefaultToolkit(); Frame fr = new LadyBug(tk, "Coccinelle"); fr.resize(200, 200); fr.show(); } public LadyBug (Toolkit tk, String st) { super(st); bugimg = tk.getImage("ladybug.gif"); } public void paint(Graphics g) { g.drawImage(bugimg,10,10,this); } } II-24 JMF
  • 25. graphiques avancés et animations le langage java La classe MediaTracker Elle permet de gérer l'asynchronisme de drawImage(). Elle offre des méthodes indiquant si un ensemble d'images a été entièrement chargé. import java.awt.*; import java.applet.*; public class testMediaTracker extends Applet { private Image bugimg; static final private int numero = 0; private MediaTracker tracker; public void init() { tracker = new MediaTracker(this); bugimg = getImage(getCodeBase(), "images/ladybug.gif"); tracker.addImage(bugimg, numero); try { tracker.waitForAll(); } catch (InterruptedException e) { System.out.println("Pb dans le MediaTracker"); } } public void paint(Graphics g) { int resulMT; resulMT = tracker.statusID(numero, false); if ((resulMT & MediaTracker.COMPLETE) != 0) { g.drawImage(bugimg,10,10,this); System.out.println("dans paint()"); } } } II-25 JMF
  • 26. graphiques avancés et animations le langage java La classe MediaTracker présentation Cette classe permet de gérer des objets multimédia bien que seuls les fichiers images sont actuellement gérer. Après avoir créer une instance de cette classe par le seul constructeur MediaTracker(Component) qui crée un mediatracker pour ce composant, on ajoute les images par addImage(Image img, int numero) Le numéro peut contrôler un ensemble d'images et indique un ordre de chargement ainsi qu'un identificateur pour cet ensemble. Le chargement est contrôlé par 4 variables static : ABORTED : le chargement a été abandonné. COMPLETE : le chargement s'est bien effectué. ERRORED : erreur au cours du chargement LOADING : chargement en cours. II-26 JMF
  • 27. graphiques avancés et animations le langage java La classe MediaTracker principales méthodes addImage(Image img, int num) ajoute l'image img avec le numéro num dans l'instance. Il existe 2 familles de méthodes pour cette classe : les "check" et les "wait". Les méthodes "wait" sont bloquantes alors que les "check" ne le sont pas. Les "wait" attendent que la thread de chargement soit finie pour rendre la main : cela ne signifie pas que le chargement des images ait réellement été effectués (i.e. délai de garde dans les "wait" par exemple). Les "check" indiquent si les images ont bien été chargées. II-27 JMF
  • 28. graphiques avancés et animations le langage java La classe MediaTracker la famille "wait" Les méthodes "wait" sont sous contrôle d'InterruptedException (donc non masquables) levée lorsqu'une thread a interrompue la thread courante. public void waitForAll() la thread de chargement de toutes les images mises dans l'instance est lancé. public synchronized boolean waitForAll(long delai) la thread de chargement de toutes les images mises dans l'instance est lancée et se terminera au plus tard après delai millisecondes. public void waitForID(int num) la thread de chargement de l'ensemble des images de numéro num est lancé. public synchronized boolean waitForID(int num, long delai) la thread de chargement de l'ensemble des images de numéro num est lancé et se terminera au plus tard après delai millisecondes. II-28 JMF
  • 29. graphiques avancés et animations le langage java La classe MediaTracker la famille "check" public boolean checkAll() vérifie si toutes les images mises dans l'instance sont chargées. public boolean checkAll(boolean relance) vérifie si toutes les images mises dans l'instance sont chargées. Relance le chargement si relance vaut true. public boolean checkID(int num) vérifie si l'ensemble des images repéré par num mises dans l'instance sont chargées. public boolean checkID(int num, boolean relance) vérifie si l'ensemble des images repéré par num mises dans l'instance sont chargées. Relance le chargement si relance vaut true. II-29 JMF
  • 30. graphiques avancés et animations le langage java La classe MediaTracker le contrôle des erreurs Il existe des méthodes de contrôle des erreurs de chargement (elles sont toutes synchronized) public synchronized Object[] getErrorsAny() retourne une liste de médias qui ont posé problème lors du chargement dans l'instance (ou null sinon) public synchronized Object[] getErrorsID(int id) retourne une liste de médias de numéro id qui ont posé problème lors du chargement dans l'instance (ou null sinon) public synchronized boolean isErrorAny() renvoie true si une des images à provoquer une erreur lors du chargement dans l'instance. public synchronized boolean isErrorID(int id) renvoie true si une des images repérée par id à provoquer une erreur lors du chargement dans l'instance. II-30 JMF
  • 31. graphiques avancés et animations le langage java La classe MediaTracker le contrôle des erreurs (fin) public int statusAll(boolean load) retourne un masque OR (à comparer avec MediaTracker.COMPLETE, ...) indiquant comment s'est passé le chargement. Si load vaut true, la chargement des images non déjà chargées est relancé. public int statusID(int id, boolean load) retourne un masque OR (à comparer avec MediaTracker.COMPLETE, ...) indiquant comment s'est passé le chargement des images numérotées id. Relance le chargement si load vaut true. II-31 JMF
  • 32. graphiques avancés et animations le langage java Bibliographie http://www.javaworld.com/javaworld/jw- 03-1996/jw-03-animation.html http://java.sun.com:81/applets/Fractal /1.0.2/example1.html Teach yourself Java in 21 days : Laura Lemay, Charles L.Perkins ; ed Sams.net traduit en français ed S&SM "Le programmeur Java" II-32 JMF