Title: Animation graphique
1Animation graphique
2Animation graphique
- Trois méthodes dans lesquelles on a le droit de
dessiner ! - paintComponent(Graphics g)
- Repaint()
- Super.paintComponent(Graphics g)
- Interdiction de dessiner ailleurs !
- Mais on peut dans des méthodes appelées par
paintComponent !
3Animation Graphique
- En général, paintComponent commence par appeler
super.paintComponent(g) - A pour effet deffacer le contenu du composant,
- Normal car par defaut, cest ce que fait
paintComponent dessine un rectangle de la
couleur du fond dans le composant. - On peut ne pas le faire si on est sur de
redessiner la totalité de la surface - Optimisation !
4Animation graphique
- Comment faire ?
- Un thread danimation, qui fait des appels à
repaint() - repaint() provoque lappel asynchrone de
paintComponent(Graphics g) - Pas de paintChildren(..), de validate(..) etc.
- Dans PaintComponent on parcourt la ou les
listes/tableaux dobjets à dessiner et on appelle
leur méthode dessineToi(Graphics g) - Nécessité davoir une hiérarchie de classe si on
veut mettre tous les objets dans une même
collection - Mais ce nest pas obligatoire, on peut vouloir
gérer séparément des Personnes et des Ascenseurs
par exemple.
5Exemple
- c.ajouteObjetDessinable(new ImageAnimee(100, 100,
"toto.gif")) - c.ajouteObjetDessinable(new ImageAnimee(200, 200,
"toto.gif")) - c.ajouteObjetDessinable(new Cercle(100, 100, 20)
-
- public void run()
- while(true)
- // On demande à redessiner les cercles
- repaint()
- // On "dort" tempsEntreFrame millisecondes
- thread.sleep(tempsEntreFrames)
-
-
-
6Exemple suite
- public void paintComponent(Graphics gc)
- super.paintComponent(gc)
- Collection liste listeObjetsDessinables.getAl
l() -
- // On affiche les objets animés
- for(ObjetDessinable objetDessinable liste)
- objetDessinable.dessineToi(gc)
-
-
-
7Lutilisation dinterfaces est recommandée !
- public interface Dessinable
- public void dessineToi(Graphics gc)
-
- public interface Deplacable
- public void move()
-
- Etc
8Déplacer les objets ?
- Deux stratégies
- On fait tout dans le même thread que lanimation
- Dans le paintComponent() on appelle aussi une
méthode updateState() ou deplaceToi() de chaque
objet avant de le dessiner. - Si on veut une vitesse réelle constante, on peut
mesurer le temps et passer des paramètres à ces
méthodes. - Chaque objet est un thread et il met à jour son
état en permanence - Beaucoup plus compliqué à gérer au niveau de la
synchronisation - Nécessité dutiliser des ThreadGroups si on veut
faire suspend/resume sur les objets
9Exemple avec un seul Thread
- public void paintComponent(Graphics gc)
- super.paintComponent(gc)
- Collection liste listeObjetsDessinables.getAl
l() -
- // On affiche les objets animés
- for(ObjetDessinable objetDessinable liste)
- objetDessinable.deplaceToi()
- objetDessinable.dessineToi(gc)
-
-
-
10Exemple ou chaque objet est un Thread
- import java.awt.
- public class ObjetGraphique implements Runnable,
Dessinable - protected int x, y // position du centre
- protected int largeur, hauteur // Boite
englobante de l'objet - // Constructeurs
- public ObjetGraphique(int x, int y, int
largeur, int hauteur) - this.x x
- this.y y
- new (this).start()
-
- public void run()
- int incX1, incY1
- while(true)
- // ici changer x, y
-
- // On déplace l'objet
- move(x, y)
11Objet concret un cercle
- import java.awt.
- public class Cercle extends ObjetGraphique //
Il est donc un Dessinable aussi ! -
- int rayon // le rayon du cercle
-
- // Constructeurs
- public Cercle(int x, int y, int rayon)
- super(x, y, 2 rayon, 2 rayon)
- this.rayon rayon
-
-
- public void dessineToi(Graphics gc)
- super.dessineToi(gc)
- gc.drawOval(x - rayon, y - rayon,
- 2 rayon, 2 rayon)
-
- public void move(int x, int y)
12Si les objets se déplacent seuls
- public void paintComponent(Graphics gc)
- super.paintComponent(gc)
- Collection liste listeObjetsDessinables.ge
tAll() -
- // On affiche les objets animés
- for(ObjetDessinable objetDessinable liste)
- // Inutile de les déplacer !
- // objetDessinable.deplaceToi()
- objetDessinable.dessineToi(gc)
-
-
-
13Exemple de ThreadGroup
- import java.awt.
- public class ObjetGraphique implements Runnable,
Dessinable - static ThreadGroup tg new
ThreadGroup("ObjetsDessinables") - protected int x, y // position du centre
- protected int largeur, hauteur // Boite
englobante de l'objet - // Constructeurs
- public ObjetGraphique(int x, int y, int
largeur, int hauteur) - this.x x
- this.y y
- new Thread(tg, this).start()
-
- // Méthodes statiques
-
- / On réveille tous les threads des objets
graphiques / - static public void suspend()
14Quelques nouveautés intéressantes
15Amélioration des performances de la JVM
- Sun a engagé depuis le JDK 1.4.2 un effort
considérable pour améliorer sa plate-forme. - Un effort particulier autours de Swing pour le
rendre plus performant. - Ces efforts se traduisent par
- Limitation du nombre dinstances utilisées.
- Restructuration de limplémentation interne des
APIs, sans remettre en cause la partie publique. - Ce qui impacte directement le temps utilisé par
le garbage collector. - Exemple de code
16Amélioration des performances de la JVM
- Code à récupérer
- Nombre dinstances allouées sous
- 1.4.2 25217 objets,
- 5.0 16272 objets,
- 6.0 3284 objets !
17Mise en uvre dIHMs via AWT et Swing
amélioration du rendu visuel
- Deux évolutions majeures permettent daméliorer
le rendu visuel de vos applications - Support tant attendu du sub-pixel antialiasing,
- Implémentation dun véritable double buffering au
cur de Swing/AWT/Java2D - Cette implémentation supprime le fameux effet de
rectangle gris que lon observe en déplaçant une
fenêtre par-dessus une application Swing.
18Mise en uvre dIHMs via AWT et Swing
intégration avec le window manager
- Affichage dun splash screen au démarrage de
lapplication possible à partir dun fichier
image (gif, jpg, png). - Nouvelle classe java.awt.SpashScreen notamment
utilise pour fermer les splash screens. - Deux techniques peuvent être utilisées
- Soit en passant un paramère de java
- Java spashfilename.gif monpackage.MonAppli
- Soit en utilisant le fichier Manifest de
larchive .jar - Manifest-Version 1.0
- Main-Class monpackage.MonAppli
- SplashScreen-Image fil
- ename.gif
19Mise en uvre dIHMs via AWT et Swing
intégration avec le window manager
- Intégration de votre application avec le bureau
du Window Manager grâce à la classe
java.awt.Desktop - Cette classe interagit avec le bureau en
utilisant la configuration actuelle (navigateur
par défaut, outil de mail par défaut,
associations de fichiers etc.) - Principales possibilités
- Lancement du navigateur web, de loutil de mail,
- Ouverture dune appli java lorsquon double
clique sur un type de fichier, - Impression avec les paramètres par défaut,
- Ouverture dun explorateur de fichiers sur un
répertoire donné - Exemple de code à étudier dans le wiki
20Mise en uvre dIHMs via AWT et Swing
intégration avec le window manager
- Un petit exemple dutilisation de la classe
java.awt.Desktop pour louverture du navigateur
web par défaut sur une URL - import java.awt.Desktop
- import java.net.URL
- public class LaunchBrowser
- Public static void main(String args)
- if(Desktop.isDesktopSupported())
- if(Desktop.getDesktop().isSupported(Desktop
.Action.BROWSE)) - Desktop.getDesktop().browse(new
URL("http//www.google.com")) -
-
-
-
21Utilisation de wildcards () dans les CLASSPATHs
- Par défaut la JVM doit savoir où se trouvent les
fichiers .class. Trois solutions permettent de
gérer cet aspect - Editer la variable denvironnement CLASSPATH,
- Utiliser loption cp sur la ligne de commande de
démarrage de la JVM (java cp.) - Placer un jar dans le répertoire
JDK_HOME/jre/lib/ext - Avec les deux premières techniques on spécifie
- Un nom de répertoire,
- Un nom de fichier .jar (Java Archive)
22Utilisation de wildcards () dans les CLASSPATHs
- La version 6.0 du J2SE permet maintenant
dutiliser le caractère à la suite dun
répertoire pour avoir la visibilité sur plusieurs
jars. - Exemple dutilisation
- SET CLASSPATHlib/
- Java Application.Start
- Code à étudier dans le wiki
23Quelques améliorations du langage les
métadonnées en Java 1/3
- Permettent dadjoindre des annotations à une
classe ainsi quà ses champs - Sont définies dans le code source
- Se retrouvent via le moteur de réflexion de java
(java.lang.reflect) - Il nest plus nécessaire de fournir de fichiers
supplémentaires pour la description dune classe. - La classe BeanInfo pour la technologie JavaBean
- Les interfaces distantes pour les services webs
et les composants EJBs - Les descripteurs de déploiement des applications
J2EE
24Quelques améliorations du langage les
métadonnées en java 2/3
- La librairie J2SE 1.5 contient déjà quelques
annotations - _at_deprecated java.lang (mais encore peu
utilisée) - _at_Overrides java.lang
25Quelques améliorations du langage les
métadonnées en java 3/3
- import java.io.Serializable
- import javax.persistence.
- _at_Entity
- _at_Table(name "MANUFACTURER")
- _at_NamedQueries(
- _at_NamedQuery(name "Manufacturer.findByManufacture
rId", - query "SELECT m FROM Manufacturer m
WHERE m.manufacturerId manufacturerId"), - _at_NamedQuery(name "Manufacturer.findByName",
- query "SELECT m FROM Manufacturer m
WHERE m.name name"), - public class Manufacturer implements Serializable
- private static final long serialVersionUID
1L - _at_Id
- _at_Column(name "MANUFACTURER_ID", nullable
false) - private Integer manufacturerId
- _at_Column(name "NAME")
- private String name
26Introduction le fameux HelloWorld revisité
- public class HelloWorld
- public static void main(String... args)
- System.out.printf("HelloWorld class start with
d parameters !\n", args.length) - System.out.printf("printf function accept many
parameters like C language\n") - int numerator 3, denominator 5
- String staticText "Rational"
- System.out.printf("My s is d/d\n",
staticText, numerator, denominator) -
27Méthodes à nombre variable de paramètres
- Identique à passer un tableau dobjets
- Simple point de vue syntaxique
- Permet de simplifier la syntaxe dappel vous ne
construisez pas le tableau. - Le Main peut donc être vu comme une méthode à
nombre variable de paramètres. - Exemple de méthode à nombre variable de
paramètres printf
28Méthodes à nombre variable de paramètres
- public class Start
- public static int minimum(int ... values) throws
Exception - if (values.lengthlt1) throw new Exception("You
must specified a value") - if (values.length 1) return values0
- int mini values0
- for(int i1 iltvalues.length i)
- if (valuesiltmini) minivaluesi
-
- return mini
-
- public static int maximum(int ... values) throws
Exception - if (values.lengthlt1) throw new Exception("You
must specified a value") - if (values.length 1) return values0
- int maxi values0
- for(int i1 iltvalues.length i)
- if (valuesigtmaxi) maxivaluesi
-
- return maxi
-
29Boxing et Unboxing
- import java.util.
- public class Start
- public static void main(String args)
- Integer monInt 3 // Boxing
- System.out.println("monInt " monInt)
- int i monInt // unboxing
- System.out.println("---------------------------"
) - Vector collection new Vector()
- collection.addElement("Ceci est une chaine")
- collection.addElement(new Date())
- collection.addElement(3.2) // Boxing
- collection.addElement(2)
- Enumeration enume collection.elements()
- while(enume.hasMoreElements())
30Les types énumérés
- import java.lang.reflect.
- enum Feu
- VERT,
- ORANGE,
- ROUGE
-
- public class Start
- public static void main(String args)
- Feu feuCroisement Feu.VERT
- System.out.println("feuCroisement "
feuCroisement) - System.out.println("type de feuCroisement "
feuCroisement.getClass()) - Class clsFeu feuCroisement.getClass()
- Field attributes clsFeu.getFields()
- for(Field field attributes)
- System.out.printf("Attribut s de type s\n",
- field.getName(), field.getType()