Sie sind auf Seite 1von 527

Dao Issiaka- 3me anne SI

JAVA
Langage orient objet

Programmer en java

Page 1

Dao Issiaka- 3me anne SI

Table des Matires


Le langage Java La bibliothque Java 1.0 Les extensions Java Applets Java Historique Du C/C++ Java Le langage Java Dmarrer en Java

Rcuprer le JDK (Java Development Kit) o Introduction o O trouver le JDK Installation Description de l'environnement et des commandes o Principe de fonctionnement o Description des principales commandes du JDK javac java appletviewer Votre premire applet : le classique "Hello world !" o Applet HelloWorld

Les notions de base


Objets, classes et hritage Rfrences Les mots-cls de Java o Les mots-cls du C/C++ absent en Java Types primitifs Structure d'un programme Les packages
o o import

Dfinir un package

Cration et utilisation des classes

Dclaration des classes et des interfaces o Identifiants o Les classes o Les interfaces Dclaration des champs o Syntaxe o Initialisations static o Initialisations d'instance
Page 2

Programmer en java

Dao Issiaka- 3me anne SI

Dclaration des mthodes o Syntaxe o Surcharge des mthodes o Constructeur Cration d'objets : oprateur new Outrepasser une mthode o Application Banque o Utilisation de classes abstact Destruction des objets o Comment a marche ? Application ListeChainee

Objets, tableaux et chanes de caractres


La classe Object La classe Class Les tableaux Les chanes de caractres La classe String La classe StringBuffer La classe System

Les instructions et les oprateurs


Les blocs
if ... else, switch while, do ... while, for

Les expressions o Utilisation de this et de super Les oprateurs o Oprateurs arithmtiques o L'oprateur instanceof o Oprateurs du C/C++ absent en Java Les conversions (ou casts) o Conversions entre types primitifs avec gain de prcision o Conversions entre types primitifs avec perte de prcision o Conversions de rfrences d'une classe dans une autre Priorit des oprateurs

Les exceptions
throw, try, catch,... o Syntaxe

Application EssaiException Application InstantiationAvecNom o Avantages des exceptions La classe Throwable Les exceptions Runtime Les classes d'erreurs Les autres exceptions

Programmer en java

Page 3

Dao Issiaka- 3me anne SI

Les threads

Dfinition d'un thread o Le partage du temps entre threads La cration d'un thread o Applet Chrono Les tats d'un thread La synchronisation des threads o Utilisation de synchronized Applet AfficheurDeCalcul o Synchronisation avec wait () et notify () La classe Thread

Les classes internes

Les classes internes o Syntaxe o Utilisation Les classes anonymes Autres nouveauts Java 1.1 o Initialisations d'instance o Initialisation de tableaux o Utilisation du mot-cl class o Variables locales et paramtres final

Ajouts syntaxiques de Java 5.0


Enumration
import static

Liste d'arguments variable Autoboxing / auto-unboxing Boucle itrative Gnricit Annotations

Conventions d'criture et portage


Conventions d'criture Portage de programmes crits en C/C++ o Conception des classes o Remplacement des dfinitions de type typedef o Remplacement des instructions de prcompilation #define o Remplacement des instructions de prcompilation #ifdef, #else, #endif o Remplacement des numrations enum o Remplacement des unions union Application TestExpression o Passage des valeurs par adresse o Allocation dynamique o Utilisation des chanes de caractres o Arithmtique des pointeurs o Transformation des pointeurs sur fonctions
Page 4

Programmer en java

Dao Issiaka- 3me anne SI

o o

Remplacement de l'hritage multiple Autres problmes propres au C++

La bibliothque Java 1.0

La bibliothque Java 1.0

Les packages de la bibliothque Java 1.0 o Classes de base : le package java.lang o Gestion de donnes et utilitaires : le package java.util o Les entres-sorties : le package java.io o Les accs rseau : le package java.net o Gestion des applets : le package java.applet o Interface utilisateur : le package java.awt o Manipulation d'images : le package java.awt.image o Liaison avec l'interface utilisateur du systme : le package java.awt.peer Hirarchie des classes Java 1.0

Les classes de bases

Gestion des objets o La classe java.lang.Object o L'interface java.lang.Cloneable o La classe java.lang.Class o La classe java.lang.ClassLoader o La classe java.lang.Compiler o La classe java.lang.Throwable Les classes d'emballage o La classe java.lang.Boolean o La classe java.lang.Character o La classe java.lang.Number o La classe java.lang.Integer o La classe java.lang.Long o La classe java.lang.Float o La classe java.lang.Double o La classe java.lang.String o La classe java.lang.StringBuffer Calcul mathmatique : la classe java.lang.Math Gestion des threads o L'interface java.lang.Runnable o La classe java.lang.Thread o La classe java.lang.ThreadGroup Gestion du systme o La classe java.lang.System o La classe java.lang.Runtime o La classe java.lang.Process o La classe java.lang.SecurityManager

Les outils Java

Gestion de collections de donnes


Page 5

Programmer en java

Dao Issiaka- 3me anne SI

L'interface java.util.Enumeration Application EssaiEnumeration o La classe java.util.Vector o La classe java.util.Stack o La classe java.util.Dictionary o La classe java.util.Hashtable o La classe java.util.Properties o La classe java.util.BitSet Gestion des dates o La classe java.util.Date Gnration de nombres alatoires o La classe java.util.Random Autres classes d'outils o La classe java.util.StringTokenizer o L'interface java.util.Observer o La classe java.util.Observable Applet ObservateurCalcul
o

La gestion des fichiers et des flux de donnes

Gestion des entres-sorties o Mode d'accs aux donnes o Gestion de l'accs aux donnes avec les exceptions Manipulation des fichiers o L'interface java.io.FilenameFilter o La classe java.io.File o La classe java.io.FileDescriptor Gestion des flux de donnes Accs un flux de donnes en lecture o Application LectureFichier o Application NumerotationLigne o La classe java.io.InputStream o La classe java.io.FileInputStream o La classe java.io.PipedInputStream o La classe java.io.ByteArrayInputStream o La classe java.io.StringBufferInputStream o La classe java.io.SequenceInputStream o La classe java.io.FilterInputStream o La classe java.io.BufferedInputStream o L'interface java.io.DataInput o La classe java.io.DataInputStream o La classe java.io.LineNumberInputStream o La classe java.io.PushBackInputStream o La classe java.io.StreamTokenizer Accs un flux de donnes en criture o Application ConcatenationFichiers o La classe java.io.OutputStream o La classe java.io.FileOutputStream o La classe java.io.PipedOutputStream o La classe java.io.ByteArrayOutputStream o La classe java.io.FilterOutputStream
Page 6

Programmer en java

Dao Issiaka- 3me anne SI

La classe java.io.BufferedOutputStream L'interface java.io.DataOutput La classe java.io.DataOutputStream La classe java.io.PrintStream Gestion de l'accs alatoire aux fichiers o La classe java.io.RandomAccessFile
o o o o

Les accs au rseau

Accs via une URL o La classe java.net.URL Application TestProtocole o La classe java.net.URLConnection Applet HelloFromNet o La classe java.net.URLEncoder o L'interface java.net.URLStreamHandlerFactory o La classe java.net.URLStreamHandler o L'interface java.net.ContentHandlerFactory o La classe java.net.ContentHandler L'architecture client-serveur o Principe o Exemples d'utilisation o Protocoles Accs via les sockets o La classe java.net.InetAddress o La classe java.net.Socket o La classe java.net.ServerSocket o Le client serveur d'cho Application EchoServer Applet EchoClient o Le paper board Internet Application PaperBoardServer Applet PaperBoardClient o La classe java.net.SocketImpl o L'interface java.net.SocketImplFactory Accs via les datagrammes o La classe java.net.DatagramPacket o La classe java.net.DatagramSocket

Les applications et les applets


Les applications Java Les applets o Caractristiques o La classe java.applet.Applet L'intgration des applets dans les navigateurs o L'interface java.awt.AppletContext o L'interface java.applet.AppletStub Applet PlayApplet o L'interface java.applet.AudioClip Applet Piano
Page 7

Programmer en java

Dao Issiaka- 3me anne SI

Transformer une applet en application

Les composants de l'interface utilisateur


Les composants Java La classe java.awt.Component Les composants prdfinis o La classe java.awt.Button o La classe java.awt.Checkbox o La classe java.awt.CheckboxGroup o La classe java.awt.Choice o La classe java.awt.List Applet Unicode o La classe java.awt.Label o La classe java.awt.TextComponent o La classe java.awt.TextField Applet CalculetteSimple o La classe java.awt.TextArea o La classe java.awt.Scrollbar Comment a marche ? o Le peer d'un composant o La classe java.awt.Toolkit

Les containers et la disposition des composants

Les containers o L'architecture container/composant Applet TraitementTexte o La classe java.awt.Container o La classe java.awt.Panel o La classe java.awt.Window o La classe java.awt.Frame Transformer une applet en application isole o La classe java.awt.Dialog Applet MessageBoxApplet o La classe java.awt.FileDialog La disposition des composants : les layouts o L'interface java.awt.LayoutManager o La classe java.awt.FlowLayout o La classe java.awt.BorderLayout Applet BorderBuilder o La classe java.awt.GridLayout o La classe java.awt.GridBagLayout o La classe java.awt.GridBagConstraints o La classe java.awt.CardLayout Les menus o Applet ShowMenu o L'interface java.awt.MenuContainer o La classe java.awt.MenuComponent o La classe java.awt.MenuBar o La classe java.awt.MenuItem
Page 8

Programmer en java

Dao Issiaka- 3me anne SI

o o

La classe java.awt.Menu La classe java.awt.CheckboxMenuItem

La gestion de l'interface utilisateur

La gestion vnementielle o Les vnements Applet MiseAJourHorloge o La classe java.awt.Event La classe Graphics : tout pour dessiner o La classe java.awt.Graphics o Applet DrawIt Les polices de caractres o La classe java.awt.Font o La classe java.awt.FontMetrics Applet ListePolices La couleur o La classe java.awt.Color Applet Nuancier Les classes manipulant des dimensions o La classe java.awt.Dimension o La classe java.awt.Insets o La classe java.awt.Point o La classe java.awt.Polygon o La classe java.awt.Rectangle La cration de nouveaux composants o La classe java.awt.Canvas Applet BoutonsNavigation

Les images

La gnration d'images o Applet MultiImages o La classe java.awt.Image Le chargement des images o Applet ImageSimple o La classe java.awt.MediaTracker o L'interface java.awt.image.ImageObserver Applet ChargementImage La cration d'images o La classe java.awt.image.MemoryImageSource Applet ImageTableau o La classe java.awt.image.ColorModel o La classe java.awt.image.DirectColorModel o La classe java.awt.image.IndexColorModel Applet ImageNoirEtBlanc o La classe java.awt.image.PixelGrabber Transformer des images avec un filtre o La classe java.awt.image.FilteredImageSource o La classe java.awt.image.ImageFilter o La classe java.awt.image.CropImageFilter
Page 9

Programmer en java

Dao Issiaka- 3me anne SI

La classe java.awt.image.RGBImageFilter Applet NegatifImage Comment a marche ? o Applet Compteur o L'interface java.awt.image.ImageProducer o L'interface java.awt.image.ImageConsumer Gestion d'animations o Enchanement d'images tlcharges Applet AnimationFleche o Utilisation du double buffering Applet ScrollText o Horloge avec image de fond Applet Horloge
o

Plus loin avec Java...

Les volutions du langage o Java 1.1 o Java 2 Conclusion

Les extensions Java

Java 3D

Dmarrer en Java 3D o Prrequis o Tlchargement o Installation o Architecture Un premier exemple o Applet Applet3D Principes 3D o Construction d'un univers 3D o Repre 3D o Transformation 3D Applet CubeSides o Arbre d'une scne 3D Applet MultiCubes o Optimisations Java 3D Compilation Capacit d'un noeud Les classes de bases o La classe javax.media.j3d.SceneGraphObject o La classe javax.media.j3d.Node o La classe javax.media.j3d.Leaf o La classe javax.media.j3d.Group o La classe javax.media.j3d.BranchGroup o La classe javax.media.j3d.TransformGroup o La classe javax.media.j3d.Transform3D o Les classes algbriques
Page 10

Programmer en java

Dao Issiaka- 3me anne SI

o o o o

La classe javax.vecmath.Tuple3f La classe javax.vecmath.Point3f La classe javax.vecmath.Vector3f La classe javax.vecmath.Color3f

Objets 3D

Les formes de base o Les diffrentes formes Applet SimpleObjects o La classe javax.media.j3d.Shape3D o La classe com.sun.j3d.utils.geometry.ColorCube o La classe com.sun.j3d.utils.geometry.Primitive o La classe com.sun.j3d.utils.geometry.Box o La classe com.sun.j3d.utils.geometry.Sphere o La classe com.sun.j3d.utils.geometry.Cylinder o La classe com.sun.j3d.utils.geometry.Cone Les constructions gomtriques o Les diffrents types de constructions gomtriques o Les diffrents algorithmes de construction o Constructions gomtriques indices Applet Pyramid o La classe javax.media.j3d.NodeComponent o La classe javax.media.j3d.Geometry o La classe javax.media.j3d.GeometryArray o La classe com.sun.j3d.utils.geometry.GeometryInfo o La classe com.sun.j3d.utils.geometry.NormalGenerator o Construction d'une surface autour d'un axe central Applet AxisShapeDemo o La classe javax.media.j3d.Text3D Applet HelloWorld3D o La classe javax.media.j3d.Font3D o La classe javax.media.j3d.FontExtrusion Les fonds d'cran o La classe javax.media.j3d.Background o La classe javax.media.j3d.Bounds o La classe javax.media.j3d.BoundingBox o La classe javax.media.j3d.BoundingSphere o La classe javax.media.j3d.BoundingLeaf L'importation de scnes 3D o Applet ObjectFileDemo o L'interface com.sun.j3d.loaders.Loader o L'interface com.sun.j3d.loaders.Scene

Les attributs d'apparence


Les diffrents attributs o La classe javax.media.j3d.Appearance Les attributs de couleur o Applet Clown o La classe javax.media.j3d.ColoringAttributes
Page 11

Programmer en java

Dao Issiaka- 3me anne SI

o La classe javax.media.j3d.Material Les attributs d'affichage des facettes o Applet SphereConstruction o La classe javax.media.j3d.PolygonAttributes o La classe javax.media.j3d.PointAttributes o La classe javax.media.j3d.LineAttributes Les attributs de transparence et de rendu o Applet WaterGlass o La classe javax.media.j3d.TransparencyAttributes o La classe javax.media.j3d.RenderingAttributes Les attributs de texture o Applet SimpleTexturedObjects o La classe javax.media.j3d.Texture o La classe javax.media.j3d.Texture2D o La classe javax.media.j3d.TextureAttributes o La classe javax.media.j3d.ImageComponent o La classe javax.media.j3d.ImageComponent2D o La classe com.sun.j3d.utils.image.TextureLoader

Eclairage 3D

Activation Les diffrentes sources lumineuses o Effets des sources lumineuses Applet LightEffect o Couleur des facettes claires o Eclairage et texture Applet LitPlane Combinaison des sources lumineuses o Applet LitApplet3D Les classes d'clairage o La classe javax.media.j3d.Light o La classe javax.media.j3d.AmbientLight o La classe javax.media.j3d.DirectionalLight o La classe javax.media.j3d.PointLight o La classe javax.media.j3d.SpotLight

Animation 3D

Interaction o Comportement et stimulus Applet MouseApplet3D o La classe javax.media.j3d.Behavior o La classe javax.media.j3d.WakeupCondition o La classe javax.media.j3d.WakeupCriterion o La classe com.sun.j3d.utils.behaviors.mouse.MouseBehavior o La classe com.sun.j3d.utils.behaviors.mouse.MouseRotate o La classe com.sun.j3d.utils.behaviors.mouse.MouseTranslate o La classe com.sun.j3d.utils.behaviors.mouse.MouseZoom o La classe
com.sun.j3d.utils.behaviors.keyboard.KeyNavigatorBehavior

Programmer en java

Page 12

Dao Issiaka- 3me anne SI

Animation o Comportement d'animation et oprateur alpha Applet TextTranslation o La classe javax.media.j3d.Interpolator o La classe javax.media.j3d.Alpha Applet AlphaTest o La classe javax.media.j3d.PositionInterpolator o La classe javax.media.j3d.RotationInterpolator Applet Clock3D o La classe javax.media.j3d.ScaleInterpolator o La classe javax.media.j3d.ColorInterpolator o La classe javax.media.j3d.TransparencyInterpolator Un exemple complet : Du soleil la lune o Applet SunEarthMoonMotion Plus loin avec Java 3D... o Solutions alternatives
o

Cet cour du langage java a t resembl en cet format par DAO Issiaka, tudiant en 3me anne informatique option Systme dinformation, Guelma.

Programmer en java

Page 13

Dao Issiaka- 3me anne SI

Historique

13 Dcembre 2007 Version 1.3.1 : Mise jour de la page Dmarrer en Java pour y reflter les changements de dnomination de Java et y mentionner Java SE 6. Corrections de fautes de frappe et d'erreurs de texte. 02 Fvrier 2006 Version 1.3 : Ajout d'un chapitre sur les ajouts syntaxiques de Java 5.0, et mise jour des autres chapitres refltant ces nouveauts. Corrections de fautes de frappe et d'erreurs de texte. 18 Dcembre 2005 Version 1.2.3 : Remplacement dans le texte des expressions contrle d'accs et type de base par modificateur d'accs et type primitif plus communment utiliss. Ajout de remarques diverses. Mise jour de l'introduction Java pour reflter les versions rcentes disponibles du JDK. Corrections de fautes de frappe et d'erreurs de texte. 23 Juillet 2001 Version 1.2.2 : Modification de la navigation sur eteks.com et dans le manuel (suppression des frames et ajout de javascript pour faire apparatre le menu de navigation au survol du logo eTeks). Corrections de fautes de frappe, d'erreurs de texte et des liens page suivante / page prcdente. 15 Octobre 2000 Version 1.2.1 : Nouveau look inspir du look Aqua de Mac OS X. 13 Octobre 2000 Version 1.2 : Ajout de 5 chapitres traitant Java 3D : introduction, les objets 3D, les attributs d'apparence, l'clairage 3D et les animations 3D. Modification des paragraphes sur les packages et sur les classes d'erreurs. Remplacement dans le texte du mot variable de classe ou d'instance par le mot champ de classe ou d'instance, pour viter d'crire des aberrations comme variable constante ! Corrections de fautes de frappe et d'erreurs de texte. 11 Fvrier 2000 Version 1.1.1 : Corrections diverses de fautes de frappe et d'erreurs de texte.
Programmer en java Page 14

Dao Issiaka- 3me anne SI

07 Juillet 1999 Version 1.1 : Description complte des ajouts au noyau du langage Java dans Java 1.1 (classes internes,...). Ces descriptions sont faites essentiellement dans un nouveau chapitre, mais aussi dans les autres chapitres et notamment ceux sur la cration des classes et les tableaux. Description du fonctionnement des classes ImageProducer et ImageConsumer. Ajout de l'applet Compteur, utilisant un filtre d'image. Revue de la plupart du texte. Corrections de fautes de frappe et d'erreurs de texte. 10 Fvrier 1999 Version 1.0.1 : Pour permettre d'ajouter des fonctionnalits de Java 1.1 et Java 2, l'architecture du cours a chang. Aprs avoir pris en compte l'avis des internautes qui ont rpondu au sondage du mois de janvier 99, la solution retenue est celle-ci (75% des personnes qui ont rpondu) : Le manuel Java 1.0 reste tel quel, et une nouvelle branche Java 2 commencera "en parallle" partir de la description de la bibliothque (chapitre sur la bibliothque Java 1.0 et suivants). La seule partie commune restera la description du noyau du langage. Quand cela s'avrera intressant, des liens entre les parties Java 1.0 et Java 2 seront ajouts. Pour faciliter l'volution vers cette architecture, tous les chapitrexx.html ont t renomms pour ne plus tre li un numro de chapitre (dsol pour ceux qui avaient cr un lien vers ces chapitres), le package java.lang a son propre chapitre, les conventions d'criture et le portage de programmes C/C++ ont t rassembls dans le chapitre qui conclut la description du noyau du langage. Au passage, toutes les ancres utilises par les liens du site (ce qui suit le symbole # dans un tag <A HREF="file#anchor">), ont t vrifies et ventuellement corriges. Corrections de fautes de frappe. 17 Dcembre 1998 Version 1.0 : Dbut dcembre, JavaTeks est devenu eTeks et est hberg sur son propre serveur http://www.eteks.com/. Tout Java 1.0 (langage et classes) est dcrit. Description complte du package java.net. Ajout des programmes client serveur d'Echo et du Paper board Internet. Ajout d'une description dtaille de la procdure de compilation de l'applet HelloWorld, pour les dbutants en programmation. Corrections de fautes de frappe et d'erreurs de texte. 31 Octobre 1998 Version 0.9.4 : Ajout des applets CalculetteSimple et MessageBoxApplet. Description partielle du package java.net (Accs via une URL). Corrections de fautes de frappe et d'erreurs de texte (merci Arcmap). 24 Septembre 1998 Version 0.9.3 : Nouveau look "bleu mtal" du site : Nouveaux boutons de navigation, mise en place de frames avec un menu pour amliorer la navigation sur le site et allger la page d'accueil. Ajout d'une FAQ, d'un livre d'or et d'une liste de liens utiles plus complte.
Programmer en java Page 15

Dao Issiaka- 3me anne SI

Description complte du package java.io. Description plus dtaille des classes du package java.lang. Ajout d'un paragraphe "exemples" chacune des classes quand c'est possible. Chacun de ces paragraphes contient des liens vers les applets ou les applications du manuel o la classe est utilise. Dcoupage en deux du fichier HTML sur l'accs aux fichiers et au rseau (io10.html), dcalage des pages qui suivent. Corrections de fautes de frappe et d'erreurs de texte. 31 Mai 1998 Version 0.9.2 : Ajout d'une table des matires complte. Explication plus dtaille des constructeurs, des mthodes outrepasses, des classes abstract, avec un nouvel exemple d'application. Description partielle du package java.io (Principes gnraux et manipulation des fichiers). Ajout d'un paragraphe sur le remplacement de l'hritage multiple du C++ en Java. Modification de l'applet AfficheurDeCalcul . Ajout de l'applet d'animation Horloge. Corrections de fautes de frappe et d'erreurs de texte. 15 Mai 1998 Version 0.9.1 : Ajout de l'applet ImageNoirEtBlanc. Ajout des captures d'crans des applets pour permettre de visualiser une image la place de chaque applet si le navigateur n'utilise pas Java. Corrections de fautes de frappe et d'erreurs de texte. 08 Mai 1998 Ajout de balises <META ...> pour les moteurs de recherche et d'un formulaire de rponse sur le site. 06 Mai 1998 Version 0.9 : Premire version disponible sur Internet. Aprs un an de travail et de longues nuits souvent blanches, voil la version 0.9 de ce manuel : 0.9 comme 90% du boulot ralis. Reste dcrire plus en dtail les packages java.io et java.net.

Programmer en java

Page 16

Dao Issiaka- 3me anne SI

Dmarrer en Java
Rcuprer le JDK Installation Description de l'environnement et des commandes Votre premire applet : le classique "Hello world !"

Rcuprer le JDK (Java Development Kit) Introduction

Bonne nouvelle : jusqu' nouvel ordre, vous pouvez dvelopper en Java sans dbourser un Kopeck (ou presque : il vous faut quand mme un ordinateur si possible quip d'un modem...). Java est un langage de programmation dvelopp par Sun Microsystems. Aprs une douzaine d'annes de vie (les premires versions datent de 1995), c'est un des langages les plus utiliss travers le monde. En voici les principaux avantages :

C'est un langage orient objet driv du C, mais plus simple que le C++. Il est multi-plateforme : tous vos programmes tourneront sans modification sur toutes les plateformes o existe Java. Il est dot en standard d'une riche bibliothque de classes, comprenant la gestion des interfaces graphiques (fentres, boites de dialogue, contrles, menus, graphisme), la programmation multi-threads (multitches), la gestion des exceptions, les accs aux fichiers et au rseau (notamment Internet),...

Les deux derniers points ont contribu utiliser d'abord ce langage pour dvelopper des applets, qui sont des applications qui peuvent tre tlcharges via Internet et excutes dans un navigateur sur n'importe quelle plateforme. Ainsi, une page statique HTML peut s'enrichir de programmes qui lui donneront un comportement dynamique. Cet avantage permet de visualiser directement dans ce manuel le rsultat des programmes d'exemples.
O trouver le JDK

Venons-en aux faits. Le JDK permet de crer vos programmes Java. Il est disponible gratuitement sur le site Java de Sun http:/java.sun.com/. Vous cherchez sur ce site un lien Products / Java SE, qui vous amne sur une page dcrivant Java Standard Edition, une dnomination marketing reprsentant la version de base de Java. Java et son JDK (Java Development Kit) ou SDK (Software Development Kit) existent sous les 7 versions 1.0, 1.1, 1.2, 1.3, 1.4, 1.5 (ou 5.0), et 6 et la dnomination Java SE / J2SE regroupe les JDK de version >= 1.2. Vous pouvez tlcharger le JDK le plus rcent (au moins 50 Mo) partir du lien Download de la page dcrivant le Java SE, mais pour dbuter en Java,
Programmer en java Page 17

Dao Issiaka- 3me anne SI

vous pouvez aussi vous satisfaire d'une version antrieure du JDK. Sun met disposition sur son site des versions du JDK pour Windows, Linux et Solaris. Comme Mac OS X intgre Java SE avec le JDK, vous n'aurez rien installer sous ce systme. Pour Mac OS 9, seules les versions 1.0 et 1.1 de Java sont disponibles et se dnomment MRJ 1.5 et MRJ 2.2 respectivement. Pour les autres systmes, voyez avec le site de leur diteur. Les deux premires parties de ce tutorial dcrivent les fonctionnalits de la version 1.0 du JDK (avec deux chapitres sur les ajouts syntaxiques apports par le JDK 1.1 et le JDK 1.5). Bien que cette version commence dater, vous pourrez nanmoins :

Apprendre Java et utiliser sa bibliothque de base, sans tre noy par la quantit de fonctionnalits supplmentaires des versions suivantes (236 classes dans le JDK 1.0, 477 dans le JDK 1.1, 1492 dans le JDK 1.2). Tous les programmes que vous dvelopperez avec Java 1.0 continueront fonctionner avec les versions Java ultrieures. Bnficier d'une documentation complte en utilisant le manuel Du C/C++ Java (langage et bibliothque). Faire fonctionner vos applets sur presque tous les navigateurs (notamment Netscape Navigator et Microsoft Internet Explorer ds leur version 3).

Sur son site, Sun fournit aussi des documentations en anglais accompagnant le JDK. Voici la liste des plus intressantes, qui ont aid rdiger ce manuel :

L'ensemble des classes Java et leur interface de programmation sous forme de fichiers HTML visualiser avec un navigateur (trs utile pour avoir une rfrence complte des classes). Cet ensemble de fichiers est rassembl sous forme de fichier .tar , .zip ou .hqx et est accessible via API Documentation. Les personnes ne disposant pas d'application pour extraire les fichiers d'un fichier .zip ou .tar, peuvent se procurer sur toute plateforme (Windows, Mac OS ou UNIX) des freewares faisant parfaitement l'affaire. Les moteurs de recherche vous donneront des liens pour satisfaire votre bonheur. Les spcifications du langage au format Acrobat Reader, pour ceux qui recherchent des renseignements dtaills sur le langage et les bibliothques des classes de base de Java 1.0 (plus de 800 pages). Le fichier est accessible via Java Language Specification 1.0 ; les personnes ne disposant pas encore d'Adobe Acrobat Reader peuvent se procurer gratuitement cette application sur le site d'Adobe : http://www.adobe.com/. Un tutorial de Java trs complet, se dnommant The Java Tutorial - Object-Oriented Programming for the Internet, est disponible sous forme de fichiers HTML rassembls dans un fichier tutorial.zip. Voir aussi les liens utiles...

Bon courage pour tlcharger ces fichiers et tout l'heure... Voici une petite applet indiquant depuis combien de temps cette page est charge : dj secondes ! Le kit de dveloppement fourni par Sun est trs sommaire (un ensemble de commandes simples), il vous faudra en plus au moins un diteur de texte (n'importe lequel, peu importe). De nombreux diteurs de logiciels fournissent des environnements de dveloppement complet (diteur, debugger intgr,...), dont certains sont mme gratuits !

Programmer en java

Page 18

Dao Issiaka- 3me anne SI

Installation

Une fois que vous avez (au moins) tlcharg le JDK, vous pouvez vous mettre au travail.

Sous Windows 95/NT, vous rcuprez un programme d'installation qui vous installe toutes les commandes sans difficult. Sous UNIX, dsol, pas de machine UNIX sous la main... Il faudra lire attentivement la documentation d'installation mais si vous connaissez bien UNIX, ce sera un jeu d'enfant ! Sous Mac OS 9, vous rcuprez un fichier auto-extractible, qui vous installe directement les applications ncessaires.

Description de l'environnement et des commandes

Ce chapitre dcrit les principales commandes (ou applications pour Mac OS 9) qui vous permettront de programmer en Java. Mais tout d'abord il faut comprendre comment marche un programme Java pour utiliser correctement ces commandes.
Principe de fonctionnement

Rapidement rsum, Java est langage qui doit tre compil et interprt. Compil et interprt ? En fait dans une premire phase, vous compilez un programme (un ou plusieurs fichiers source .java) en fichiers .class et le compilateur gnre un fichier .class pour chacune des classes dfinies dans le(s) fichier(s) .java. L'ensemble des fichiers .class est ensuite interprt par la Machine Virtuelle Java (Java Virtual Machine) pour excuter le programme. Voici une illustration de ce principe :

Figure 1. Cycle de dveloppement d'une applet

Il est possible de dvelopper soit des applications isoles (standalone applications), fonctionnant avec l'interprteur comme un programme habituel, soit des "applets" ; ce sont des programmes tlchargs sur Internet puis excuts automatiquement quand ils sont intgrs l'intrieur de pages HTML. Dans ce dernier cas, l'ensemble des fichiers .class du programme est utilis avec un fichier HTML qui fait appel une des classes (voir aussi la Description des principales commandes). Bien que les principes de programmation soient trs proches, ce manuel donne surtout des
Programmer en java Page 19

Dao Issiaka- 3me anne SI

exemples d'applets car elles peuvent tre ainsi intgres dans le texte pour vous montrer le rsultat d'un programme "en direct". Pourquoi ne pas interprter directement le programme Java ?
1. Les fichiers .class contiennent du bytecode, une sorte de code machine Java (comparable au code machine d'un microprocesseur), qui sera excut beaucoup plus rapidement par l'interprteur que si ce dernier devait travailler avec les fichiers sources .java. 2. Seuls les fichiers .class sont ncessaires l'excution d'un programme Java. Comme ils contiennent du code machine, ils ne peuvent tre lus par des tiers, protgeant ainsi le code source. 3. Etant compils, les fichiers .class sont de taille plus petite que le code source Java ; ceci est un argument important pour transfrer les programmes sur Internet. 4. Chaque fichier .class dcrivant une classe d'objet, une mme classe peut tre utilis par diffrents programmes, sans que cette classe ne soit duplique dans chacun des programmes.

Pourquoi ne pas compiler directement un excutable ? Sur ce point, la rponse est plus vidente. En effet, un excutable contient du code qui n'est excutable que sur la machine pour lequel il est destin et le seul moyen de rendre un langage multi-plateforme sans avoir recompiler le source (comme en C/C++), c'est d'utiliser un interprteur. L'autre avantage de l'interprteur est qu'il peut tre incorpor par exemple, un navigateur ce qui lui permet d'excuter des programmes Java l'intrieur de pages HTML. Limites du systme : A vue d'oeil, ce systme a l'air d'tre parfait : Vous crivez des programmes, les compilez et le rsultat de la compilation fonctionnera en l'tat sur toutes les machines ! Forcment, il doit y avoir un os quelque part... Le plus gros problme d'un programme Java est son manque de rapidit d'excution : L'interprteur prend forcment un certain temps pour interprter le code des fichiers .class, ce qui rend vos programmes moins rapides que de vrais excutables. Mais Java est encore jeune : Sun Microsystems et d'autres diteurs de logiciels tentent d'optimiser les Machines Virtuelles Java. L'un des axes d'optimisation est actuellement le dveloppement de compilateurs JIT (Just In Time) ou juste temps : Quand une classe est charge, elle est traduite dans le code machine de la plateforme o elle est excute (traduction la vole du micro-code Java vers par exemple, le code machine PowerPC ou Intel). Cette opration ralentit le dpart de l'application, mais ensuite l'excution du programme est beaucoup plus rapide ! Contrairement au C/C++, le compilateur Java ne gnre pas de fichier excutable. Il cre pour chacune des classes d'un fichier Java un fichier .class qui sera interprt par la Machine Virtuelle Java.

Description des principales commandes du JDK

L'utilisation des commandes varie forcment suivant l'environnement de dveloppement :


Programmer en java Page 20

Dao Issiaka- 3me anne SI

Sous Windows 95/98/NT/XP, ouvrir une fentre de commandes ; puis, utiliser les commandes dcrites ci-aprs, en les tapant directement. Pour viter d'avoir dcrire le chemin d'accs complet aux commandes, il vous est vivement conseill de modifier la variable d'environnement PATH pour que soit pris en compte le rpertoire d'installation des commandes Java. Sous UNIX, utiliser la ligne de commandes comme sous Windows. Sous Mac OS X, utiliser la ligne de commandes propose par l'application Terminal dans le dossier Utilitaires. Sous Mac OS 9, soit vous effectuez sur l'icne de la commande un drag-and-drop (ou glisserdposer pour les francophiles purs) des fichiers passer en paramtres, soit vous utilisez le premier item du menu File pour choisir le fichier en question (Java Runner ouvre directement une boite de dialogue vous demandant de choisir la classe excuter).

Toutes les options de chacune de ces commandes peuvent tre obtenues en excutant la commande sans paramtre. javac, le compilateur (icne Java Compiler ou javac sous Mac OS 9) : javac permet de compiler un ou plusieurs fichiers Java pass en paramtres. Le compilateur gnre pour chaque classe ClasseI dfinie dans le(s) fichier(s) Java compil(s), un fichier ayant pour nom le nom de classe et l'extension .class (ClasseI.class). En cas d'erreurs dans vos programmes, le compilateur javac vous donne gnralement des informations assez prcises sur le contexte de l'erreur. C'est pourquoi n'hsitez pas compiler vos classes en cours de dveloppement quand vous hsitez sur la bonne syntaxe utiliser : javac vous donnera peut-tre la solution ! Principales options spcifier avant la liste des fichiers Java compiler (boite de dialogue File | Properties sous Mac OS 9) :
-classpath dir : dir spcifie un ou plusieurs rpertoires d'accs aux classes importes (spars par ; sous Windows, et : sous UNIX). -d dir : dir spcifie le rpertoire de destination des fichiers de classes .class.

La variable d'environnement CLASSPATH est utilise comme quivalent de l'option classpath. Exemple : javac Cube.java Si vous compilez certains programmes Java respectant la version 1.0 avec le compilateur d'une version ultrieure, vous pouvez avoir des warnings vous indiquant que certaines mthodes que vous utilisez ne sont pas recommands (deprecated), mais ceci n'empchera pas le programme de fonctionner correctement. Note aux utilisateurs de systmes dont les fichiers ne font pas la diffrence entre les minuscules et majuscules (Windows et Mac OS 9) : Vous devez crer et utiliser des fichiers utilisant les combinaisons majuscules/minuscules correctes ; par exemple, si vous crez une classe Cube3D, le nom de fichier doit tre Cube3D.java et pas cube3d.java ou Cube3d.java.
Programmer en java Page 21

Dao Issiaka- 3me anne SI

java, l'interprteur (Icne Java Runner ou JBindery sous Mac OS 9) : Cette commande est utilise pour excuter des applications isoles. Dans ce cas, le fichier .class pass en paramtre doit dfinir une mthode main () qui sera le point d'entre de l'application. Toutes les valeurs qui suivent le nom de la classe sont passes en paramtres la mthode main (). Principales options de la ligne de commande spcifier avant le nom de la classe (vous retrouverez ces options dans la boite de dialogue de JBindery sous Mac OS 9) :
-classpath dir : dir spcifie un ou plusieurs rpertoires d'accs aux classes importes (spars par ; sous Windows, et : sous UNIX). -Dpropriete=valeur : modifie la proprit du systme avec la valeur donne (voir aussi la classe System). -version : crit la version de la Machine Virtuelle que vous utilisez.

La variable d'environnement CLASSPATH est utilise comme quivalent de l'option classpath. Exemple : java ClasseExec appletviewer, l'interprteur d'applets (Icne Applet Viewer ou Applet Runner sous Mac OS 9) : cette commande est utilise pour excuter des applets. Dans ce cas, le fichier .html pass en argument doit dfinir au moins une balise (tag) APPLET respectant la syntaxe suivante :
<APPLET CODE=ClasseApplet WIDTH=largeur HEIGHT=hauteur CODEBASE="repertoire" ALT="Ca marche pas" NAME="NomApplet" ALIGN=alignement ARCHIVE="fichier.jar"> </APPLET>.

L'argument de CODE, ClasseApplet, doit correspondre un fichier .class qui est la classe de l'applet. Vous verrez dans le premier exemple comment dfinir une classe utilisable comme point d'entre d'une applet. WIDTH et HEIGHT dfinissent la largeur et la hauteur de la zone o sera affiche l'applet. CODEBASE (optionnel) permet de dfinir le chemin d'accs aux classes utilises par l'applet. Par dfaut le chemin d'accs est le rpertoire d'o provient le fichier HTML. Le chemin spcifi par CODEBASE peut tre relatif au rpertoire courant du fichier HTML, ou tre une URL dsignant un chemin sur un serveur diffrent. ALT (optionnel) dfinit la chane de caractres afficher quand l'applet ne peut tre excute (si par exemple, un navigateur n'autorise pas Java, il crira cette chane). NAME (optionnel) dfinit un nom pour l'applet (utilis quand vous recherchez une applet par son nom). ALIGN (optionnel) permet de dfinir l'alignement horizontal de l'applet dans la page HTML (LEFT, RIGHT ou MIDDLE). ARCHIVE (optionnel) est un attribut apparu partir de Java 1.1 pour dfinir le fichier JAR qui rassemble les classes, les images et autres fichiers qu'utilise l'applet.

appletviewer cre pour chaque balise APPLET, une fentre de taille (WIDTH,HEIGHT), o sera excute l'applet correspondant la classe de CODE. Entre <APPLET ...> et </APPLET> peuvent figurer la description d'un certain nombre de
Programmer en java Page 22

Dao Issiaka- 3me anne SI

paramtres passer l'applet, sous la forme <PARAM NAME="appletAttributei" VALUE="valuei">. Tout le reste du fichier HTML est ignor. Vous pouvez aussi excuter les applets d'un fichier HTML avec un navigateur intgrant un interprteur Java. Ceci vous est mme vivement conseill afin de pouvoir vrifier comment s'intgre vos applets au milieu du texte dans lequel elles sont utilises. Tout le code HTML compris entre les balises <APPLET ...> et </APPLET> (sauf bien sr les balises <PARAM ...>) est affiche par les navigateurs qui ne sont pas dots de Java ou sur lesquels Java n'est pas autoris. Ceci est trs pratique pour offrir une alternative aux applets sur un site Internet. Si vous consultez les source des fichiers de ce site, vous verrez que justement chaque applet du site a pour alternative l'affichage d'une image qui est la capture d'cran de l'applet. De nombreux exemples d'Applet avec leur programme Java, sont fournis avec le JDK. Essayez-les pour vous rendre compte des possibilits du langage. Si une applet dfinit la mthode main (), elle peut tre aussi utilise comme une application avec l'interprteur Java. Exemple : appletviewer index.html Sur la plupart des Machines Virtuelles Java, tant que vous ne quittez pas l'interprteur (java, appletviewer ou navigateur), les classes dj charges restent en mmoire, et NE sont PAS recharges quand vous relancez un mme programme Java. Ceci implique qu'en phase de mise au point de vos programmes, il faut quitter l'interprteur ou le navigateur chaque fois que vous changez une des classes de votre programme, sinon vous aurez l'impression que vos modifications n'ont pas t prises en compte !...
Votre premire applet : le classique "Hello world !"

Comme vous devez l'avoir compris maintenant, il faut crire crire au moins deux fichiers diffrents pour pouvoir crer et excuter une applet : Un fichier source Java et un fichier .html. Voici le programme source Java. Donnez lui le nom HelloWorld.java (le nom de la classe public du fichier) :
import java.applet.Applet; import java.awt.Graphics; public class HelloWorld extends Applet { public void paint (Graphics g) { g.drawString("Hello world !", 50, 20); } public static void main (String [ ] args) {
Programmer en java Page 23

Dao Issiaka- 3me anne SI

System.out.println ("Hello World !"); } }

Les instructions utilises dans ce programme seront dcrites ultrieurement. Vous pouvez le compiler de la manire suivante : javac HelloWorld.java Voici le source HMTL. Donnez lui le nom que vous voulez (MonPremierProgrammeJava.html si a vous chante !) :
<HTML> <HEAD> <TITLE> Un programme simple </TITLE> </HEAD> <BODY> voici le rsultat que vous devriez voir apparatre : <APPLET CODE="HelloWorld.class" WIDTH=150 HEIGHT=25> </APPLET> </BODY> </HTML>

Vous pouvez excuter l'applet de la manire suivante : appletviewer


MonPremierProgrammeEnJava.html

voici le rsultat que vous devriez voir apparatre : Comme HelloWorld dfinit aussi une mthode main (), qui est le point d'entre d'une application Java, il est donc possible de l'excuter directement grce la commande : java
HelloWorld

N'oubliez pas d'autoriser l'utilisation de Java dans votre navigateur, si vous voulez l'essayer pour interprter vos applets et visualiser le rsultat des applets de ce manuel. Pour les dbutants, qui n'ont que de faibles notions de programmation (ou qui ne savent pas comment modifier le PATH sous Windows), voici une procdure plus dtaille pour raliser cette applet :
Windows 95/98/NT

Mac OS 9

Ouvrez un nouveau document avec notepad.exe. Recopiez le programme source Java HelloWorld dcrit ci-dessus dans ce document (en faisant attention aux majuscules / minuscules). Enregistrez ce document dans un fichier HelloWorld.java (Attention toujours aux majuscules / minuscules, c'est important) : Enregistrez-le dans le mme rpertoire que le programme javac.exe ; javac.exe doit se trouver dans un rpertoire du

Ouvrez un nouveau document avec SimpleText. Recopiez le programme source Java HelloWorld dcrit ci-dessus dans ce document (en faisant attention aux majuscules / minuscules). Enregistrez ce document dans un fichier HelloWorld.java (Attention toujours aux majuscules / minuscules, c'est important). Le dossier o vous enregistrez vos programmes importent peu. Ouvrez un autre document avec
Page 24

Programmer en java

Dao Issiaka- 3me anne SI

style c:\jdk...\bin. Vrifiez qu' l'enregistrement notepad n'a pas ajout une extension .txt au fichier ; si c'est le cas, renommez-le pour que ce soit exactement HelloWorld.java Ouvrez un autre document avec notepad.exe. Recopiez le source HTML de HelloWorld dcrit ci-dessus dans ce document. Enregistrez ce document dans un fichier HelloWorld.html dans le mme rpertoire que celui o vous avez mis HelloWorld.java. Ouvrez une fentre de commandes MS/DOS. Avec la commande CD, allez dans le rpertoire de javac.exe (cd c:\jdk...\bin). Tapez ensuite javac HelloWorld.java pour compiler le programme. S'il y une erreur, c'est que vous n'avez pas recopi exactement le programme HelloWorld l'identique. Corrigez-le, enregistrez-le, et refaites javac HelloWorld.java, jusqu' ce qu'il n'y ait plus d'erreur. Tapez finalement appletviewer HelloWorld.html. Normalement une fentre s'ouvre affichant le texte "Hello world !", comme le montre l'applet cidessus. C'est tout. Pour faire d'autres programmes, c'est toujours la mme procdure : Reprenez un programme Java et crez un fichier HTML appelant l'applet grce la balise <APPLET ...>, compilez-le avec javac et excutez-le avec appletviewer suivi du nom du fichier HTML.

SimpleText. Recopiez le source HTML de HelloWorld dcrit ci-dessus dans ce document. Enregistrez ce document dans un fichier HelloWorld.html dans le mme dossier que celui o vous avez mis HelloWorld.java. Faites ensuite un drag-and-drop du fichier HelloWorld.java sur l'icne Java Compiler (si vous utilisez le JDK de Sun) ou l'icne javac (si vous utilisez MRJ 2.x), pour compiler le programme. S'il y une erreur, c'est que vous n'avez pas recopi exactement le programme HelloWorld l'identique. Corrigez-le, enregistrez-le, et refaites la procdure prcdente, jusqu' ce qu'il n'y ait plus d'erreur. Faites ensuite un drag-and-drop du fichier HelloWorld.html sur l'icne Applet Viewer (si vous utilisez le JDK de Sun) ou l'icne Applet Runner (si vous utilisez MRJ 2.x). Normalement une fentre s'ouvre affichant le texte "Hello world !", comme le montre l'applet ci-dessus. C'est tout. Pour faire d'autres programmes, c'est toujours la mme procdure : reprenez un programme Java et crez un fichier HTML appelant l'applet grce la balise <APPLET ...>, compilez-le et excutez-le avec Applet Viewer ou Applet Runner.

Enregistrer vos programmes dans le rpertoire o se trouve javac.exe n'est pas la solution idale pour organiser le rangement de vos programmes, mais vous vite d'avoir changer la variable d'environnement PATH.

Une fois que vous commencez comprendre comment marche un programme Java, vous
Programmer en java Page 25

Dao Issiaka- 3me anne SI

pouvez en modifier un existant ou en crer de compltement nouveaux, et vous pourrez considrer que vous savez programmer en Java. Bonne chance...

Programmer en java

Page 26

Dao Issiaka- 3me anne SI

Les notions de base


Objets, classes et hritage Rfrences Les mots-cls de Java Types primitifs Structure d'un programme Les packages

Objets, classes et hritage

Qu'entend on par langage objet, ou plus exactement langage orient objet ? Le propos qui suit, n'est que la nime rponse, qui compltera une littrature dj vaste sur le sujet. Cette explication rapide vous permettra de vous rappeler le vocabulaire couramment utilis en programmation oriente objet. L'exemple donn dcrit un cas typique de programmation (gestion de compte en banque), plus parlant que des cas qui peuvent paratre plus abstraits (les catgories de voitures, les espces animales, etc...). Le meilleur moyen d'expliquer la programmation objet passe en effet par l'exemple, car elle essaye de s'appuyer sur l'habitude qu'a l'homme, de classer les objets du monde qui l'entourent en catgories, sous-catgories, et ainsi de suite... Il faut faire la diffrence entre la programmation objet et un langage objet : Un langage objet tel que Java, Small Talk ou C++, est le moyen le plus ais et le plus rapide de "programmer objet", mais la programmation objet est plus un style de programmation que peut respecter un programme crit en C ou en PASCAL (plus difficilement tout de mme !). Mettons-nous donc la place d'une banque : elle a des comptes grer, le votre, le mien et des milliers d'autres. Tous ces comptes ont en commun un certain nombre de caractristiques communes que vous retrouvez sur votre relev : un numro et un solde, au minimum (mme pas forcment une identit pour certains comptes). Le banquier va donc crer un modle de relev avec les cases Numro et Solde. L'imprimeur va en tirer des centaines d'exemplaires pour que le banquier puisse les remplir avec les informations de ses clients. Le banquier gre aussi des comptes qui comportent d'autres informations dont il veut garder la trace. Il n'a pas besoin de crer un modle entirement nouveau : partir de son premier modle, il cre d'autres modles de relevs : un pour les comptes de dpts o il ajoute n cases Opration, un autre pour les comptes d'pargne o il ajoute une case Taux d'intrts :

Figure 2. Des objets "relevs de compte"

Programmer en java

Page 27

Dao Issiaka- 3me anne SI

Notre banquier dcide de s'informatiser, et engage un informaticien expert dans la technologie magique dont il entend parler dans tous les journaux : "les technologies objets". Celui-ci lui explique sa dmarche : "Pour un informaticien, chaque relev que vous imprimez est un objet, chaque modle que vous avez cr est une classe, et le premier modle que vous avez cr est une classe dont les modles suivants ont hrit. Les cases Numro, Solde, Opration, Taux d'Intrt sont des champs qui permettent de mmoriser l'tat courant d'un compte et le solde se calcule grce une mthode". Mais le banquier, pas dupe, lui rpond : "Je ne veux pas vous acheter un dictionnaire !... Tout a ne sont que de nouveaux mots. Quelle est la vraie diffrence avec d'autres technologies classiques et prouves ?". Ae, ae, expliquer la diffrence sans terme trop technique et fumeux ?!? "Une classe est une entit qui forme un tout : chaque objet qui est une instance (dsol encore un nouveau mot !) d'une classe comporte un ensemble de champs qui dcrivent son tat ET un ensemble de mthodes qui permettent de le modifier : on appelle ceci l'encapsulation. L'hritage vous permet de crer de nouvelles classes drives d'anciennes dont elle garde ou modifie les caractristiques, sans que vous ayez retoucher vos anciennes classes. Convaincu ?" (Esprons-le...) Les liens d'hritage dfinis entre les diffrentes classes d'un modle dfinissent un graphe d'hritage ou une hirarchie de classes :

Figure 3. Graphe d'hritage


CompteDepot est une classe drive de Compte. Compte est la "super classe" de CompteEpargne et CompteDepot, et CompteEpargne est la super classe de PEL.

L'application

Banque dcrite au chapitre suivant s'inspire du modle dcrit ici. La diffrence principale entre une structure C et une classe est vidente : on ne peut pas dclarer des mthodes (ou des fonctions) l'intrieur du corps d'une structure C. A l'oppos, Java ne permet pas de dclarer de mthodes en dehors du corps d'une classe. Une classe peut comporter uniquement des champs sans mthodes ; elle peut aussi n'avoir que des mthodes sans dclarer de champ. L'hritage est diffrent de la composition : en C, vous pouvez crer une structure Compte et une structure CompteEpargne, utilisant la premire :
typedef struct { int numero;
Programmer en java Page 28

Dao Issiaka- 3me anne SI

float solde; } Compte; typedef struct { Compte compte; float tauxInterets; } CompteEpargne; ... CompteEpargne unCompte; unCompte.compte.numero = 1; /* Pour accder au numero vous passez par le champ */ /* compte de CompteEpargne */

En Java, vous pouvez utilisez la composition comme en C. Par contre, grce l'hritage, tous les champs et mthodes hrits sont accessibles directement comme s'ils avaient t dclars par la classe drive elle-mme. De toute faon, ne confondez pas l'hritage et la composition : Bien que l'hritage soit une caractristique d'un langage objet, il ne faut pas se prcipiter pour l'utiliser. Vous utiliserez srement bien plus souvent la composition (en crant des classes qui sont l'assemblage de diffrents composants) et part pour les classes d'applets, la plupart de vos premires classes n'hriteront pas d'autres classes. Pour vous en convaincre, vous n'avez qu' tudier la hirarchie des classes de la bibliothque Java, et vous verrez que la plupart des classes n'hritent pas les unes des autres. L'hritage sert le plus souvent quand on veut modifier le comportement par dfaut de classes existantes (par exemple, modifier le comportement de la classe Applet), ou quand vous avez besoin d'ajouter des fonctionnalits une classe existante et que vous ne voulez pas modifier celle-ci parce qu'elle est dj utilise (par exemple, le compteur de temps drive d'un afficheur digital statique).
Rfrences

La notion de rfrence est fondamentale en Java. La diffrence avec la notion de pointeur en C est faible, mais essentielle : Les variables (champs, paramtres ou variables locales) en Java sont soit d'un type primitif (byte, short, int, long, float, double, char ou boolean), soit des rfrences dsignant des objets. Comme les pointeurs en C, ces rfrences sont comparables des adresses mmoires permettant de dsigner un objet allou dynamiquement. Un mme objet peut tre rfrenc par plusieurs variables un moment donn. Par contre, la comparaison s'arrte ici : en effet, en C un pointeur peut dsigner un type primitif (int* par exemple), ou un autre pointeur (char** par exemple). Java lui, ne permet pas de dclarer une variable qui serait une rfrence sur un type primitif ou une rfrence sur une autre rfrence. Tout objet ne peut tre cr que dynamiquement grce l'oprateur new : ClasseObjet unObjet; ne cre aucun objet en Java mais une rfrence sur un objet de classe ClasseObjet. La notion de pointeur du C est remplace par la notion de rfrence en Java, proche de celle du C++ mais limite aux variables dsignant des objets allous dynamiquement. En C/C++, on utilise souvent une convention d'criture pour les noms de variables
Programmer en java Page 29

Dao Issiaka- 3me anne SI

permettant de distinguer les variables qui sont des pointeurs et celles qui n'en sont pas,... comme par exemple :
struct Point { int x, y; }; struct Point point1, et n'est pas un pointeur *ptrPoint2; int entier, type primitif int *ptrEntier; // point1 est une variable de type Point // ptrPoint2 est un pointeur sur Point // entier est une variable entire du // ptrEntier est un pointeur sur int

Comme en Java il n'est possible de dclarer que des rfrences comparables ptrPoint2 ou des variables d'un type primitif comparables entier, il n'est pas utile d'utiliser un qualificatif dans le nom des variables qui permet de rappeler qu'une variable est une rfrence. En gnral, on crit directement point2.

Il ne faut pas voir la notion de rfrence comme une limitation de Java par rapport au C, mais plutt comme une simplification de la programmation : La seule chose rellement perdue est l'arithmtique de pointeurs du C, par contre le gain en scurit d'accs la mmoire est important, car une rfrence ne peut avoir pour valeur que null ou l'adresse valide d'un objet. Les oprateurs * et & n'existent pas en Java. Le seul oprateur d'accs aux champs et aux mthodes d'un objet est le point (.), et les oprateurs -> et :: du C++ sont absents. Tout ceci simplifie grandement la manipulation des adresses.

La cration d'objet et leur manipulation sont dcrites au chapitre traitant de la cration des classes.
Les mots-cls de Java
abstract default if boolean break byte case catch char class const do double else private throw throws transient try void volatile while

implements protected import public

instanceof return short static super switch synchronized this

extends int final interface

finally long float for native new package

continue goto

Programmer en java

Page 30

Dao Issiaka- 3me anne SI

Les liens dfinis dans le tableau indiquent les endroits o sont utiliss le mot-cl pour la premire fois. Java 1.4 a introduit le mot cl assert, et Java 5.0 le mot cl enum. et const sont des mots-cls qui sont rservs mais non utiliss par Java ; ils permettent notamment au compilateur de vrifier qu'en cas de portage d'un programme crit en C vers Java, des mots-cls du C n'ont pas t oublis... null est une valeur utilise pour les rfrences inconnues et qui ne dsignent aucun objet. Il ne s'crit pas en majuscules comme en C.
goto

Les mots-cls du C/C++ absent en Java


auto #define delete enum extern friend inline register typedef sizeof struct union unsigned

(sauf Java 5.0) operator template virtual

Les liens dfinis dans le tableau dsignent les endroits o il est trait de la disparition de ces mots-cls.
Types primitifs

TYPE

DESCRIPTION

VALEUR PAR DEFAUT


0 0 0

byte short int

Entier sign occupant 8 bits (valeurs de -128 127) Entier sign occupant 16 bits (valeurs de -32768 32767) Entier sign occupant 32 bits (valeurs de -2147483648 2147483647) Le type int occupe toujours la mme taille en Java : 32 bits.

long

Entier sign occupant 64 bits (valeurs de -9223372036854775808 0L 9223372036854775807) Le type long occupe 64 bits en Java contrairement 32 bits en C.

float double char

Nombre virgule flottante occupant 32 bits (norme IEEE 754) Nombre virgule flottante occupant 64 bits (norme IEEE 754) Caractre Unicode occupant 16 bits (valeurs littrales de

0.0f 0.0d '\u0000'

Programmer en java

Page 31

Dao Issiaka- 3me anne SI

'\u0000' aprs \u).

'\uffff' avec 4 chiffres hexadcimaux obligatoires

Les 128 premiers caractres sont les codes ASCII et se notent comme en C, entre '' ('a', '1',...). Voici la liste des caractres compris entre '\u0080' et '\u00ff', qui contient notamment les caractres accentus franais :

Mfiez-vous car la plupart des diteurs de texte ne gnrent pas la compilation la bonne valeur Unicode pour ces caractres. Utilisez alors les valeurs hexadcimales ('\u00e9' au lieu de '' par exemple). Le type char occupe 16 bits en Java contrairement 8 bits en C. Utilisez byte pour une valeur sur 8 bits. Les valeurs littrales des caractres spciaux sont les mmes : '\n' pour un saut de ligne, '\t' pour une tabulation, '\'' pour le caractre ', '\"' pour le caractre ", '\\' pour le caractre \,...
boolean

Boolen dont la valeur est true ou false (vrai ou faux). Le type boolean n'existe pas en C. En Java, il est obligatoire dans certaines expressions (if (...) par exemple).

false

Les variables de type float et double peuvent prendre aussi des valeurs correspondant l'infini positif ou ngatif, ou reprsentant une valeur non significative. Voir les classes Float et Double. Les valeurs littrales entires (byte, short, int et long) peuvent se noter de trois faons :

Comme une suite de chiffres dcimaux : 3443, -123,... Comme une suite de chiffres hexadcimaux (base 16) prcde de 0x : 0xFF, 0X12ab,... Comme une suite de chiffres octaux (base 8) prcde de 0 : 0123, 056,...

Le modificateur unsigned du C n'existe pas en Java, o tous les types entiers sont signs. Comme en C, les entiers peuvent prendre pour valeur des littraux nots sous forme dcimale (i=10) , hexadcimale (i=0x0A) ou octale (i=012).

Chacun des types primitifs Java occupe toujours la mme place mmoire quelque soit la plateforme d'excution. La taille d'un entier de type int est toujours de 32 bits (ou 4 octets). Les oprateurs qui s'appliquent chacun des types primitifs sont tudis au chapitre sur les instructions et les oprateurs. Une valeur littrale d'un nombre virgule flottante sans l'extension f ou d, comme
Programmer en java Page 32

Dao Issiaka- 3me anne SI

par exemple 10.2 est considre de type double.


Structure d'un programme

La structure d'un programme Java est plus simple qu'en C. Chaque fichier qui le compose, se divise en trois parties (optionnelles) :
/* Dbut du fichier NouvelleClasse.java */ /* 1. Une ventuelle dclaration de package */ package nomPackage; /* 2. Zro ou plusieurs import import nomClasse; import nomPackage.nomClasse; import nomPackage.*; */ // Importer une classe sans package // Importer une classe d'un package // Importer toutes les classes d'un package

/* 3. Dclarations des classes et des interfaces du fichier */ // Une seule classe ou interface dclare public class NouvelleClasse public, { // qui porte le mme nom que le fichier // Corps de NouvelleClasse } class NouvelleClasse2 { // Corps de NouvelleClasse2 } interface NouvelleInterface { // Corps de NouvelleInterface } // ... /* Fin du fichier NouvelleClasse.java */

Les packages sont comparables des sous-rpertoires et sont traits au paragraphe suivant. Les classes d'un mme package peuvent s'utiliser mutuellement sans avoir utiliser une clause import : Si, par exemple, vous crez deux fichiers Classe1.java et Classe2.java dclarant respectivement les classes Classe1 et Classe2, vous pouvez utiliser directement Classe2 dans le fichier Classe1.java. Les commentaires s'crivent de la mme manire en Java qu'en C++ :

Tout ce qui suit // est ignor jusqu' la fin de la ligne. Tout ce qui est compris entre /* et */ est ignor. Ces commentaires peuvent incorporer des commentaires crits avec la syntaxe prcdente //, mais pas d'autres commentaires avec la syntaxe /* */. Il est conseill d'utiliser d'abord les commentaires avec // pour permettre d'imbriquer ce type de commentaire, dans ceux utilisant /* */ au cas o vous ayez de besoin de commenter tout un bloc. Par exemple :
class Classe1

Programmer en java

Page 33

Dao Issiaka- 3me anne SI

{ /* Bloc inutilis int x = 1; // x sert ... */ // ... }

Il existe un troisime type de commentaire utilisant la syntaxe prcdente : Les commentaires javadoc. javadoc est une commande qui utilise tous les commentaires compris entre /** et */ et respectant une syntaxe spciale pour gnrer automatiquement une documentation des classes. Toute la documentation des classes fournie par Javasoft est cre grce cet outil.

Java est un langage "pur" objet et ne permet de dfinir au niveau global qu'UNIQUEMENT des classes ou des interfaces : Pas de constantes, ni de macros (#define du C), pas de variables globales qu'elles soient statiques ou non, pas de types autres que des classes (typedef est inutile), et toutes les fonctions ne peuvent tre dclares que comme mthodes appartenant une classe. C'est la raison pour laquelle vous verrez que tous les exemples donns dclarent des classes qui sont souvent inutiles pour expliciter tel ou tel problme, mais obligatoires pour que l'exemple puisse tre compil.
Les packages
import

Les classes fournies avec le Java Development Kit ou par d'autres sources sont ranges dans des packages (ou paquets si vous prfrez), comparables des groupes rassemblant les classes par thme. Dans un fichier .java, vous devez indiquer quels packages appartiennent les classes que vous utilisez. La clause import permet de spcifier ces packages pour chacune des classes ou pour chaque groupe de classes. Ces clauses se placent en dbut de fichier avant la dclaration de la premire classe ou interface du fichier :
import nomClasse; // Importer une classe sans package import nomPackage.nomClasse; // Importer une classe d'un package import nomPackage.*; // Importer toutes les classes d'un package

est suivi soit directement du nom d'une classe, soit du nom d'un package, suivi luimme du nom d'une classe ou d'un astrisque (*). L'astrisque permet d'importer les classes d'un package la demande, c'est--dire que quand le compilateur recherchera une classe Classe1 qu'il ne connat pas encore, il cherchera notamment dans les packages suivis d'un astrisque si Classe1 existe. La classe nomClasse peut correspondre soit un fichier source nomClasse.java, soit un fichier compil nomClasse.class, dans lequel est dfinie la classe public importer. Un package reprsente une arborescence indiquant au compilateur quel chemin il faut emprunter pour retrouver la classe. Par exemple, si le package est java.util, il va effectuer sa recherche dans le rpertoire java/util (ou java\util sous Windows). Mais o est ce rpertoire java/util ? Vous ne trouverez srement pas sur votre disque dur de rpertoire java la racine, et non plus dans le rpertoire courant o vous crivez vos programmes... Comme la plupart des langages, le compilateur Java utilise une variable systme
import
Programmer en java Page 34

Dao Issiaka- 3me anne SI

d'environnement indiquant l'ensemble des chemins prdfinis utiliser avec un package pour construire le chemin complet d'accs aux classes : Sous UNIX et Windows, cette variable s'appelle CLASSPATH. Vous pouvez aussi utiliser l'option -classpath avec les commandes javac et java, pour spcifier ce chemin. Vous pouvez modifier cette variable pour y ajouter le chemin d'accs d'autres bibliothques Java ou vos propres packages, que vous crerez (les environnements de dveloppement plus complets permettent d'ajouter ces chemins plus simplement). Le chemin correspondant un package est donc un chemin relatif construit partir du rpertoire courant de compilation ou aux chemins cits dans la variable d'environnement CLASSPATH.
import

est optionnel dans les cas suivants :


Quand vous voulez utiliser dans un fichier UneClasse.java des classes dfinies dans des fichiers situs dans le mme package que celui de UneClasse.java : toutes les classes public ou non d'un mme package / rpertoire peuvent s'invoquer entre elles. Quand vous utilisez une classe du package java.lang : La clause import java.lang.*; est implicite chaque compilation. Quand vous crivez le nom d'une classe en la prcdant de son package complet chaque utilisation de celle-ci, par exemple en crivant java.util.Date pour la classe Date du package java.util.

Pour utiliser une classe nomClasse d'un package nomPackage, vous avez donc le choix entre ces trois options :
1. Utiliser import nomPackage.nomClasse; au dbut du fichier et crire nomClasse ensuite. 2. Utiliser import nomPackage.*; au dbut du fichier et crire nomClasse ensuite. 3. Ecrire nomPackage.nomClasse chaque fois que vous voulez utiliser la classe nomClasse.

En rassemblant les classes par groupes, les packages permettent d'organiser l'ensemble des classes et d'viter d'ventuels conflits sur les noms des classes. En effet, si deux classes appartenant deux packages distincts portent le mme nom, il est toujours possible de les utiliser ensemble dans un mme fichier .java, en les diffrenciant avec leur nom du package grce la troisime option . Par exemple, la bibliothque de Java 1.0 dclare la classe List dans le package java.awt, qui reprsente un composant graphique de liste. Dans Java 2, une autre classe List a t ajoute mais elle appartient au package java.util. Cette classe permet de traiter un ensemble d'objets organis sous forme de liste, et il est logique qu'elle porte ce nom. Si jamais vous avez besoin de ces deux classes dans un mme fichier .java, il faut les utiliser sous la forme java.awt.List et java.util.List, ce qui permet de les diffrencier. Comme les diffrents fournisseurs mettent disposition leurs classes sous leurs propres packages, vous pouvez ainsi utiliser n'importe laquelle de leurs classes et crer des classes utilisant des noms existants dans vos propres packages, sans risque de conflits.

Programmer en java

Page 35

Dao Issiaka- 3me anne SI

Si un package nomPackage comporte des sous-packages (par exemple nomPackage.sousPackage), la clause import nomPackage.* n'importe pas ces sous-packages. Il faut explicitement importer chacun d'eux (avec par exemple import nomPackage.sousPackage.*). Les clauses import permettant d'numrer la liste des packages auxquels appartiennent les classes utilises dans un fichier .java, vitent de rpter le nom du package d'une classe chaque utilisation de celle-ci. Mais il est tout fait possible de ne spcifier aucun import et d'crire chaque classe avec son package.

L'quivalent de #include est plus ou moins import. Java ne requiert pas de dclaration externe via un fichier header .h ; les fichiers .java ou .class sont suffisants au compilateur pour rsoudre les rfrences aux types externes. Le mot-cl extern est inutile en Java. import permet d'importer les classes dfinies dans d'autres packages (rpertoires), mais n'est pas obligatoire pour importer entre elles les classes dfinies dans un mme package, et notamment le package (rpertoire) courant de dveloppement. Toutes les classes que vous importez explicitement ou implicitement (parce qu'elles sont du mme package ou qu'elles sont du package java.lang), sont charges dynamiquement une une l'excution d'un programme Java, la premire fois qu'elles sont utilises. Comme il est dcrit au premier chapitre, les liens ne sont donc pas statiques comme en C, o le link rassemble dans un fichier excutable tous les composants dont un programme a besoin pour fonctionner. Chaque classe est mmorise dans un fichier .class qui peut tre compar une (petite) librairie dynamique (ou DLL Dynamic Link Library).
Dfinir un package

permet d'importer n'importe quelle classe d'une bibliothque, mais vous pouvez aussi crer votre propre bibliothque, pour y rassembler par exemple un groupe de classes utilises comme outils dans un ou plusieurs projets. Ceci se fait trs simplement grce la clause package. Si cette clause est utilise, elle doit tre dfinie en tte d'un fichier .java, comme suit :
import package nomPackage;

Comme expliqu prcdemment, le nom de package doit correspondre au chemin d'accs la classe qui utilise la clause package. En gnral, une socit qui s'appelle nomSociete utilise com.nomsociete comme base pour le nom des packages des produits Java qu'elle livre, par exemple com.nomsociete.produitxxx pour le produit produitxxx. Les classes de ce package devront tre enregistres dans le sous-rpertoire com/nomsociete/produitxxx. Si dans ce sous-rpertoire, vous crez une classe public Outil1 dans le fichier Outil1.java, chacune des classes dsirant utiliser la classe Outil1, devra inclure la clause import com.nomsociete.produitXXX.Outil1; et le fichier Outil1.java devra dfinir la clause package com.nomsociete.produitxxx;.
Programmer en java Page 36

Dao Issiaka- 3me anne SI

La figure symbolisant les modificateurs d'accs des classes reprsente aussi un exemple simple d'utilisation des packages. La plupart des exemples fournis dans ce manuel n'utilisent pas de package pour simplifier les programmes.

Programmer en java

Page 37

Dao Issiaka- 3me anne SI

Cration et utilisation des classes


Dclaration des classes et des interfaces Dclaration des champs Dclaration des mthodes Cration d'objets : oprateur new Outrepasser une mthode Destruction des objets

Dclaration des classes et des interfaces

Les seuls types que le programmeur peut dfinir en Java sont des classes ou des interfaces. Donc, les mots-cls struct et union n'existent pas en Java. Les numrations enum disponibles partir de Java 5.0, sont en fait des catgories de classes spciales. De plus, l'quivalent des template n'existe que depuis Java 5.0 aussi.
Identifiants

Les identifiants que vous crez en Java (classes, interfaces, champs, mthodes, paramtres, variables locales,...) peuvent tre n'importe quelle suite illimite de lettres ou de chiffres Unicode, de caractres _ ou $. Seul le premier caractre ne doit pas tre un chiffre. Ils doivent bien sr tre diffrents des mots-cls Java. Par consquent, il est possible d'utiliser des caractres accentues pour une meilleure lisibilit de vos programmes. Les identifiants sont cods comme en C/C++, mais en Java vous pouvez utilisez en plus toutes les lettres et tous les chiffres Unicode et le caractre $. Comme en C, le compilateur fait la nuance entre les minuscules et les majuscules.

Vous pouvez crer des identifiants avec des lettres accentues, ce qui n'est pas conseill car la plupart des diteurs de texte et des systmes fonctionnant en ligne de commande (comme MS/DOS ou UNIX) n'utilisent pas Unicode pour les lettres accentues (qui ne sont pas ASCII).
Les classes

La dclaration d'une classe peut prendre une des formes suivantes :


// Dclararation d'une classe simple ModificateurDeClasse class NomDeClasse
Programmer en java Page 38

Dao Issiaka- 3me anne SI

{ // Corps de NomDeClasse : // Dclaration des champs, des mthodes, des constructeurs // et/ou initialisations static } // Dclaration d'une classe drivant d'une super classe ModificateurDeClasse class NomDeClasseDerivee extends NomDeSuperClasse { // Corps de NomDeClasseDerivee : // Dclaration des champs, des mthodes, des constructeurs // et/ou initialisations static } // Dclaration d'une classe implmentant une interface ModificateurDeClasse class NomDeClasse2 implements NomInterface //, NomInterface2, ... { // Corps de NomDeClasse2 : // Dclaration des champs, des mthodes, des constructeurs // et/ou initialisations static // et implmentation des mthodes de nomInterface } // Dclaration d'une classe drivant d'une super classe et implmentant une interface ModificateurDeClasse class NomDeClasse3 extends NomDeSuperClasse implements NomInterface //, NomInterface2, ... { // Corps de NomDeClasse3 : // Dclaration des champs, des mthodes, des constructeurs // et/ou initialisations static // et implmentation des mthodes de nomInterface }

Le corps d'une classe est une suite quelconque de dclaration de champs, de mthodes, de constructeurs et/ou d'initialisations static. A partir de Java 1.1, le corps d'une classe peut aussi dclarer des classes internes, des interfaces internes et des initialisations d'instance. Une classe simple drive implicitement de la classe Object (class nomDeClasse est quivalent class nomDeClasse extends Object). Java ne permet pas l'hritage multiple (une seule classe peut suivre la clause extends), mais une classe peut implmenter plusieurs interfaces.
ModificateurDeClasse

est optionnel et peut prendre une ou plusieurs des valeurs suivantes :

public : Une seule classe ou interface peut tre dclare public par fichier source .java. Par convention, le fichier porte le nom de la classe dclare public. Si d'autres classes (non public) sont dclares dans un fichier Classe1.java, elles ne peuvent tre utiliss que dans les fichiers qui appartiennent au mme package que Classe1.java. final : Une classe dclare final ne peut tre drive et ne peut donc jamais suivre la clause extends. Cette clause peut tre utile quand vous considrez qu'une classe ne doit

pas ou n'a pas besoin d'tre drive. abstract : Il est impossible de crer une instance d'une classe dclare abstract. Cette catgorie de classe peut comporter une ou plusieurs mthodes dclares abstract. Par contre, si une classe comporte une mthode abstract, elle doit tre tre dclare
Page 39

Programmer en java

Dao Issiaka- 3me anne SI

abstract.

A quoi sert une classe abstract si on ne peut crer aucun objet de cette classe ? Ce type de classe est utilis pour fournir des mthodes et des champs communs toutes les classes qui en drivent. L'intrt des classes abstract est dmontre plus loin dans ce chapitre. Une classe ne peut tre dclare abstract et final (elle ne servirait rien puisqu'il serait impossible de crer des classes drives de celle-ci).

figure 4. Symbolisation des modificateurs d'accs aux classes

Contrairement au C++, le point-virgule en fin de dclaration d'une classe est optionnel. En Java, on utilise la clause extends pour prciser la super classe d'une classe drive, la place des deux points qui suivent la dclaration d'une classe en C++. L'hritage se fait systmatiquement de manire public en Java. Il n'existe pas d'quivalence la dclaration C++ : class Classe2 : private Classe1 { /* ... */ }. Une classe abstraite doit tre dclare abstract en Java et peut contenir aucune ou plusieurs mthodes abstract (quivalent des mthodes virtuelles pures du C++). Les modificateurs d'accs de classe public et final n'ont pas d'quivalent en C++. En Java une classe et tout ce qu'elle contient devant tre dclare entirement dans un seul fichier, il n'est pas possible comme en C++ de rpartir les mthodes d'une mme classe sur plusieurs fichiers.
Les interfaces

Une interface est une catgorie un peu spciale de classe abstract, dont le corps ne contient que la dclaration de constantes et de mthodes abstract :
// Dclararation d'une interface simple ModificateurInterface interface NomInterface { // Corps de NomInterface : // Dclaration des constantes et des mthodes non implmentes }
Programmer en java Page 40

Dao Issiaka- 3me anne SI

// Dclaration d'une interface drivant d'une super interface ModificateurInterface interface NomInterfaceDerivee extends NomSuperInterface //, NomSuperInterface2, ... { // Corps de NomInterfaceDerivee : // Dclaration des constantes et des mthodes non implmentes }

A partir de Java 1.1, le corps d'une interface peut aussi dclarer des classes internes et des interfaces internes. II est impossible de crer une instance d'une interface. Une ou plusieurs interfaces peuvent suivre la clause extends. Une classe non abstract, qui implmente une interface Interface1 doit implmenter le code de chacune des mthodes de Interface1. L'implmentation d'une mthode est l'ensemble des instructions que doit excuter une mthode. ModificateurInterface est optionnel et peut prendre une ou plusieurs des valeurs suivantes :
public : Une seule interface ou classe peut tre dclare public par fichier source. Par convention, le fichier porte le nom de l'interface dclare public. Si d'autres interfaces (non public) sont dclares dans un fichier Interface1.java, elles ne peuvent tre utiliss que dans les fichiers qui appartiennent au mme package que Interface1.java. Une

interface ne peut porter le mme nom qu'une classe. abstract : Toute interface est implicitement abstract. Ce modificateur est permis mais pas obligatoire.

A quoi sert une interface et quelle est la diffrence avec une classe abstract ? Tout d'abord, vous noterez qu'une classe ne peut hriter que d'une super classe, mais par contre peut implmenter plusieurs interfaces. Ensuite, une classe abstract peut dclarer des champs qui ne sont pas des constantes et implmenter certaines mthodes.

Soit une classe Classe1 qui implmente toutes les mthodes d'une interface Interface1. Cette classe peut dclarer d'autres mthodes, ce qui compte c'est que chaque instance de cette classe garantit qu'au moins toutes les mthodes d'Interface1 existent et peuvent tre appeles, comme dans l'exemple suivant :
interface CouleurDominante { // Dclaration d'une mthode QuelleCouleurDominante () } class Classe1 extends SuperClasse1 implements CouleurDominante { // Corps de la mthode QuelleCouleurDominante () // Autres mthodes ventuelles } class Classe2 extends SuperClasse2 implements CouleurDominante { // Corps de la mthode QuelleCouleurDominante ()
Page 41

Programmer en java

Dao Issiaka- 3me anne SI

// Autres mthodes ventuelles } class ClasseAyantBesoinDeLaCouleurDominante { CouleurDominante objetColore; // On peut affecter objetColore une rfrence // un objet de classe Classe1 ou Classe2 // et ainsi obtenir la couleur dominante d'un objet color en invoquant // la mthode QuelleCouleurDominante () sur la variable objetColore }

Une interface peut tre utilise pour masquer l'implmentation d'une classe. Ce concept est utilis dans plusieurs packages Java dont java.awt.peer : Ce package dclare un ensemble d'interfaces qui offrent les mmes mthodes sur chaque Machine Virtuelle Java mais qui sont implmentes diffremment pour que l'interface utilisateur du systme (bouton, fentre,...) soit utilise. Une interface vide (comme l'interface Cloneable) permet de crer une catgorie de classes : chaque classe implmentant ce type d'interface appartient telle ou telle catgorie. Pour tester si la classe d'un objet appartient une catgorie, il suffit d'utiliser l'oprateur instanceof avec le nom de l'interface. Une interface peut servir aussi pour dclarer un ensemble de constantes, qui seront utilises dans des classes sans lien d'hritage entre elles, comme dans l'exemple suivant :
interface ConstantesCommunes { // Dclaration des constantes A, B et C } class Classe1 extends SuperClasse1 implements ConstantesCommunes { // Les constantes A, B et C sont utilisables dans la classe Classe1 } class Classe2 extends SuperClasse2 implements ConstantesCommunes { // Les constantes A, B et C sont utilisables dans la classe Classe2 }

Une classe qui implmente une interface InterfaceDerivee drive d'une autre interface Interface1 doit implmenter les mthodes des deux interfaces InterfaceDerivee et Interface1. Java ne permet pas l'hritage multiple. Mais l'utilisation des interfaces peut compenser cet absence, car une classe peut implmenter plusieurs interfaces. Voir aussi le chapitre sur le portage.

Si vous avez quelque mal au dpart comprendre le concept d'interface et leur utilit, considrez les simplement comme des classes abstract, dclarant des constantes et des mthodes abstract. Vous en percevrez leur intrt au fur et mesure que vous serez amen vous en servir.
Programmer en java Page 42

Dao Issiaka- 3me anne SI

Dclaration des champs

Le corps d'une classe est un ensemble de dclarations de champs (fields) et de mthodes implmentes ou non, dclares dans n'importe quel ordre.
Syntaxe

Les dclarations de champs se font comme en C/C++ :


class Classe1 { // Dclaration de champs TypeChamp champ1; TypeChamp champ2, champ3; ModificateurDeChamp TypeChamp champ4; TypeChamp champ5 = valeurOuExpression;

// Initialisation d'un champ

// Cration d'une rfrence sur un tableau TypeChamp tableau1 [ ]; // Allocation d'un tableau de taille n initialis avec les n valeurs TypeChamp tableau2 [ ] = {valeur1, valeur2, /*..., */ valeurn}; // ... } TypeChamp

est soit un type primitif, soit le nom d'une classe, soit le nom d'une interface. Dans les deux derniers cas, le champ est une rfrence sur un objet. Les tableaux sont cits ici en exemple de champ et sont traits dans la partie sur les tableaux. est optionnel et peut tre un ou plusieurs des mots-cls suivants :

ModificateurDeChamp

public, protected ou private : o Un champ public est accessible partout o est accessible la classe Classe1 dans

laquelle il est dclar. o Un champ protected est accessible par les autres classes du mme package que Classe1, et par les classes drives de Classe1. o Un champ private n'est accessible qu' l'intrieur du corps de Classe1. static : Si un champ est static, il est cre en un unique exemplaire quelque soit le nombre d'instance de Classe1 : c'est un champ de classe. L'accs la valeur de ce champ se fait grce l'oprateur point (.) en indiquant le nom de la classe ou une rfrence un objet (Classe1.champ ou objetClasse1.champ). A l'oppos, si un champ n'est pas static, chaque nouvelle instance objetClasse1 de Classe1 crera un champ pour objetClasse1 : c'est une champ d'instance. L'accs la valeur de ce champ se fait grce l'oprateur point (.) , de la manire objetClasse1.champ. final : Un champ final n'est pas modifiable une fois initialis : c'est une constante qui peut prendre une valeur initiale diffrente d'un objet l'autre d'une mme classe. Si ce champ a toujours la mme valeur d'initialisation, il vaut mieux optimiser votre code en y ajoutant static pour en faire une constante de classe. Les champs dclares dans le corps d'une interface sont des constantes implicitement public, final et static, et doivent tre initialiss avec une expression constante. transient : Un champ transient sert indiquer aux mthodes grant la persistance qu'elle ne fait pas partie de la persistance de l'objet. Cette fonctionnalit n'a t mise en
Page 43

Programmer en java

Dao Issiaka- 3me anne SI

oeuvre qu' partir de Java 1.1, et sert viter de sauvegarder des champs ne servant qu' des calculs intermdiaires (indices par exemple). volatile : Un champ volatile permet d'tre sr que deux threads (tches) auront accs de manire ordonne ce champ (modificateur implment uniquement partir de Java 1.1). Voir aussi le chapitre sur les threads. Un champ volatile ne peut tre aussi final.

figure 5. Symbolisation des modificateurs d'accs aux champs

Le modificateur d'accs un champ est soit public, soit protected, soit private, soit par dfaut, si aucun de ces modificateurs n'est prcis, amical (friendly en anglais) : le champ est alors accessible uniquement par les autres classes du mme package. Les liens de la figure prcdente indique les endroits o il est possible d'utiliser un champ. Comme vous pouvez le voir, l'utilisation d'un champ se fait directement par son nom l'intrieur d'une classe et de ses classes drives, sans besoin d'utiliser l'oprateur point (.). L'initialisation d'un champ se comporte exactement comme l'affectation. Si le champ est static, alors l'initialisation est effectue au chargement de la classe. Les champs non initialiss prennent obligatoirement une valeur par dfaut (voir le tableau sur les types primitifs). Si ce champ est une rfrence un objet, la valeur par dfaut est null. Une classe Classe1 peut dclarer un champ qui est une rfrence une classe Classe2 dclare aprs Classe1 (pas besoin de dclarer les types avant de les utiliser comme en C). En Java, le modificateur final est utilis pour dclarer une constante (pas de #define, ni de const). Contrairement au C/C++, Java permet d'initialiser la dclaration les champs de classe ainsi que les champs d'instance. Les champs d'instance et de classe sont tous initialiss une valeur par dfaut. En C++, il est obligatoire d'initialiser les champs de classe part ; en Java, soit ces champs prennent une valeur par dfaut, soit ils sont initialiss leur dclaration,
Programmer en java Page 44

Dao Issiaka- 3me anne SI

soit ils sont initialiss dans un bloc d'initialisation static. L'accs aux champs static se fait grce l'oprateur point (.) et pas l'oprateur ::, comme en C++. De plus, si vous voulez donner une valeur par dfaut aux champs static, vous le faites directement la dclaration du champ, comme par exemple static int var = 2;. Le modificateur d'accs aux champs (et aux mthodes) se fait pour chacune d'eux individuellement, et pas en bloc comme en C++ (avec par exemple public :). Les champs (et les mthodes) d'une classe Classe1 dont le modificateur d'accs est protected sont accessibles par les classes drives de Classe1 comme en C++, mais aussi par les classes du mme package que Classe1. En Java, les champs (et les mthodes) d'une classe Classe1 ont un modificateur d'accs par dfaut qui est amical (friendly), c'est dire qu'elles sont accessibles uniquement par les autres classes du mme package que Classe1. En C++, cette notion n'existe pas et par dfaut le modificateur d'accs est private. Le modificateur d'accs par dfaut de Java est trs pratique car il donne accs tous les champs et toutes les mthodes des classes d'un mme package. Mais attention, si aprs avoir dvelopp certaines classes, vous pensez qu'elles peuvent vous tre utiles pour d'autres programmes et qu'ainsi vous les mettez dans un nouveau package outils, il vous faudra ajouter les modificateurs d'accs public pour accder en dehors du package outils aux mthodes et champs dont vous avez besoin. Donc, prenez l'habitude de prciser ds le dpart les modificateurs d'accs des champs et des mthodes.
Initialisations static

Le corps d'une classe peut comporter un ou plusieurs blocs d'initialisation static. Ces blocs sont excuts au chargement d'une classe, et permettent d'excuter des oprations sur les champs static. Ils sont excuts dans l'ordre de dclaration et peuvent ne manipuler que les champs static dclars avant le bloc.
class Classe1 { // Dclaration de champs static static int champ1 = 10; static int champ2; static { // Bloc static champ2 = champ1 * 2; } // ... }

Sur une mme Machine Virtuelle Java, vous pouvez trs bien excuter diffrentes applets ou applications l'une aprs l'autre ou en mme temps grce au multithreading. Par contre, chaque classe ClasseX n'existe qu'en un seul exemplaire pour une Machine Virtuelle, mme si ClasseX est utilise par diffrentes applets. Ceci implique que les champs static de ces classes sont uniques pour une Machine Virtuelle, et partags entre les diffrentes applets. Donc, attention aux
Programmer en java Page 45

Dao Issiaka- 3me anne SI

effets de bord ! Si vous modifiez la valeur d'un champ static dans une applet, il sera modifi pour toutes les applets amenes utiliser ce champ. Ceci est opposer au C, o les champs static sont uniques pour chaque contexte d'excution d'un programme.
Initialisations d'instance

A partir de Java 1.1, le corps d'une classe peut comporter un ou plusieurs blocs d'initialisation d'instance. Comme pour les constructeurs, ces blocs sont excuts la cration d'un nouvel objet dans l'ordre de dclaration.
class Classe1 { // Dclaration d'un champ comptant le nombre d'instances cres static int nombreInstances = 0; // Dclaration d'un champ d'instance int champ1; { // Bloc d'instance champ1 = 10; nombreInstances++;

} // ... }

Dclaration des mthodes Syntaxe

Les dclarations des mthodes en Java ont une syntaxe trs proche de celles du C/C++ :
class Classe1 { // Dclarations de mthodes ModificateurDeMethode TypeRetour methode1 (TypeParam1 param1Name /*,... , TypeParamN paramNName*/) { // Corps de methode1 () } // Dclaration d'une mthode sans paramtre TypeRetour methode2 () { // Corps de methode2 () } ModificateurDeMethode TypeRetour methode3 (/* ... */) throws TypeThrowable /*, TypeThrowable2 */ { // Corps de methode3 () } // Dclaration d'une mthode abstract // Dans ce cas, Classe1 doit tre aussi abstract
Programmer en java Page 46

Dao Issiaka- 3me anne SI

abstract ModificateurDeMethode TypeRetour methode4 (/* ... */); // Dclaration d'une mthode native native ModificateurDeMethode TypeRetour methode4 (/* ... */); // ... } TypeRetour

peut tre :

soit un type primitif, une classe ou une interface : dans ce cas, la mthode doit utiliser l'instruction return suivie d'une valeur du type TypeRetour, pour renvoyer une valeur. Le type peut tre une rfrence un tableau en utilisant [ ] (par exemple, int [ ] methode ()). soit void quand la mthode ne renvoie pas de valeur.

Les paramtres d'une mthode sont cits entre parenthses et spars par des virgules. Chaque paramtre est prcd par son typeTypeParami qui peut tre un type primitif, une classe ou une interface. doit tre une classe drive de la classe Throwable. Les exceptions qui sont dclenches via l'instruction throw doivent avoir leur classe dclare aprs la clause throws. Voir le chapitre traitant des exceptions.
TypeThrowable ModificateurDeMethode

est optionnel et peut tre un ou plusieurs des mots-cls suivants :

public, protected ou private : o Une mthode public est accessible partout o est accessible la classe Classe1 dans laquelle elle est dclare. Ce sont les mthodes public que l'utilisateur d'une

classe peut appeler. Une mthode protected est accessible par les autres classes du mme package que Classe1, et par les classes drives de Classe1. o Une mthode private n'est accessible qu' l'intrieur du corps de Classe1. Les mthodes private sont typiquement des routines internes de calcul pour lesquels il n'y a pas de raison de donner un accs l'utilisateur d'une classe. static : Si une mthode est static, c'est une mthode de classe qui ne peut utiliser que les champs et les mthodes de Classe1, qui sont dclares static. L'appel cette mthode se fait grce l'oprateur point (.) en indiquant le nom de la classe ou une rfrence un objet (Classe1.methode () ou objetClasse1.methode ()). A l'oppos, si une mthode n'est pas static, c'est une mthode d'instance, accessible pour chaque instance objetClasse1 de Classe1 grce l'oprateur point (.) , de la manire objetClasse1.methode (). Les mthodes dclares dans le corps d'une interface ne peuvent tre static. final : Une mthode final ne peut pas tre outrepasse par les classes drivant de Classe1. abstract : Une mthode abstract permet de dclarer une mthode d'instance sans en donner l'implmentation, et ne peut apparatre qu'au sein d'une classe abstract. Toute classe non abstract drive de cette classe, doit implmenter cette mthode, en l'outrepassant. Les mthodes dclares dans le corps d'une interface sont implicitement abstract et public.
o

Programmer en java

Page 47

Dao Issiaka- 3me anne SI

native : Une mthode native est implmente dans une bibliothque annexe propre la

plateforme de dveloppement qui peut tre dveloppe en C ou en C++ par exemple. Ceci permet de faire appel certaines fonctionnalits propres la plateforme cible, qui ne seraient pas disponibles en Java. Mais une mthode native n'est pas portable... synchronized : Une mthode synchronized permet d'obtenir un verrou sur l'objet sur lequel elle est appele (ou sur la classe si la mthode est aussi static). Ce verrou empche qu'en cas de programmation multi-threads (multitches), diffrents threads aient accs de manire simultane un mme objet. Voir aussi la synchronisation des threads.

Le modificateur d'accs une mthode est soit public, soit protected, soit private. Leur utilisation est la mme que pour les champs. Dans la plupart des cas, il est conseill de ne rendre public que les mthodes et les constantes (champs final static), dont a besoin l'utilisateur d'une classe. Les autres champs sont dclars private voir friendly ou protected et sont rendus accessibles si besoin est, par des mthodes public permettant de les interroger et de les modifier (get... () et set... ()). Ceci permet de cacher aux utilisateurs d'une classe ses champs et de vrifier les conditions requises pour modifier la valeur d'un champ. Ce style de programmation est largement utilis dans la bibliothque Java. Pour les mthodes non abstract et non native, le corps de la mthode est un bloc, comportant une suite d'instructions dfinissant son implmentation. A l'intrieur de la dclaration d'une classe Classe1, l'appel toute mthode methode () de Classe1 ou de ses super classes, peut se faire directement sans l'oprateur point (.) ; l'utilisation de cet oprateur n'est obligatoire que pour accder aux mthodes des autres classes, comme dans l'exemple suivant :
class Classe1 { static public int Factorielle (int i) { if (i == 0) return 1; else return i * Factorielle (i - 1); // Factorielle () est directement accessible l'intrieur de Classe1 } } class Classe2 { // Pour accder la mthode Factorielle () de Classe1 // vous devez utilisez l'oprateur point. int factorielle10 = Classe1.Factorielle (10); }

Avant Java 5.0, Java ne permettait pas l'utilisation des listes d'arguments variables du C (dfini avec ...). Cette absence peut tre partiellement dtourne grce l'utilisation de la surcharge des mthodes. En Java, chaque paramtre doit tre dclarer avec son type et un nom. En C++, quand un paramtre est requis mais n'est pas utilis dans une mthode, il n'est pas obligatoire de spcifier un nom, comme pour le deuxime paramtre de l'exemple void methode1 (int a, float). A l'oppos du C++, il est possible de donner le mme nom un champ et une mthode ( viter pour ne pas nuire la lisibilit du programme).
Programmer en java Page 48

Dao Issiaka- 3me anne SI

Contrairement au C/C++, dans une classe Classe1, vous pouvez utiliser tous les champs et les mthodes de Classe1 dans le corps de ses mthodes qu'ils soient dclars avant ou aprs dans Classe1, comme dans l'exemple suivant :
class Classe1 { void methode1 () { x = 1; // x est dclar aprs methode2 (); // methode2 () est dclare aprs } void methode2 () { } int x; }

Java ne permet pas de dclarer de variables ou de fonctions globales. Mais, si vous tenez absolument garder le style de programmation procdurale du C, vous pouvez crer et utiliser des champs et des mthodes static, dans ce but. La notion de fonction "amie" du C++ (friend) n'existe pas en Java : aucune mthode ne peut tre dclare en dehors d'une classe. Contrairement au C++, toutes les mthodes d'instance non private sont virtuelles en Java. Donc le mot-cl virtual est inutile, ce qui peut viter certains bugs difficiles dceler en C++. Les mthodes abstract sont l'quivalent des mthodes virtuelles pures du C++ (qui se dclarent en faisant suivre la dclaration de la mthode de = 0). Java introduit le mot-cl final. Ce modificateur empche d'outrepasser une mthode dans les classes drives. Cette notion est absente du C++. Toutes les mthodes Java sont dclares et implmentes l'intrieur de la classe dont elles dpendent. Mais, cela n'a pas pour consquence de crer comme en C++ toutes les mthodes de Java inline ! Avec l'option d'optimisation (-O), le compilateur lui-mme value les mthodes final qui peuvent tre traites inline (remplacement de l'appel la mthode par le code implmentant la mthode) : Donc, il est important d'utiliser ce modificateur quand cela est ncessaire (pour les mthodes d'accs aux champs par exemple). La surcharge des oprateurs n'existe pas en Java. Seule la classe String autorise l'oprateur + pour la concatnation. Java ne permet pas de donner aux paramtres des valeurs par dfaut comme en C++ (void f (int x, int y = 0, int z = 0); ). Vous tes obligs de surcharger une mthode pour obtenir les mmes effets, en crant une mthode avec moins de paramtres qui rappellera la mthode avec les valeurs par dfaut. L'appel aux mthodes static se fait grce l'oprateur point (.) et pas l'oprateur ::, comme en C++. Une mthode reoit la valeur de chacun des paramtres qui lui sont passs, et ces paramtres se comportent comme des variables locales :
1. Si un paramtre param est une rfrence sur un objet objet1, alors vous pouvez modifier le contenu de objet1 ; par contre, si vous affectez param une
Programmer en java Page 49

Dao Issiaka- 3me anne SI

rfrence sur un autre objet, cette modification n'aura d'effet qu' l'intrieur du corps de la mthode. Si vous voulez mimer le passage par valeur, vous pouvez utiliser la mthode clone () de la classe Object pour crer une copie de l'objet objet1. 2. Si un paramtre est de type primitif, la modification de sa valeur n'a de porte qu' l'intrieur du corps de la mthode. Si vous voulez prendre en compte en dehors de la mthode la modification du paramtre, vous serez oblig de crer un objet dont la classe comporte un champ mmorisant cette valeur. Vous pourrez alors modifier la valeur comme indiqu en 1. (Voir aussi le chapitre traitant du portage de programmes C/C++ en Java).

Surcharge des mthodes

Une mthode methodeSurchargee (), est surcharge (overloaded) quand elle est dclare plusieurs fois dans une mme classe ou ses classes drives, avec le mme nom mais des paramtres de types diffrents, ou de mme type mais dans un ordre diffrent, comme dans l'exemple suivant :
class Classe1 { void methodeSurchargee (int entier) { // Corps de methodeSurchargee () } void methodeSurchargee (float nombre) { // Corps de methodeSurchargee () } } class Classe2 extends Classe1 { // Classe2 hrite de Classe1 donc elle dclare // implicitement toutes les mthodes de Classe1 void methodeSurchargee (float nombre, short param) { // Corps de methodeSurchargee () } }

Il est autoris de surcharger une mthode en utilisant des paramtres de types diffrents pour chaque mthode. Les valeurs de retours peuvent tre aussi diffrentes, mais il est interdit de crer deux mthodes avec les mmes paramtres et un type de valeur de retour diffrent (par exemple, int methode () et float methode ()). En Java, une classe hrite de toutes les mthodes de la super classe dont elle drive, mme si elle surcharge une ou plusieurs des mthodes de sa super classe. Dans l'exemple prcdent, contrairement au C++, les mthodes que l'on peut invoquer sur un objet de classe Classe2 sont les 3 mthodes methodeSurchargee (int entier), methodeSurchargee (float nombre) et methodeSurchargee (float nombre, short param). En C++, le fait de surcharger la mthode methodeSurchargee () dans Classe2, interdit d'appeler directement sur un objet
Programmer en java Page 50

Dao Issiaka- 3me anne SI

de classe Classe2 les mthodes surcharges de Classe1.


Constructeur

Chaque champ d'une classe peut tre initialis une valeur par dfaut sa dclaration. Mais si vous voulez initialiser certains de ces champs avec une valeur donne la cration d'un nouvel objet, il vous faut dclarer une mthode spciale appele un constructeur. Un constructeur est appele automatiquement la cration d'un objet, et les instructions du corps d'un constructeur sont gnralement destines initialiser les champs de l'objet nouvellement cr avec les valeurs rcupres en paramtre. Il a une syntaxe un peu diffrente de celle des mthodes :
class Classe1 { // Dclaration du constructeur sans paramtre remplaant le constructeur par dfaut public Classe1 () { // Corps du constructeur } ModificateurDeConstruceur Classe1 (TypeParam1 param1Name /* ... */) { // Corps du constructeur } ModificateurDeConstruceur Classe1 (/* ... */) throws TypeThrowable /*, TypeThrowable2 */ { // Corps du constructeur } }

Un constructeur porte le mme nom que la classe o il est dclar, et n'a pas de type de retour. A l'usage vous verrez que c'est une des mthodes qui est le plus souvent surcharge. Toute classe qui ne dclare pas de constructeur a un constructeur par dfaut sans paramtre qui ne fait rien. Ce contructeur a le mme modificateur d'accs que sa classe (contructeur par dfaut public si la classe est public). Aussitt qu'un constructeur est dclar avec ou sans paramtre, le constructeur par dfaut n'existe plus. Si vous avez dclar dans une classe Classe1 un constructeur avec un ou plusieurs paramtres, ceci oblige prciser les valeurs de ces paramtres la cration d'un objet de la classe Classe1. est une classe drive de la classe Throwable. Les exceptions qui sont dclenches via l'instruction throw doivent avoir leur classe dclare aprs la clause throws. Voir le chapitre traitant des exceptions.
TypeThrowable ModificateurDeConstruceur est optionnel et peut tre un des mots-cls suivants : public, protected ou private. Ils sont utiliss de la mme manire que pour les dclarations de

mthodes. Voici par exemple, une classe Classe1 n'utilisant pas de constructeur transforme pour qu'elle utilise un constructeur :
Programmer en java Page 51

Dao Issiaka- 3me anne SI

class Classe1 class Classe1 { { int var1 = 10; int var1; int var2; int var2; } public Classe1 (int valeur) { // Initialisation de var1 avec valeur var1 = valeur; } }

Le constructeur Classe1 (int valeur) sera appel avec la valeur donne par l'instruction de cration d'un objet de classe Classe1. Ce constructeur permet ainsi de crer un objet de classe Classe1 dont le champ var1 est initialis avec une valeur diffrente pour chaque nouvel objet. Mais quel est l'intrt d'un constructeur puisqu'il est toujours possible de modifier la valeur d'un champ d'un objet aprs sa cration ? Un constructeur permet d'initialiser certains champs d'un objet ds sa cration, ce qui permet de garantir la cohrence d'un objet. En effet, mme si vous prcisez aux utilisateurs d'une classe qu'ils doivent modifier tel ou tel champ d'un nouvel objet avant d'effectuer certaines oprations sur celui-ci, rien ne garantit qu'ils le feront effectivement, ce qui peut tre source de bugs. Un constructeur permet justement d'viter ce genre de problme car tous les champs d'un objet seront correctement initialiss au moment de sa cration, ce qui garantit que les utilisateurs d'une classe pourront effectuer n'importe quelle opration sur un objet juste aprs sa cration. La plupart des classes de la bibliothque Java utilisant un ou plusieurs constructeurs, vous serez souvent amener les utiliser en crant des objets et ceci vous permettra de comprendre comment en dclarer vous-mme dans vos propres classes.

Les mthodes peuvent elles aussi porter le mme nom que la classe o elles sont dclares. Comme la distinction ne se fait alors que par la prsence d'un type devant le nom de la mthode, l'utilisation de cette caractristique est dconseille pour viter toute confusion avec un constructeur.
class Classe1 { // Ceci est une mthode pas un constructeur ! public void Classe1 (int valeur) { // ... } }

Le corps d'un constructeur peut ventuellement commenc par une des deux instructions suivantes :
this (argument1 /*, argument2, ...*/); super (argument1 /*, argument2, ...*/);
Programmer en java Page 52

Dao Issiaka- 3me anne SI

La premire instruction permet d'invoquer un autre constructeur de la mme classe : il est souvent utilis par un constructeur pour passer des valeurs pas dfaut aux paramtres d'un autre constructeur. La seconde instruction permet d'appeler un constructeur de la super classe pour lui repasser des valeurs ncessaires l'initialisation de la partie de l'objet dpendant de la super classe, comme dans l'exemple suivant :
class Classe1 { int var; Classe1 (int val) { var = val; } } class Classe2 extends Classe1 { int var2; Classe2 (int val) { // Appel du constructeur de Classe1 avec la valeur 3 super (3); var2 = val; } Classe2 () { // Appel du premier constructeur avec la valeur 2 this (2); } }

Si aucune des instructions prcdentes n'est cite, Java considre qu'il y a implicitement un appel super ();. Ceci implique que la super classe doit avoir un constructeur sans paramtre (dclar explicitement ou fourni par Java par dfaut), et que par enchanement, la cration de tout nouvel objet de classe invoquera le constructeur de sa classe et tous les constructeurs de des super classes. Donc si comme dans l'exemple prcdent vous crez une classe Classe2 qui drive d'une classe Classe1 n'ayant pas de constructeur par dfaut ou sans paramtre, vous serez obliger de dclarer au moins un constructeur dans Classe2 qui rappelle un constructeur de la classe Classe1 avec l'instruction super (...);. A partir de Java 1.1, le corps d'une classe peut comporter aussi un ou plusieurs blocs d'initialisation d'instance, qui sont comparables au constructeur par dfaut. A la cration d'un objet, un objet d'une classe Classe1 est initialis dans l'ordre suivant :

Si Classe1 hrite d'une super classe Classe0, appel d'un constructeur de Classe0 soit par un appel explicite super (...), ou implicitement si Classe0 possde une constructeur par dfaut. Excution d'ventuels blocs d'initialisation d'instance dclars dans Classe1. Excution du constructeur de Classe1.

Java introduit le mot-cl super : il permet de passer des valeurs d'un constructeur
Programmer en java Page 53

Dao Issiaka- 3me anne SI

d'une classe au constructeur de sa super classe grce l'appel super (arguments). En C++, il faut donner les paramtres passer au(x) constructeur(s) des supers classes la suite de la dclaration d'un constructeur. Contrairement au C++, les constructeurs d'une mme classe peuvent s'appeler entre eux en Java grce this (...). Cette fonctionnalit est trs pratique pour remplacer l'absence de valeur par dfaut des paramtres des constructeurs. Java ne permet de passer les objets en paramtre que par rfrence. Le constructeur par recopie du C++, appel pour construire les objets passs par valeur, n'est pas utile.
Cration d'objets : oprateur new

La cration d'objet (on dit aussi l'instanciation d'une classe) se fait grce l'oprateur new suivi d'un nom de classe et des arguments envoys au constructeur :
new Classe1 (/* argument1, argument2, ...*/)

Un nouvel objet de classe Classe1 est cr, l'espace mmoire ncessaire pour les champs d'instance est allou, ces champs sont ensuite initialiss puis finalement le constructeur correspondant aux types des arguments est appel. La valeur renvoye par l'oprateur peut tre affecte une rfrence de classe Classe1 ou de super classe de Classe1 (voir les casts). Si Classe1 n'a pas encore t utilise, l'interprteur charge la classe, alloue l'espace mmoire ncessaire pour mmoriser les champs static de la classe et excutent les initialisations static. A partir de Java 1.1, il est possible de crer des objets ayant une classe anonyme. La mthode newInstance () de la classe Class permet aussi de crer un nouvel objet. Cette mthode est quivalente utiliser new sans argument, et donc si vous voulez utiliser newInstance () pour crer un objet de classe Classe1, Classe1 doit avoir un constructeur sans paramtre (celui fourni par dfaut ou dclar dans la classe), sinon une exception NoSuchMethodError est dclenche. Voir aussi l'application InstantiationAvecNom. A partir de Java 1.1, les mthodes newInstance () des classes java.lang.reflect.Constructor et java.lang.reflect.Array permettent de crer un objet de n'importe quelle classe ayant un constructeur avec ou sans paramtres. Une exception OutOfMemoryError peut tre dclenche en cas de mmoire insuffisante pour allouer l'espace mmoire ncessaire au nouvel objet. La seule manire de crer des objets en Java se fait grce l'oprateur new. Vous ne pouvez pas comme en C++, crer des objets sur la pile d'excution. Maintenant que vous connaissez comment crer une classe, un constructeur et un objet en Java, comparons un programme simple C avec un programme Java :
#include <stdlib.h> /* Dclaration du type Classe1 */ typedef struct
Programmer en java

// Dclaration de la classe Classe1 class Classe1


Page 54

Dao Issiaka- 3me anne SI

{ int var1; int var2; } Classe1;

{ int var1; int var2; // Constructeur de Classe1 // permettant d'initialiser // les champs var1 et var2 public Classe1 (int valeur1, int valeur2) { var1 = valeur1; var2 = valeur2; } // Mthode renvoyant la division // entre les champs de cet objet public int division () { return var1 / var2; } public static void main (String [] args) { // Cration d'une instance de // Classe1 directement initialise Classe1 objet1 = new Classe1 (10, 20);

/* Fonction renvoyant la division */ /* entre les champs de objet */ int division (Classe1 *objet) { return objet->var1 / objet>var2; } void main () { /* Allocation puis initialisation */ /* d'une instance de Classe1 */ Classe1 *objet1 = (Classe1 *) calloc (1, sizeof (Classe1)); objet1->var1 = 10; objet1->var2 = 20; int quotient = division (objet1); }

int quotient = objet1.division (); } }

Outrepasser une mthode

Une mthode d'instance methodeOutrepassee () non private, est outrepasse (overridden) si elle est dclare dans une super classe et une classe drive, avec le mme nom, le mme nombre de paramtres, et le mme type pour chacun des paramtres. Les exemples qui suivent montrent l'intrt de ce concept : L'application suivante dcrit une gestion de comptes en banque simplifie et correspond au graphe d'hritage dcrit au chapitre prcdent (sans la classe PEL). Recopiez la dans un fichier Banque.java, que vous compilez avec l'instruction javac Banque.java pour ensuite l'excuter avec java ou Java Runner, grce l'instruction java Banque :
class Compte { private int
Programmer en java

numero;
Page 55

Dao Issiaka- 3me anne SI

protected float soldeInitial; // Champ protected accessible // par les classes drives // Constructeur Compte (int nouveauNumero, float sommeDeposee) { // Mise jour des champs de la classe numero = nouveauNumero; soldeInitial = sommeDeposee; } int numeroCompte () { return numero; } float calculerSolde () { return soldeInitial; } } // La classe CompteDepot drive de la classe Compte class CompteDepot extends Compte { // Cration d'un tableau de 1000 float pour les oprations private float operations [] = new float [1000]; private int nbreOperations; // Initialise 0 // Constructeur CompteDepot (int nouveauNumero) { // Appel du constructeur de la super classe super (nouveauNumero, 0); } void ajouterOperation (float debitCredit) { // Mmorisation de l'opration et augmentation de nbreOperation operations [nbreOperations++] = debitCredit; } float calculerSolde () // outrepasse la mthode de la classe Compte { float solde = soldeInitial; // Somme de toutes les oprations for (int i = 0; i < nbreOperations; i++) solde += operations [i]; return solde; } } // La classe CompteEpargne drive de la classe Compte class CompteEpargne extends Compte { private float tauxInteretPourcentage; // Constructeur (tauxInteret en %) CompteEpargne (int nouveauNumero, float depot, float tauxInteret) { super (nouveauNumero, depot);
Programmer en java Page 56

Dao Issiaka- 3me anne SI

tauxInteretPourcentage = tauxInteret; } float calculerSolde () // outrepasse la mthode de la classe Compte { return soldeInitial * (1f + tauxInteretPourcentage / 100f); } } // Classe d'exemple public class Banque { // Mthode lance l'appel de l'instruction java Banque public static void main (String [ ] args) { // Cration de 3 comptes de classe diffrente Compte compte101 = new Compte (101, 201.1f); CompteDepot compte105 = new CompteDepot (105); compte105.ajouterOperation (200); compte105.ajouterOperation (-50.5f); CompteEpargne compte1003 = new CompteEpargne (1003, 500, 5.2f); // Appel de la mthode editerSoldeCompte () sur chacun // des comptes. Cette mthode prend en paramtre une // rfrence de classe Compte : Les objets dsigns par // compte105 et compte1003 sont d'une classe qui drive // de la classe Compte, c'est pourquoi ils peuvent tre // accepts en paramtre comme des objets de classe Compte editerSoldeCompte (compte101); editerSoldeCompte (compte105); editerSoldeCompte (compte1003); } // Mthode ditant le numro et le solde d'un compte static void editerSoldeCompte (Compte compte) { // Rcupration du numro et du solde du compte // La mthode calculerSolde () qui est appele // est celle de la classe de l'objet dsign // par le champ compte int numero = compte.numeroCompte (); float solde = compte.calculerSolde (); System.out.println ( "Compte : " + numero + " Solde = " + solde); } }

Le rsultat de ce programme donne ceci :


Compte : 101 Solde = 201.1 Compte : 105 Solde = 149.5 Compte : 1003 Solde = 526.0

La mthode editerSoldeCompte () reoit en paramtre la variable compte. compte est une rfrence dsignant une instance de la classe Compte, ou d'une des classes drives de Compte, ici CompteDepot ou CompteEpargne. Que se passe-t-il l'appel de la mthode calculerSolde () sur cette rfrence ?
Programmer en java Page 57

Dao Issiaka- 3me anne SI

La Machine Virtuelle connait l'excution la classe de l'objet dsign par la rfrence compte : en plus, des champs d'instance qui sont alloues la cration d'une nouvelle instance des classes Compte, CompteDepot ou CompteEpargne, un champ cach qui reprsente la classe du nouvel objet lui est ajout. A l'appel compte.calculerSolde (), la Machine Virtuelle consulte ce champ pour connatre la classe de l'objet dsign par compte. Une fois qu'elle a cette classe elle appelle l'implmentation de la mthode calculerSolde () de cette classe, ce qui fait que la mthode calculerSolde () de la classe Compte ne sera effectivement appele que si l'objet dsign par compte est de classe Compte. Globalement en Java, la manire d'appeler une mthode d'instance quelle qu'elle soit, respecte ce schma : c'est la ligature dynamique (la bonne mthode appeler n'est pas dtermine statiquement la compilation, mais dynamiquement l'excution en fonction de la classe de l'objet dsign). A premire vue, son intrt parat pourtant limit aux mthodes outrepasses, mais souvenez-vous que toute classe qui n'est pas final peut tre appele tre drive un jour, et que ses mthodes seront peut-tre outrepasses dans la classe drive. Il faut donc "prparer le terrain" pour ces mthodes... Une mthode outrepassant une autre ne peut avoir un modificateur d'accs plus restrictif que la mthode outrepasse (pas possible d'avoir un accs protected ou private si la mthode outrepasse est public). L'ordre de priorit des modificateurs d'accs est du plus restrictif au moins restrictif : private, friendly, protected et public. La notion de mthode outrepasse est fondamentale et contribue pour une grande part la puissance d'un langage objet. Elle est trs souvent utilise en Java, car il vous faut souvent outrepasser les mthodes des classes de la bibliothque Java pour modifier leur comportement par dfaut. On parle souvent aussi de polymorphisme. En Java, toutes les mthodes d'instance utilisent la ligature dynamique. Contrairement au C++, toutes les mthodes sont virtual. Faites trs attention bien respecter l'orthographe du nom des mthodes que vous outrepassez et les types de leurs paramtres. Si la nouvelle mthode cre a un nom diffrent, elle n'outrepassera plus celle de la super classe, le compilateur ne vous signalera rien et finalement la mthode appele pourra tre celle de la super classe au lieu de celle que vous avez dclare. Par contre, les noms des paramtres n'ont pas d'importance, et peuvent tre diffrents de ceux de la mthode outrepasse. Quand une mthode private est dclare nouveau dans une sous-classe, elle n'est pas spcialise. Contrairement ce qui se passe avec les mthodes outrepasses, il n'existe pas en Java de ligature dynamique sur les champs qu'ils soient static ou non, comme le montre l'exemple suivant :
class Classe1 { final static int CONSTANTE = 0; } class Classe2 extends Classe1 {

Programmer en java

Page 58

Dao Issiaka- 3me anne SI

// Dclaration d'un champ (constante) qui cache celle de Classe1 final static int CONSTANTE = 1; void methode1 () { Classe2 objet2 = new Classe2 (); // cration d'un objet de classe Classe2 int var = objet2.CONSTANTE; // var vaut 1 Classe1 objet1 = objet2; // cast de Classe2 vers Classe1 var = objet1.CONSTANTE; // var vaut 0 pourtant objet1 est une rfrence // sur un objet de classe Classe2 ! } }

Dans cet exemple, Classe2 a besoin de donner une valeur diffrente CONSTANTE pour les objets de cette classe : si on redclare cette constante dans Classe2 avec une valeur diffrente, on pourrait s'attendre ce que objet1.CONSTANTE vaille 1 puisque objet1 dsigne un objet de classe Classe2. En fait, objet1.CONSTANTE renvoie la valeur de CONSTANTE de la classe Classe1 car objet1 est de type Classe1... Si vous voulez que var vaille 1 dans les deux cas de cet exemple, vous devez crer une mthode dans chaque classe qui renvoie la valeur de CONSTANTE, comme par exemple :
class Classe1 { public int valeur1 () { return 0; } } class Classe2 extends Classe1 { public int valeur1 () // valeur1 () outrepasse la mthode de Classe1 { return 1; } void methode1 () { Classe2 objet2 = new Classe2 (); // cration d'un objet de classe Classe2 int var = objet2.valeur1 (); // var vaut 1 Classe1 objet1 = objet2; // cast de Classe2 vers Classe1 // var vaut 1 car c'est la var = objet1.valeur1 (); methode // valeur1 () qui est appele (objet1 // est une rfrence sur un objet de // classe Classe2) }

Programmer en java

Page 59

Dao Issiaka- 3me anne SI

Utilisation de classes abstract

Les classes abstract sont une catgorie spciale de classe : il est impossible de crer une instance d'une classe abstract classeAbstract, mais par contre il est possible de dclarer un champ var1 qui est une rfrence de classe classeAbstract. var1 peut tre gal null ou dsigner un objet d'une des classes drives de la classe classeAbstract la condition suivante : Si la classe classeAbstract dclare une ou plusieurs mthodes d'instance abstract, la classe drive doit outrepasser ces mthodes et donner leur implmentation. Si cette classe ne donne pas l'implmentation de toutes les mthodes abstract, elle est ellemme abstract. Rappelez-vous qu'en fait, pour crer une instance d'une classe Classe1, il faut que toutes les mthodes de cette classe soient implmentes pour pouvoir les appeler, que ces mthodes soient dclares dans Classe1 ou hrites des super classes de Classe1. Si une super classe dclare des mthodes abstract il faut donc que ces mthodes soient implmentes. De mme, une interface est une sorte de classe abstract dont toutes les mthodes sont implicitement abstract. C'est pourquoi toute classe qui implmente une interface, doit implmenter toutes les mthodes de l'interface pour ne pas tre abstract. L'exemple suivant vous montre l'intrt de l'utilisation d'une classe abstract :
abstract class Vehicule { abstract int nombreDeRoues (); } class Velo extends Vehicule { int nombreDeRoues () // outrepasse nombreDeRoues () de la classe Vehicule { return 2; } } class Voiture extends Vehicule { int nombreDeRoues () // outrepasse nombreDeRoues () de la classe Vehicule { return 4; } } class VoitureAvecRemorque extends Voiture { int nombreDeRoues () // outrepasse nombreDeRoues () de la classe Voiture { // super.nombreDeRoues () fait appel la mthode outrepasse return 2 + super.nombreDeRoues (); } } class Classe1 { // Cration de deux objets avec l'oprateur new Velo unVelo = new Velo (); Voiture uneVoiture = new Voiture ();
Programmer en java Page 60

Dao Issiaka- 3me anne SI

// Dclaration d'une rfrence sur la super classe Vehicule // Comme la classe Vehicule est abstract, il est impossible de crer un // objet de cette classe, mais on peut affecter cette rfrence // de classe Vehicule, un objet d'une classe drive de Vehicule Vehicule unVehicule; void methode () { int a = unVelo.nombreDeRoues (); int b = uneVoiture.nombreDeRoues (); unVehicule = unVelo; int c = unVehicule.nombreDeRoues (); unVehicule = uneVoiture; Vehicule int d = unVehicule.nombreDeRoues (); } }

// a est gal 2 // b est gal 4 // cast de Velo vers Vehicule // c est gal 2 // cast de Voiture vers // d est gal 4

Dans cet exemple, unVehicule est une rfrence permettant de dsigner un objet de classe Vehicule ou toute autre classe drive de Vehicule. Quand nombreDeRoues () est invoque sur la rfrence unVehicule, l'interprteur va consulter la classe relle d'appartenance de l'objet rfrenc par unVehicule ; une fois, qu'il a dtermin cette classe, il va appeler la mthode nombreDeRoues () de cette classe. Le mot-cl super permet aussi d'invoquer la mthode methode1 () outrepasse d'une super classe Classe1, par super.methode1 (). Il correspond la notation Classe1::methode1 () du C++. Par contre, si Classe1 hrite elle-mme d'une super classe Classe0, implmentant elle aussi methode1 (), vous ne pourrez pas appeler directement methode1 () de Classe0, comme vous le feriez en C++ grce Classe0::methode1 (). Mais ceci n'est pas souvent utilis... Java ne permet pas d'utiliser des pointeurs sur fonctions. Dans certains cas, l'utilisation des mthodes outrepasses est une alternative cette absence. Voici un programme C et un programme Java mis en parallle pour illustrer ce propos (l'exemple utilise une interface mais il est aussi possible d'utiliser une classe abstract) :
/* Dclaration d'un type pointeur sur */ /* fonction prenant en paramtre un int */ typedef void (* methodeX) (int i); // Dclaration d'une interface dclarant // une mthode prenant en paramtre un int interface MethodeX { void methodeX (int i); } // Dclaration de deux classes implmentant // la mthode methodeX () de cette interface class Classe1 implements MethodeX { public void methodeX (int i) { /* Corps de methodeX () */ }

/* Dclaration de deux fonctions du */ /* mme type que methodeX () */

void methodeX_1 (int i)

Programmer en java

Page 61

Dao Issiaka- 3me anne SI

{ /* Corps de methodeX_1 () */ }

} class Classe2 implements MethodeX { public void methodeX (int i) { /* Corps de methodeX () */ } } // Dclaration d'une classe utilisant // methodeX () de diffrentes classes class ClasseUtilisantMethodeX { // Mthode appelant la mthode methodeX () // d'une classe implmentant MethodeX void appelMethodeX (MethodeX objet, int i) { objet.methodeX (i); } void appelMethodeXClasse1 () { // Appel de methodeX () de Classe1 // La rfrence dsignant l'objet cr // avec new Classe1 () peut tre // cast en MethodeX car // Classe1 implmente MethodeX appelMethodeX (new Classe1 (), 5); } void appelMethodeXClasse2 () { // Appel de methodeX () de Classe2 appelMethodeX (new Classe2 (), 10); } }

void methodeX_2 (int i) { /* Corps de methodeX_2 () */ }

/* Mthode appelant la mthode */ /* de type methodeX */ void appelMethodeX (methodeX methode, int i) { methode (i); } void appelMethodeXClasse1 () { /* Appel de methodeX_1 () */ appelMethodeX (methodeX_1, 5); }

void appelMethodeXClasse2 () { /* Appel de methodeX_2 () */ appelMethodeX (methodeX_2, 10); }

Destruction des objets

Java gre de manire automatique pour le programmeur l'allocation dynamique de mmoire. La mmoire ncessaire la mmorisation de tout nouvel objet est alloue dynamiquement sa cration, et la mmoire qu'il occupe est automatiquement libre quand celui-ci n'est plus rfrenc par aucune variable du programme. Cette libration est ralise grce au Garbage Collector (littralement Ramasseur d'Ordure) fourni avec la Machine Virtuelle Java. Cette fonctionnalit trs pratique de Java simplifie normment la programmation, d'autant plus qu'elle implique que la notion de destructeur (mthode appele la destruction d'un objet
Programmer en java Page 62

Dao Issiaka- 3me anne SI

en C++, trs souvent utilise pour librer la mmoire utilise par un objet) est beaucoup moins utile en Java. Toutefois, Java fournit une mthode outrepasser dans vos classes si vous avez besoin d'effectuer certains traitements spcifiques la destruction d'un objet : void finalize (). Cette mthode est invoque juste avant que le Garbage Collector ne rcupre la mmoire occupe par l'objet. Normalement, vous ne l'utiliserez que rarement mais elle peut tre utile pour librer certaines ressources dont Java ne greraient pas directement la destruction (contextes graphiques, ressources ou mmoire allous par des mthodes native crites en C ou C++). Vous pouvez ventuellement indiquer la Machine Virtuelle qu'une rfrence var1 dsignant un objet n'est plus utile en la mettant null (var1 = null;), pour que le Garbage Collector puisse dtruire l'objet dsign par var1 si celui-ci n'est plus dsign par aucune rfrence. En java, la destruction des objets se fait automatiquement quand ils ne sont plus utiliss (rfrencs). L'oprateur delete du C++ servant dtruire explicitement les objets crs dynamiquement est donc inutile. En java, il n'existe pas de syntaxe prdfinie pour les destructeurs. Vous pouvez outrepasser la mthode finalize () pour "nettoyer" vos objets mais contrairement au destructeur du C++ o le destructeur est invoqu l'appel de delete (), finalize () est invoque automatiquement par le Garbage Collector quand un objet n'a plus aucune rfrence le dsignant et qu'il peut donc tre dtruit. Le moment prcis o va intervenir le Garbage Collector n'est pas prvisible, donc s'il vous faut effectuer des oprations obligatoires quand un objet devient inutile (effacement d'un dessin l'cran par exemple), c'est vous de crer une mthode que vous invoquerez au moment voulue (vous pouvez l'appeler delete () si vous voulez). Comme en C++, les objets Java sont allous dynamiquement leur cration via l'oprateur new. En Java, c'est le seul moyen d'allouer de la mmoire, donc il n'existe plus de fonctions telles que malloc (), realloc () ou free (). L'oprateur sizeof () servant surtout pour valuer la taille d'un objet allouer n'existe plus non plus. En C, sizeof () est utile aussi pour la portabilit d'un programme, car tous les types primitifs n'ont pas la mme taille suivant les systmes (int peut avoir une taille de 16 ou 32 bits, par exemple) : en Java, tous les types primitifs ont la mme taille.
Comment a marche ?

Pour mieux comprendre comment Java manipule les objets de leur cration leur destruction, voici une figure dcrivant la vie d'un objet :

Programmer en java

Page 63

Dao Issiaka- 3me anne SI

figure 7. La vie d'un objet Java de sa cration sa destruction

Ce programme trs simple vous montre la nuance trs importante entre une rfrence et un objet : un mme objet peut avoir n'importe quel nombre de rfrences le dsignant, mais une rfrence ne peut dsigner qu'un seul objet la fois. A tout moment, la Machine Virtuelle connat le nombre de rfrences (ou de variables) qui dsignent chacun des objets d'un programme : quand pour un objet, ce nombre devient nul, ceci signifie que plus aucune variable du programme ne dsigne cet objet. S'il n'existe plus de variable dsignant cet objet, le programme n'a donc plus de moyen de le manipuler, il est logique de le considrer comme inutile et de le supprimer. Pour vous montrer toute la puissance et l'intrt du Garbage Collector, voici un programme C et un programme Java mettant en oeuvre l'utilisation de listes chanes :
#include <stdlib.h> /* Dclaration d'un type de liste chane */ typedef struct _eltListe { int nombre; struct _eltListe *suivant; } EltListe,

// Dclaration d'une classe de liste chane public class ListeChainee { int nombre; ListeChainee suivant;

Programmer en java

Page 64

Dao Issiaka- 3me anne SI

*ListeChainee; /* Cre une liste d'lments ayant */ /* leur nombre compris entre min et max */ ListeChainee creerListe (int min, int max) { ListeChainee elt = (ListeChainee) malloc (sizeof (EltListe)); elt->nombre = min; if (min < max) elt->suivant = creerListe (min +1, max); else elt->suivant = NULL; return elt; } /* Enlve un lment individuel */ ListeChainee enleverElement (ListeChainee liste, int nombre) { ListeChainee eltCherche; ListeChainee eltPrecedent = NULL; /* Recherche de l'lment contenant */ /* le nombre */ for (eltCherche = liste; eltCherche != NULL; eltCherche = eltCherche->suivant) if (eltCherche->nombre != nombre) eltPrecedent = eltCherche; else { /* Suppression de l'element */ /* de la liste chane */ if (eltCherche == liste) liste = liste>suivant; else eltPrecedent->suivant = eltCherche// Construit une liste d'lments ayant // leur nombre compris entre min et max ListeChainee (int min, int max) {

nombre = min; if (min < max) suivant = new ListeChainee (min + 1, max); else suivant = null; }

// Enlve un lment individuel ListeChainee enleverElement (int nombre) { ListeChainee eltCherche; ListeChainee eltPrecedent = null; // Recherche de l'lment contenant // le nombre (this dsigne la tte // de liste elle-mme) for (eltCherche = this; eltCherche != null; eltCherche = eltCherche.suivant) if (eltCherche.nombre != nombre) eltPrecedent = eltCherche; else // Suppression de la rfrence sur // de l'element recherche, l'objet // peut donc tre supprim if (eltCherche == this) return this.suivant; else eltPrecedent.suivant = eltCherche.suivant; return this;

Programmer en java

Page 65

Dao Issiaka- 3me anne SI

>suivant; free (eltCherche); } return liste; } /* Libre la mmoire prise par tous */ /* les lments de la liste */ void viderListe (ListeChainee liste) { while (liste != NULL) { ListeChainee eltPrecedent = liste; liste = liste->suivant; free (eltPrecedent); } } void main () { ListeChainee liste = creerListe (1, 10); liste = enleverElement (liste, 8); viderListe (liste); }

} // void viderListe () // est inutile

public static void main (String [ ] args) { ListeChainee liste = new ListeChainee (1, 10); liste = liste.enleverElement (8); liste = null; } }

L'instruction liste = null entrane que l'unique rfrence sur l'objet de tte de liste est perdue, donc le Garbage Collector peut supprimer cet objet. Quand il le supprime, le champ suivant de cet objet est supprime et il n'existe plus de rfrence sur l'lment suivant. Ce dernier peut tre supprim son tour, ainsi de suite jusqu' qu'au dernier lment de la liste. Dans cet exemple, liste = null n'est mme pas obligatoire car la variable locale liste est supprime la sortie de la mthode main (), ce qui provoque les mmes effets. Une fois compris l'exemple prcdent, vous pouvez essayer de crer partir de celui-ci une classe de liste doublement chane (avec liens suivant et precedent). Si vous ne voulez pas croire en la magie, il vous faudra srement un certain temps pour faire confiance au Garbage Collector sans arrire pense. Ce type de gestion de la mmoire tant trs pratique, le rflexe de ne plus librer la mmoire explicitement comme en C/C++ (avec free () ou delete) s'acquire d'office, mais vous prendrez plus de temps comprendre comment vos objets sont dtruits dans telle ou telle situation. La meilleure piste pour rpondre vos interrogations, est de vous demander par combien de variables sont rfrencs le ou les objets sur lesquels vous avez des doutes. Si par enchanement, ce nombre tombe 0, vous pouvez oublier vos
Programmer en java Page 66

Dao Issiaka- 3me anne SI

doutes. Comme en Java, vous ne dtruisez pas explicitement les objets, toute rfrence est gale soit null soit elle dsigne un objet TOUJOURS valide. Vous ne pouvez pas avoir de risque de manipuler un objet qui n'existe plus comme dans le programme C suivant :
void fonction1 () { char *chaine = malloc (20); strcpy (chaine, "bonjour\n"); /* ... */ free (chaine); /* ... */ printf (chaine); }

En C, si dans un programme vous utilisez par erreur un pointeur aprs avoir libr l'espace mmoire qu'il dsigne, le compilateur ne vous indiquera aucune erreur. De plus, ce genre d'erreur est souvent difficile trouver. En Java, si vous essayez d'accder un objet par une rfrence gale null, une exception NullPointerException est dclenche.

Programmer en java

Page 67

Dao Issiaka- 3me anne SI

Objets, tableaux et chanes de caractres


La classe Object La classe Class Les tableaux Les chanes de caractres La classe String La classe StringBuffer La classe System

Ce chapitre prsente les principales classes du package java.lang et comment utiliser les tableaux en Java.
La classe Object

Java tant un langage pur objet, la premire classe tudier est naturellement la super classe dont hritent implicitement toute les autres (celles fournies avec Java et celles que vous crerez) : la classe Object. Cette classe comporte un petit nombre de mthodes, dont toutes les autres classes hritent et que certaines classes drives peuvent ventuellement outrepasser. Les classes diffrentes de la classe Object utilises par ces mthodes sont signales par des liens et seront dtailles ultrieurement.
Constructeur
public Object ()

Mthodes
public final Class getClass ()

Renvoie la classe d'un objet. A l'excution, chaque classe utilise dans un programme est reprsente par une instance de la classe Class.
public boolean equals (Object obj)

Renvoie true si les deux objets (l'objet sur lequel est invoqu equals () et obj) sont gaux, false sinon. Il faut entendre par gaux, s'ils dsignent le mme objet. Une classe doit outrepasser cette mthode, si elle veut que la signification de l'galit entre deux objets soit moins stricte, par exemple en comparant la valeur de leurs champs.
public int hashCode ()

Programmer en java

Page 68

Dao Issiaka- 3me anne SI

Renvoie un code entier utilis pour le stockage des objets dans les tables de hash (Hashtable). Si une classe outrepasse equals (), elle doit en gnral outrepasser aussi hashCode () pour renvoyer le mme code pour deux objets gaux par la mthode equals (). La condition inverse n'est pas obligatoire (deux objets peuvent renvoyer un code de hash identique mais tre diffrents par la mthode equals ()). La mthode hashCode () de la classe Object renvoie l'adresse d'un objet.
protected Object clone () throws CloneNotSupportedException

Duplique un objet. Un objet de la mme classe que l'objet sur lequel on invoque clone () est cr avec une copie de toutes ses champs. Renvoie le nouvel objet. Une exception OutOfMemoryError peut tre ventuellement dclenche en cas de mmoire insuffisante. L'exception CloneNotSupportedException est dclenche si la classe de l'objet clon ou une de ses super classes n'implmente pas explicitement l'interface Cloneable. La mthode clone () est protected donc pour pouvoir dupliquer un objet objet1 de classe Classe1 par l'expression objet1.clone (), Classe1 doit outrepasser clone () avec un modificateur d'accs public. Comme toutes les classes drivent de la classe Object, cette mthode n'est en fait utile pour les autres classes que pour crer un nouvel objet de mme classe et copier la valeur de tous les champs de l'original. Si un des champs recopis est une rfrence sur un objet, seule la rfrence est recopie et dsignera le mme objet. Donc, si vous voulez que les rfrences clones dsignent des objets diffrents, vous devez cloner ces objets vous mme, dans la mthode clone (). Voici un exemple d'utilisation de clone () :
class Classe0 implements Cloneable { double unNombre; public Object clone () throws CloneNotSupportedException { // Appel de la mthode clone () de la classe Object return super.clone (); } // ... } class Classe1 implements Cloneable { int var; Classe0 objet0 = new Classe0 (); public Object clone () throws CloneNotSupportedException { // Appel de la mthode clone () de la classe Object // puis clonage de objet0 Classe1 nouveau = (Classe1)super.clone (); // cast de Object vers Classe1 nouveau.objet0 = (Classe0)objet0.clone (); // cast de Object vers Classe0 return nouveau; } // ... }

Programmer en java

Page 69

Dao Issiaka- 3me anne SI

Il est possible de pas dclarer l'exception CloneNotSupportedException dans la clause throws de la mthode clone () pour viter d'obliger les utilisateurs intercepter cette exception.
public String toString ()

Renvoie une chane de caractres reprsentant la valeur d'un objet. Chaque classe devrait outrepasser cette mthode pour crer une chane reprsentant la valeur de leurs instances. La mthode toString () de la classe Object renvoie le nom de la classe de l'objet sur lequel on invoque cette mthode, suivi du caractre '@' et de la valeur en hexadcimal renvoye par hashCode ().
public final void notify () throws IllegalMonitorStateException public final void notifyAll () throws IllegalMonitorStateException public final void wait (long millis ) throws IllegalMonitorStateException, InterruptedException public final void wait (long millis, int nanos) throws IllegalMonitorStateException, InterruptedException public final void wait () throws IllegalMonitorStateException, InterruptedException

Ces mthodes sont utilises pour prvenir ou attendre des threads (tches) synchroniss sur l'accs un objet. millis dsigne un nombre de millisecondes et nanos un nombre de nanosecondes. wait (0) et wait (0, 0) sont quivalentes wait (). Ces mthodes seront dveloppes ultrieurement, dans le chapitre sur les threads. Notez qu'tant final, elles ne peuvent tre outrepasses dans les classes drives.
protected void finalize() throws Throwable

Cette mthode est invoque automatiquement avant qu'un objet soit dtruit par le Garbage collector. Les classes ayant des traitements spcifiques effectuer la destruction d'un objet, doivent outrepasser cette mthode. La mthode finalize () de la classe Object ne fait rien. Voir aussi la destruction d'objets. Toutes les classes Java hritent de la classe Object. Vous ne pouvez crer plusieurs hirarchies de classes comme en C++.
La classe Class

Cette classe final reprsente chacune des classes (et des interfaces) charges par la Machine Virtuelle Java, en faisant correspondre chaque classe une instance de classe Class.
Mthodes
public static Class forName (String className) throws ClassNotFoundException

Renvoie un objet de classe Class correspondant la classe ou l'interface de nom className. className doit tre un nom de classe complet avec package (comme par exemple java.lang.Object). Comme la classe Class n'a pas de constructeur public, les seules manires de rcuprer une instance de classe Class sont de passer par cette mthode ou la mthode getClass () de la classe Object.
Programmer en java Page 70

Dao Issiaka- 3me anne SI

public Object newInstance () throws InstantiationException, IllegalAccessException

Cre une nouvelle instance d'une classe. Cette mthode est moins pratique que l'oprateur new pour crer des objets car il faut intercepter les exceptions InstantiationException et IllegalAccessException que peut dclencher la mthode newInstance (). Associe la mthode forName (), elle est par contre trs utile pour instancier des objets d'une classe dont vous n'avez que le nom et qui a un constructeur sans paramtre, comme par exemple Class.forName ("java.lang.Object").newInstance () qui cre un objet de classe Object. Voir aussi la cration d'objets et l'application InstantiationAvecNom.
public ClassLoader getClassLoader ()

Renvoie le chargeur de classe utilis pour charger une classe ou null si c'est le chargeur par dfaut.
public String getName ()

Renvoie le nom complet d'une classe (avec son package).


public Class getSuperclass ()

Renvoie la super classe d'une classe.


public Class [ ] getInterfaces ()

Renvoie un tableau des interfaces implmentes par une classe. Si la classe n'implmente aucune interface ce tableau a une longueur nulle (length = 0).
public boolean isInterface ()

Renvoie true ou false suivant que l'objet sur lequel cette mthode est appele est une interface ou une classe.
public String toString ()

Cette mthode renvoie le nom de la classe ou de l'interface prcd des mots class ou interface. toString () outrepasse la mthode de la classe Object. La mthode equals () de la classe Object n'est pas outrepasse dans cette classe car c'est inutile : Comme chaque classe charge par la Machine Virtuelle correspond une instance de la classe Class unique, vous pouvez comparez deux objets de classe Class directement avec l'oprateur == ou !=. A partir de Java 1.1, cette classe a t trs enrichie et comporte des mthodes qui permettent d'interroger tous les champs, les mthodes et les contructeurs d'une classe.
Les tableaux

Comme tout type qui n'est pas un type primitif, les tableaux sont des objets allous dynamiquement.
Programmer en java Page 71

Dao Issiaka- 3me anne SI

Les lments du tableau peuvent tre d'un type primitif, d'une classe ou d'une interface, et le tableau lui-mme hrite de la classe Object et de toutes ses mthodes. Comme en C, un tableau contenant n lments, a son premier lment l'indice 0 et son dernier l'indice n-1. Une rfrence table qui dsigne un tableau peut accder au champ length de ce tableau (table.length) pour dterminer le nombre d'lments mmoriss dans celui-ci. Exemple de dclarations et de crations de tableaux :
class Classe1 { // Dclaration de rfrences sur des tableaux int [ ] tableEntiers; float tableFloats [ ]; // Les crochets peuvent tre avant ou aprs la variable Object [ ] tableObjets; Cloneable [ ] tableClonaeable; // Cration de tableaux int [ ] tableEntiers2 = new int [5]; Object [ ] tableObjets2 = new Object [10]; Cloneable [ ] tableClonaeable2 = new Cloneable [10]; // Cration d'un tableau de longueur nulle int [ ] tableauVide = new int [0]; // Cration de tableaux initialiss long [ ] tableLongs = {1L, 2L, 5L}; Classe1 objet1 = new Classe1 (); Classe1 [ ] tableObjets3 = {objet1, new Classe1 (), null}; short [ ][ ] tableShorts = {{1, 2}, {1, 2, 3}, null, {0}}; int [ ] tableauVide2 = {}; }

A partir de Java 1.1, les mthodes static newInstance () de la classe java.lang.reflect.Array permettent aussi de crer des tableaux comme dans l'exemple suivant :
import java.lang.reflect.*; public class ClasseJava11 { public static void main (String [] args) throws ClassNotFoundException { // Autre possibilit de cration de tableaux partir de Java 1.1 Object tableEntiers = Array.newInstance (int.class, 5); float [] tableFloats = (float [])Array.newInstance (float.class, 2); Object tableObjets = Array.newInstance (Class.forName ("java.lang.Object"), 10); } }

Un tableau peut tre cr avec une longueur nulle. Quel en est l'intrt ?

Certaines mthodes comme getInterfaces () de la classe Class renvoie un tableau qui peut n'avoir aucun lment. Aprs avoir appel une telle mthode, vous n'aurez pas tester

Programmer en java

Page 72

Dao Issiaka- 3me anne SI

si la rfrence renvoye est gale null avant de lancer une boucle sur les n lments du tableau renvoy. Si table dsigne un tableau de longueur nulle, on peut connatre la classe du tableau grce table.getClass () mais pas si table est gal null.

Une fois qu'un tableau est cr, sa taille ne peut tre modifie ; par contre, la classe System du package java.lang fournit la mthode arraycopy () permettant de copier une partie d'un tableau dans un autre, et la classe Vector du package java.util est idale pour manipuler des tableaux de taille variable. Les valeurs d'un tableau cr grce l'oprateur new sont initialises leur valeur par dfaut. Dans un soucis de scurit, Java vrifie si les tableaux sont manipuls correctement :

Si l'accs un lment i (grce table [i]) est invalide (i < 0 ou i >= table.length), Java dclenche une exception ArrayIndexOutOfBoundsException. Si la cration d'un tableau, la taille requise est ngative une exception NegativeArraySizeException est dclenche. Si vous tentez de stocker dans un tableau un lment incompatible avec ceux du tableau, une exception ArrayStoreException est dclenche.

Java permet de crer les tableaux multi-dimensionnels de deux manires diffrentes : vous pouvez crer un tableau directement avec plusieurs dimensions ou crer vous mme les sous tableaux, un par un, comme dans l'exemple suivant, permettant de crer un tableau de taille dim1 x dim2 initialis avec valeurDefaut :
class Classe1 { public int [ ][ ] methode1 (int dim1, int dim2) { int [ ][ ] table1 = new int [dim1][dim2]; // Cration d'un tableau dim1 x dim2 return table1; } public int [ ][ ] methode2 (int dim1, int dim2, int valeurDefaut) { int [ ][ ] table1 = new int [dim1][ ]; // Cration de la premire dimension int i, j; for (i = 0; i < dim1; i++) { table1 [i] = new int [dim2]; // Cration de la deuxime dimension for (j = 0; j < dim2; j++) table1 [i][j] = valeurDefaut; } return table1; } }

L'avantage de ce systme est que vous pouvez crer des sous tableaux de dimensions diffrentes (pour crer un triangle de Pascal, par exemple).

Programmer en java

Page 73

Dao Issiaka- 3me anne SI

Il est possible d'interroger la classe d'un tableau et le nom de cette classe, grce aux mthodes getClass () de la classe Object et getName () de la classe Class. Ce nom est construit avec en tte autant de caractre [ que le nombre de dimensions du tableau suivi soit du caractre L, du nom de la classe ou de l'interface complet et d'un point virgule (;) si le tableau mmorise des rfrences sur des objets, soit d'un des caractres suivant si le tableau mmorise des valeurs d'un des types primitifs : Caractre
B C D F I J L S Z

Type des lments du tableau


byte char double float int long

classe ou interface
short boolean

Par exemple, (new Object [3]).getClass ().getName () renvoie "[Ljava.lang.Object;" et (new double [0][0]).getClass ().getName () renvoie "[[D". Avec Java 1.0, il est impossible de crer une nouvelle instance d'un tableau, en connaissant sa classe et en utilisant la mthode newInstance () de la classe Class. Par exemple, si vous excutez l'instruction (new int [2]).getClass ().newInstance (), une exception InstantiationException sera dclenche. A partir de Java 1.1, l'utilisation des mthodes static newInstance () de la classe java.lang.reflect.Array, permet de rsoudre ce problme, comme dans l'exemple
Array.newInstance (Class.forName ("java.lang.Object"), 5).

Les tableaux implmentent implicitement l'interface Cloneable et outrepasse la mthode de la classe Object sans dclencher d'exception CloneNotSupportedException, ce qui permet de les dupliquer facilement en une instruction. Si le tableau comporte plus d'une dimension, il faut dupliquer aussi les sous-tableaux pour obtenir une copie complte, comme dans l'exemple :
clone () class Classe1 { void methode1 () { int [ ][ ] table = {{15, 20, 30}, { 5, 10, 15}}; // Duplication de la premire dimension int [ ][ ] tableClone = (int [][])table.clone (); int i; for (i = 0; i < table.length; i++) // Duplication des sous tableaux
Programmer en java Page 74

Dao Issiaka- 3me anne SI

tableClone [i] = (int [])table [i].clone (); } }

La cration d'un tableau de n objets ne cre pas n instances pour les n lments du tableau, mais uniquement n rfrences des objets. C'est vous d'affecter chacune de ces rfrences, soit un nouvel objet crer, soit un objet existant. De mme, la duplication d'un tableau de n objets avec la mthode clone () de la classe Object, ne cre aucune copie des objets qu'il contient.

Les tableaux sont une sorte de classe final (pas drivable) en Java. Ils sont d'un abord plus simple qu'en C, langage dans lequel ils peuvent tre utiliss comme des pointeurs, ce qui sme souvent la confusion chez les dbutants. Les tableaux Java sont allous dynamiquement. Ils comportent un champ length indiquant le nombre d'lments du tableau et Java vrifie les dpassements d'indice quand on accde un lment. Les tableaux tant des objets, il est possible de crer des tableaux de longueur nulle. L'instruction Object [ ] table = { }; cre un tableau qui ne contient aucun objet et qui est dsign par la rfrence tab. Par contre l'instruction Object [ ] table = null; initialise la rfrence tab null sans crer d'objet. L'accs aux tableaux tant en Java, bien protg par les exceptions, l'impossibilit de pouvoir surcharger l'oprateur [ ], comme en C++, ne s'avre pas si importante.
Les chanes de caractres

Les chanes de caractres sont reprsentes en Java par les classes String ou StringBuffer. Ces deux classes ne jouent pas exactement le mme rle :
String est utilis pour reprsenter les chanes de caractres constantes, qui peuvent tre

partages sans risque par plusieurs threads, puisque leur contenu ne peut pas tre chang. StringBuffer est utilis pour les chanes de caractres dont on veut modifier le contenu.

Toutes les chanes de caractres Java mmorisent des caractres de type char, donc des caractres Unicode cods sur 16 bits. Les objets de classe String peuvent tre initialiss directement avec une chane de caractres, sans passer par le constructeur :
class Classe1 { // Deux manires diffrentes de crer un objet // de classe String avec la chane "Bonjour" String chaine1 = "Bonjour"; String chaine2 = new String ("Bonjour"); }

Les chanes de caractres Java peuvent utiliser l'oprateur + pour effectuer des concatnations. De plus, l'oprateur + peut convertir automatiquement les valeurs littrales

Programmer en java

Page 75

Dao Issiaka- 3me anne SI

et les objets (en appelant leur mthode toString ()), pour fabriquer une chane, comme dans l'expression suivante :
"Bonjour au numro " + 1 + " et l'objet " + unObjet

Si unObjet est gal null, la chane de conversion est "null". En fait, le compilateur convertit les oprateurs + utiliss en appel aux diffrentes mthodes append () de la classe StringBuffer. La concatnation intervient aussitt qu'un des deux oprandes de l'oprateur + est de classe String, que ce soit une chane de caractres entre guillemets "abc" ou un objet de classe String. Pour les objets des autres classes, utilisez la mthode toString () pour obtenir une chane de caractres, et pour les variables de type primitif utilisez les mthodes static valueOf () de la classe String. En Java, les chanes de caractres sont reprsentes par deux classes, l'une String pour les chanes constantes, l'autre StringBuffer pour les chanes modifiables. A la diffrence du C, elles ne sont pas une application particulire des tableaux et ne se terminent pas par le caractre nul ('\u0000'). L'oprateur + permet d'effectuer la concatnation de chanes, de valeurs littrales et d'objets. Adieu strcat (), strcpy () et compagnie ! Les oprateurs << et >> utiliss sur les streams pour fabriquer plus facilement des chanes en C++, ont leur quivalent avec l'oprateur + sur les chanes de caractres en Java.
La classe String

La classe String qui est final comporte de nombreuses mthodes. En voici la liste (quelques mthode mineures ont t ajoutes partir de Java 1.1) :
Constructeurs
public String (String value)

Construit une nouvelle chane qui est la copie de value.


public String (char value [ ])

Construit une nouvelle chane initialise avec la suite de caractres donnes dans le tableau value.
public String (byte ascii [ ], int hibyte)

Construit une nouvelle chane initialise avec la suite d'octets donne dans le tableau ascii ; chaque caractre ASCII du tableau ascii est transform en un caractre Unicode, en utilisant hibyte pour la partie haute du caractre. Autres constructeurs :
public String () public String (char value [ ], int offset, int count) throws IndexOutOfBoundsException public String (byte ascii [ ], int hibyte, int offset, int count)
Programmer en java Page 76

Dao Issiaka- 3me anne SI

throws IndexOutOfBoundsException public String (StringBuffer buffer)

Mthodes
public int length ()

Renvoie la longueur de la chane, c'est dire le nombre de caractres Unicode de la chane.


public char charAt (int index)

Renvoie le caractre l'indice index (index est compris entre 0 et length () - 1).
public void getChars (int srcBegin, int srcEnd, char dst [ ], int dstBegin) throws IndexOutOfBoundsException public void getBytes (int srcBegin, int srcEnd, byte dst [ ], int dstBegin) throws IndexOutOfBoundsException public char [ ] toCharArray ()

Ces mthodes permettent de rcuprer dans le tableau dst les caractres de la chane, de l'indice srcBegin jusqu' srcEnd (non compris).
public int hashCode ()

Cette mthode outrepasse la mthode hashCode () de la classe Object, pour renvoyer un code diffrent si deux chanes de caractres sont diffrentes.
public boolean equals (Object anObject)

Cette mthode outrepasse la mthode equals () de la classe Object, pour renvoyer true si anObject est de la classe String, et si les deux chanes de caractres sont les mmes.
public boolean equalsIgnoreCase (String anotherString)

Comme equals () mais la comparaison est faite sans tenir compte des majuscules/minuscules des chanes compares.
public int compareTo (String anotherString)

Compare une chane de caractres avec anotherString. Renvoie une valeur ngative, nulle, ou positive suivant que la chane de caractre est respectivement plus petite, gale ou plus grande que anotherString.
public boolean regionMatches (int toffset, String other, int ooffset, int len) public boolean regionMatches (boolean ignoreCase, int toffset, String other, int ooffset, int len) public boolean startsWith (String prefix, int toffset) public boolean startsWith (String prefix) public boolean endsWith (String suffix)

Ces mthodes permettent de comparer une partie d'une chane de caractres une autre (entre deux indices, au dbut ou la fin).
public int indexOf (int ch)
Programmer en java Page 77

Dao Issiaka- 3me anne SI

public public public public public public public

int int int int int int int

indexOf (int ch, int fromIndex) lastIndexOf (int ch) lastIndexOf (int ch, int fromIndex) indexOf (String str) indexOf (String str, int fromIndex) lastIndexOf(String str) lastIndexOf (String str, int fromIndex)

Renvoient l'indice de la premire ou la dernire occurrence d'un caractre ch ou d'une chane str dans une chane de caractres, ou -1 si aucune occurrence n'a pas t trouve.
public String substring (int beginIndex) public String substring (int beginIndex, int endIndex)

Renvoient une sous-chane d'une chane de caractres, partir de l'indice beginIndex ou entre les deux indices beginIndex et endIndex (endIndex exclu).
public String concat (String str)

Renvoie la chane, rsultat de la concatnation de str la fin d'une chane de caractres.


public String replace (char oldChar, char newChar)

Renvoie une chane o tous les caractres oldChar sont convertis en newChar.
public String toLowerCase () public String toUpperCase ()

Renvoie une chane o tous les caractres majuscules sont convertis en minuscules, et inversement.
public String trim ()

Renvoie une chane o tous espaces en tte et en queue d'une chane de caractres sont supprims.
public static String valueOf (char data [ ]) public static String valueOf (char data [ ], int offset, int count) throws IndexOutOfBoundsException

Ces mthodes permettent de crer des chanes de caractres partir de tableaux de caractres.
public static String valueOf (Object obj)

Renvoie une chane reprsentant la valeur de obj sous forme de chane de caractres. En fait, quivalent obj.toString ().
public public public public public public static static static static static static String String String String String String valueOf valueOf valueOf valueOf valueOf valueOf (boolean b) (char c) (int i) (long l) (float f) (double d)

Programmer en java

Page 78

Dao Issiaka- 3me anne SI

Renvoie une chane de caractres correspondant la valeur des types par dfaut (voir aussi les classes Integer, Long, Float et Double qui fournissent des mthodes pour convertir un nombre en une chane de caractres et inversement).
public String intern () public String toString ()

Mthode de la classe Object, outrepasse pour qu'elle renvoie la chane de caractres.


La classe StringBuffer

La classe StringBuffer contrairement la classe String, utilise un buffer de taille variable pour mmoriser une chane de caractres modifiables. Cette classe final maintient ellemme l'allocation d'espace supplmentaire pour mmoriser des caractres supplmentaires. Voici la liste des mthodes de cette classe :
Constructeurs
public StringBuffer ()

Construit une chane vide.


public StringBuffer (int length) throws NegativeArraySizeException

Construit une chane vide, avec une taille initiale length.


public StringBuffer (String str)

Construit une chane initialise avec la chane str.


Mthodes
public int length ()

Renvoie le nombre de caractres mmoriss dans de la chane.


public int capacity ()

Renvoie la capacit courante de la chane, reprsentant le nombre de caractres qu'il est possible d'insrer, avant qu'il ne soit allou de l'espace supplmentaire.
public synchronized void ensureCapacity (int minimumCapacity)

Permet de s'assurer, que la chane une capacit d'au moins minimumCapacity caractres supplmentaires.
public synchronized void setLength (int newLength) throws IndexOutOfBoundsException

Modifie la taille de la chane. Si la chane actuellement mmorise est plus longue, elle sera tronque. Les caractres ventuellement ajouts sont nuls ('\u0000'), pour que length () renvoie la valeur newLength.
Programmer en java Page 79

Dao Issiaka- 3me anne SI

public synchronized char charAt (int index) throws IndexOutOfBoundsException

Renvoie le caractre mmoris l'indice index (valeur comprise entre 0 et length () - 1).
public synchronized void getChars (int srcBegin, int srcEnd, char dst [ ], int dstBegin) throws IndexOutOfBoundsException

Copie l'indice dstBegin du tableau dst les caractres compris entre les indices srcBegin et srcEnd.
public synchronized void setCharAt (int index, char ch) throws IndexOutOfBoundsException

Change par ch le caractre l'indice index de la chane.


public synchronized StringBuffer append (Object obj) public synchronized StringBuffer append (String str) public synchronized StringBuffer append (char str [ ])

Ajoute en fin de chane un objet, une chane ou un tableau de caractres.


public synchronized StringBuffer append (char str [ ], int beginIndex, int length) throws IndexOutOfBoundsException

Ajoute en fin de chane les caractres du tableau str, compris entre beginIndex et beginIndex + length - 1.
public public public public public public synchronized StringBuffer StringBuffer StringBuffer StringBuffer StringBuffer StringBuffer append (char c) append (boolean b) append (int i) append (long l) append (float f) append (double d)

Ajoute en fin de chane la valeur d'un type primitif convertie en chane.


public synchronized StringBuffer insert (int offset, Object obj) throws IndexOutOfBoundsException public synchronized StringBuffer insert (int offset, String str) throws IndexOutOfBoundsException public synchronized StringBuffer insert (int offset, char str [ ]) throws IndexOutOfBoundsException

Insre l'indice offset d'une chane un objet, une chane ou un tableau de caractres.
public synchronized StringBuffer insert (int offset, char c) throws IndexOutOfBoundsException public StringBuffer insert (int offset, boolean b) throws IndexOutOfBoundsException public StringBuffer insert (int offset, int i) throws IndexOutOfBoundsException public StringBuffer insert (int offset, long l) throws IndexOutOfBoundsException
Programmer en java Page 80

Dao Issiaka- 3me anne SI

public StringBuffer insert (int offset, float f) throws IndexOutOfBoundsException public StringBuffer insert (int offset, double d) throws IndexOutOfBoundsException

Insre l'indice offset d'une chane la valeur d'un type primitif convertie en chane.
public synchronized StringBuffer reverse ()

Inverse les caractres d'une chane.


public String toString ()

Mthode de la classe Object, outrepasse pour qu'elle renvoie la chane de caractres mmorise. Les mthodes append (), insert () et reverse () renvoie l'objet de classe StringBuffer lui-mme, une fois modifi.
La classe System

Cette classe final permet d'accder diffrentes fonctionnalits du systme de la Machine Virtuelle Java, et comporte plusieurs champs et mthodes trs utiles. Tous les champs et les mthodes de cette classe sont static. Les champs in, out et err permettent de sortir ou de lire sur l'entre et la sortie standard ; out est particulirement pratique pour imprimer des chanes au moment du debug des applications Java avec java, ou des applets avec appletviewer ou avec certains navigateurs (Microsoft Internet Explorer et Netscape Navigator vous permettent d'afficher la fentre de sortie standard Java dans la fentre console Java). Alors, n'hsitez pas utiliser out pour vrifier les variables ou les points de passage d'un programme (par exemple en appelant System.out.println ()), surtout si vous cherchez les bugs dans un programme multi-threads, situation o il est difficile de positionner des points d'arrts (breakpoints).
Champs
public static InputStream in

Entre standard pour saisir des caractres.


public static PrintStream out

Sortie standard pour crire des messages.


public static PrintStream err

Sortie standard des erreurs pour crire des messages d'erreurs.


Mthodes
public static void arraycopy (Object source, int srcOffset, Object dest, int dstOffset, int length) throws ArrayStoreException, IndexOutOfBoundsException
Programmer en java Page 81

Dao Issiaka- 3me anne SI

Copie les length lments du tableau source partir de l'indice srcOffset dans le tableau dest l'indice dstOffset. Si les tableaux source et dest dsignent le mme tableau, le traitement effectu permet d'viter que certaines informations soient perdues (au cas o les intervalles se recouvrent). Une exception ArrayStoreException est dclenche s'il n'est pas possible de stocker un lment de source dans dest avec un cast implicite.
public static long currentTimeMillis ()

Renvoie le temps courant en millisecondes coul depuis le 1er Janvier 1970.


public static void exit (int status) throws SecurityException

Quitte la Machine Virtuelle Java avec le code de sortie status.


public static void gc ()

Lance volontairement le Garbage Collector.


public static void runFinalization ()

Permet volontairement d'appeler la mthode finalize () des objets qui ne sont plus rfrencs.
public static SecurityManager getSecurityManager () public static void setSecurityManager (SecurityManager s) throws SecurityException

Permet d'obtenir ou de changer le gestionnaire de scurit. setSecurityManager () ne peut tre appel qu'une seule fois.
public static String getProperty (String property) throws SecurityException public static String getProperty (String property, String default) throws SecurityException

Permet d'obtenir une des proprits du systme (si le gestionnaire de scurit le permet). Si la proprit property n'existe pas, default est renvoye. Voici la liste des diffrentes proprits dfinies dans Java 1.0 : java.version, java.vendor, java.vendor.url, java.home, java.class.version,
java.class.path os.name, os.arch, os.version file.separator, path.separator, line.separator user.name, user.home, user.dir

Les valeurs par dfaut des proprits du systme peuvent tre modifies directement au lancement de la Machine Virtuelle en utilisant une ou plusieurs options -Dpropriete=valeur avec la commande java.
public static Properties getProperties () throws SecurityException public static void setProperties (Properties props) throws SecurityException

Programmer en java

Page 82

Dao Issiaka- 3me anne SI

Permet d'obtenir ou de modifier toutes les proprits du systme.


public static void load (String filename) throws SecurityException, UnsatisfiedLinkError public static void loadLibrary (String libname) throws SecurityException, UnsatisfiedLinkError

Permet de charger un fichier de code ou une librairie (qui implmentent par exemple des mthodes native d'une classe). A partir de Java 1.1, cette classe dclare notamment les mthodes setIn (), setOut () et setErr () qui permettent de rediriger l'entre et les sorties standards. L'application suivante vous permet d'avoir un aperu des proprits courantes de votre Machine Virtuelle. Recopiez la dans un fichier SystemProperties.java, que vous compilez avec l'instruction javac SystemProperties.java pour ensuite l'excuter avec java ou Java Runner, grce l'instruction java SystemProperties :
public class SystemProperties { public static void main (String [ ] args) { System.getProperties ().list (System.out); } }

Programmer en java

Page 83

Dao Issiaka- 3me anne SI

Les instructions et les oprateurs


Les blocs
if ... else, switch while, do ... while, for

Les expressions Les oprateurs Les conversions (casts) Priorit des oprateurs

Les blocs

Vous allez pouvoir parcourir trs rapidement ce chapitre si vous connaissez dj le C ou le C++ : C'est surtout ce niveau que Java et le C se ressemblent le plus car leur jeu d'instructions et d'oprateurs sont trs proches. Un bloc se note entre { } et est un ensemble de dclarations de variables locales, d'instructions (if, switch, while, do, for, try, throw, synchronized ou return), d'affectations, d'appels de mthode ou de crations d'objets dans un ordre quelconque. A partir de Java 1.1, un bloc peut aussi dclarer n'importe o des classes internes :
{ TypeVariable TypeVariable TypeVariable TypeVariable variableLocale1; variableLocale2 = valeurOuExpression; variableLocale3 [ ]; variableLocale4, variableLocale5;

// Instructions if, switch, do, while, for, try, throw, synchronized ou return // ou affectations, appels de mthode ou cration d'objets suivis de points virgules ; // A partir de Java 1.1 : dclaration de classes internes }

Une instruction peut tre ventuellement vide (ne rien faire) : dans ce cas, elle se note ; . Ce type d'instruction est quelques fois utilis comme corps des instructions de boucles. TypeVariable est soit un type primitif, soit le nom d'une classe. A partir de Java 1.1, une variable locale ou un paramtre peut tre dclar final, pour garantir que la valeur qu'ils contiennent ne sera pas modifie. Une variable locale ne peut tre dclare deux fois avec le mme nom l'intrieur d'un mme bloc, ni porter le mme nom qu'un des paramtres d'une mthode. De plus, dans le cas d'un
Programmer en java Page 84

Dao Issiaka- 3me anne SI

bloc imbriqu dans un autre, une variable locale ne peut porter le mme nom qu'une autre variable dclare dans le bloc externe. Une variable locale (ou un paramtre d'une mthode) variable1 dclare dans un bloc d'une classe Classe1 peut porter le mme nom qu'un champ de Classe1. Dans ce cas, le champ variable1 de Classe1 est cach par la variable locale variable1. Si vous voulez faire rfrence au champ de la classe dans le bloc, vous pouvez utiliser l'expression Classe1.variable1, si variable1 est un champ de classe (static), ou l'expression this.variable1 si variable1 est un champ d'instance. L'utilisation de this est dveloppe plus loin dans ce chapitre. Toute variable locale variable1 dclare dans une classe Classe1 peut porter le mme nom qu'une mthode de Classe1 ou le mme nom qu'une classe. Une fois que le contrle quitte un bloc, toutes les variables locales qui y ont t dclares n'existent plus. Par consquent, dans un bloc, la porte d'une variable locale est limite entre le point o elle est dclare et la fin de ce bloc. De faon similaire, les classes internes ont la mme porte que des variables locales. Les variables locales en Java, sont toutes "automatiques" : Elles sont dtruites une fois sorties du bloc dans lequel elles sont dclares. Les mots cl du C auto et register n'existent pas, et static ne peut pas tre utilis pour les variables locales. Les variables locales du C/C++ alloues sur la pile d'excution de type struct, union ou class doivent tre remplaces par des rfrences qui dsignent des objets crs dynamiquement avec l'oprateur new. Leur destruction se fera automatiquement non la sortie du bloc, mais grce l'intervention du Garbage Collector. Les variables locales peuvent tre dclares n'importe o l'intrieur d'un bloc, comme en C++. Si une variable locale est utilise avant d'tre initialise, ceci provoque une erreur de compilation et pas seulement un warning comme en C/C++. Contrairement au C, une variable locale dclare dans un bloc d'une mthode methode1 () ne peut porter le mme nom qu'un des paramtres de methode1 () ou qu'une des variables locales dclares l'extrieur de ce bloc. Les variables locales ne peuvent cacher qu'un champ de classe ou d'instance. C'est dire l'exemple suivant provoquera des erreurs la compilation :
class Classe1 { int var; void methode1 (int var) // Pas d'erreur { //... { int var; // Erreur : var existe dj comme paramtre //... } } void methode2 () { int var; // Pas d'erreur //... {
Programmer en java Page 85

Dao Issiaka- 3me anne SI

int var; // Erreur : var existe dj comme variable locale int var2; //... } // Aprs l'accolade fermante var2 n'existe plus. //... { int var2; // Pas d'erreur : var2 n'est pas dclare // dans le bloc externe //... } } } if ... else, switch

Les instructions if et switch ont la mme syntaxe qu'en C/C++, c'est--dire :


if (expressionBooleenne) instructionOuBlocSiVrai if (expressionBooleenne) instructionOuBlocSiVrai else instructionOuBlocSiFaux switch (expressionEntiere) { case expressionConstante1 : instructionOuBlocCas1 break; // ou return; ou rien pour passer au case suivant case expressionConstante2 : instructionOuBlocCas2 break; // ou return; ou rien pour passer au case suivant // ... default : instructionOuBlocParDefaut break; // ou return; }

Si les expressions expressionConstantei qui suivent chaque case ne sont pas constantes, vous devez utiliser l'instruction if.
instructionOuBloc... peut ventuellement contenir les instructions return; ou return valeur; pour sortir de la mthode courante (valeur doit tre du type de retour de la

mthode). Il existe une diffrence entre le C et Java pour l'instruction if (expression) : expression doit tre obligatoirement du type boolean ; Donc, une condition comme if (x = y - 1) ... ne gnrera pas un warning (avec certains compilateurs C) mais une erreur de compilation en Java. Cette obligation alourdit peut tre l'criture mais en amliore la lisibilit.
while, do ... while, for

Les instructions de boucles ont la mme syntaxe qu'en C/C++, c'est--dire :


Programmer en java Page 86

Dao Issiaka- 3me anne SI

while (expressionBooleenne) instructionOuBloc

Tant que l'expression expressionBooleenne est true, l'instruction ou le bloc d'instruction instructionOuBloc est excut.
do instructionOuBloc while (expressionBooleenne);

Comme pour l'instruction while, mais l'instruction ou le bloc d'instruction instructionOuBloc est excut au moins une fois, puisque expressionBooleenne est vrifie aprs la premire excution de instructionOuBloc.
for (expressionInit; expressionBooleenne; expressionIncrementation) instructionOuBloc for (TypeVariable variableLocale = valeurOuExpression; expressionBooleenne; expressionIncrementation) instructionOuBloc expressionInit

est excut puis tant que expressionBooleenne est true, l'instruction ou le bloc d'instruction instructionOuBloc puis expressionIncrementation sont excuts. peut ventuellement contenir les instructions suivantes :

instructionOuBloc

break; pour sortir de la boucle courante. continue; pour retourner au while ( ) ou au for ( ) courant sans terminer instructionOuBloc. return; ou return valeur; pour sortir de la mthode courante (valeur doit tre du

type de retour de la mthode).

L'quivalent de l'instruction for avec while est comme suit :


{ expressionInit; while (expressionBooleenne) { instructionOuBloc; expressionIncrementation; } }

Cette quivalence est vraie sauf si instructionOuBloc contient l'instruction continue. En effet, aprs l'excution d'un continue dans instructionOuBloc, l'instruction suivante tre excute est l'expression expressionIncrementation de l'instruction for, tandis que pour l'instruction while c'est l'expression expressionBooleenne. La premire instruction du for expressionInit, peut comporter la dclaration de plusieurs variables du mme type, spares par des virgules (,) ; la porte de ces variables est limite aux expressions de l'instruction for et instructionOuBloc. La troisime instruction
Programmer en java Page 87

Dao Issiaka- 3me anne SI

expressionIncrementation peut elle aussi, tre un ensemble d'instructions spares par des virgules (,), comme dans l'exemple suivant manipulant deux indices dans un mme for : class Classe1 { int [ ] factorielles (int max) { // Cration d'un tableau de max lments int [ ] tableau = new int [max]; // Initialisation du tableau avec les max premires factorielles for (int i = 0, fact = 1; i < max; i++, fact = fact * i) tableau [i] = fact; return tableau; } }

Comme pour if, l'expression dterminant la poursuite d'une boucle while ou for doit tre du type boolean. for permet de dclarer une ou plusieurs variables locales, qui servent gnralement d'incrments comme dans l'exemple : for (int i = 0; i < 5;
i++) table [i] = 0;

Les expressions

Une expression peut prendre une des formes suivantes :


Une valeur littrale d'un des types primitifs. Un accs une variable locale au bloc ou un paramtre d'une mthode, de la forme variable1. Un accs un champ, de la forme champ1 ou expression.champ1. expression est soit une classe ou une interface si champ1 est un champ de classe (static), soit une rfrence sur un objet de Classe1 si champ1 est un champ d'instance de la classe Classe1 ou d'une des super classes de Classe1. Une expression pour accder un lment d'un tableau, de la forme tab [expression2] ou expression.tab [expression2], o expression2 doit tre une expression convertible en int. tab peut tre une variable locale, un champ de classe, ou un champ d'instance. this, super ou null. Une expression de cration de tableau, utilisant l'oprateur new, de la forme new typeOuClasse [expression]. Une conversion avec l'oprateur de cast, de la forme (typeOuClasse)expression. Une expression boolenne utilisant l'oprateur instanceof, de la forme objet instanceof Classe1. Une expression utilisant un oprateur arithmtique unaire (opunaire expression) ou binaire (expression1 opbinaire expression2).

Les expression suivantes peuvent tre utilises comme expression ou comme instruction, si elles sont suivies d'un point virgule (;) :

Une expression utilisant un des oprateurs arithmtiques unaires ++ ou --, de la forme ++variable1, --variable1, variable1++ ou variable1--.

Programmer en java

Page 88

Dao Issiaka- 3me anne SI

Un appel une mthode, de la forme methode (arg1, arg2, ...) ou expression.methode (arg1, arg2, ...). expression est soit une classe ou une interface si methode () est une mthode de classe (static), soit une rfrence sur un objet de Classe1 si methode () est une mthode d'instance de Classe1 ou d'une des super classes de Classe1. Chacun des arguments peut tre bien sr une expression. Si methode () est surcharge, la mthode appele sera celle dont la dclaration correspond au type des arguments. Si methode () est outrepasse, la mthode appele par l'expression objet.methode () sera la mthode methode () de la classe d'appartenance de objet. Une expression de cration d'objet, utilisant l'oprateur new, de la forme new Classe (argConstructeur). Si Classe a plusieurs constructeurs qui sont surcharges, le constructeur appel sera celui dont la dclaration correspond au type des arguments. Une affectation avec l'oprateur = ou les oprateurs d'affectation composs op= (ou op peut tre un des oprateurs suivants : *, /, %, +, -, <<, >>, >>>, &, ^ ou |). Dans ce cas, l'expression x op= y est quivalente x = x op y.

Contrairement au C/C++, lors de l'appel d'une mthode en Java, les arguments sont obligatoirement valus l'un aprs l'autre de gauche droite avant d'tre passs la mthode. Ceci permet d'viter des effets de bords imprvisibles. Par exemple, l'expression methode (i = 1, i++, ++i) sera value comme methode (1, 1, 3). A part les appels aux mthodes, les crations d'objet, les affectations, l'utilisation des oprateurs ++ et --, toutes les expressions Java doivent tre utilises (comme argument ou comme valeur affecter, par exemple). Vous ne pouvez crire val1 * val2; tout seul. Ceci permet de reprer des erreurs d'critures du type i == 0; qui ne font rien (suite une opration Copier/Coller trop rapide). L'oprateur virgule (,) de sparation d'instructions du C, n'existe pas en Java, except pour ventuellement la premire et la troisime instruction d'un for, et pour sparer la dclaration de plusieurs variables de mme type (comme par exemple int x, y;). Vous pouvez trs bien l'viter en rassemblant les instructions dans un bloc.

Les expressions constantes utilises aprs un case ou pour initialiser les constantes d'une interface, sont des expressions ne pouvant utiliser que des oprateurs arithmtiques avec des valeurs littrales ou des champs ou variables locales final initialises avec des expressions constantes.
Utilisation de this et de super

Si dans une mthode non static methode1 () d'une classe Classe1, vous avez besoin d'une rfrence de l'objet sur lequel methode1 () a t invoqu, vous pouvez utiliser le mot cl this. Ceci est illustr dans l'exemple suivant :
class Classe1 { boolean methode1 () {
Programmer en java Page 89

Dao Issiaka- 3me anne SI

return equals (this); } } class Classe2 { void methode () { Classe1 objet1 = new Classe1 (); objet1.methode1 (); } }

La mthode equals () de la classe Object requiert comme paramtre une rfrence sur un objet. Ici, l'argument this lui est pass, qui en fait dsigne objet1 (au passage le rsultat est forcment true). this ne peut tre utilis que dans des mthodes non static (une mthode static n'est pas invoque sur un objet). Pour bien comprendre ce que reprsente this et l'appel d'une mthode sur un objet, voici un exemple de programme C (et non C++), avec une traduction possible en Java :
/* Dfinition d'un type de structure */ * utilisant un int */ typedef struct { int unEntier; } Type1; void modifier (Type1 *objet1, int var) { } objet1->unEntier = var; } class Classe1 { // Mthode crant un objet de classe // Type1 et appelant modifier () void uneMethode () { Type1 objet1 = new Type1 (); objet1.modifier (10); } } // Dclaration d'une classe // utilisant un int class Type1 { int unEntier;

void modifier (int var) { // this est facultatif this.unEntier = var; }

/* Fonction crant un objet de type */ * Type1 et appelant modifier () */ void uneMethode () { Type1 *objet1 = malloc (sizeof (Type1)); modifier (objet1, 10); }

A l'appel objet1.modifier (10); plusieurs oprations sont effectues

Programmer en java

Page 90

Dao Issiaka- 3me anne SI

implicitement :
1. La classe Type1 de objet1 est recherche. 2. La mthode modifier () de Type1 est appele avec son argument 10. 3. La "variable" this est initialise avec objet1 dans la mthode modifier ().

this peut tre utilis seul pour dsigner une rfrence d'un objet, instance de la classe Classe1 ou suivi de l'oprateur point (.) pour accder aux champs et mthodes d'instance

d'un objet. Ceci peut tre utile pour distinguer un champ et un paramtre (ou une variable locale) qui ont le mme nom, comme dans l'exemple suivant :
class Classe1 { int var; int var2; Classe1 (int var) // le paramtre var cache le champ var { this.var = var; var2 = var + 1; // quivalent this.var2 = var + 1; } }

En fait, chaque fois que vous utilisez une mthode ou un champ non static de la classe Classe1, l'intrieur d'une des mthodes de Classe1, vous utilisez implicitement this, mais pour des commodits d'criture, il ne vous est requis de l'crire que pour viter toute confusion. A partir de Java 1.1, une nouvelle utilisation de this a t introduite pour distinguer si besoin est, l'instance d'une classe interne ClasseI de l'instance de la classe Classe0 dans laquelle ClasseI est dclare : ClasseI.this dsigne l'instance de la classe interne ClasseI et Classe0.this dsigne l'instance de la classe Classe0. Pour rfrencer l'objet de la super classe de this, on utilise super. Dans la pratique, super est surtout utilis pour invoquer explicitement la mthode outrepasse d'une super classe. Un exemple d'utilisation de super est donn au chapitre sur la cration des classes. L'oprateur -> n'existe pas. Donc, comme pour toute rfrence en Java, this est suivi de l'oprateur point (.) pour accder aux champs et mthodes d'instance d'un objet. Contrairement au C++, this ne peut tre la variable de destination d'une expression d'affectation, c'est--dire que par exemple, Java n'accepte pas l'expression this = unObjet.
Les oprateurs Oprateurs arithmtiques
++, --

Oprateurs de post incrmentation et post dcrmentation : variable++ ajoute 1 variable, et renvoie la valeur de variable avant que celle-ci
Page 91

Programmer en java

Dao Issiaka- 3me anne SI

soit incrmente. variable-- retire 1 variable, et renvoie la valeur de variable avant que celle-ci soit dcrmente.
++, --

Oprateurs de pr incrmentation et pr dcrmentation : ++variable ajoute 1 variable, et renvoie la nouvelle valeur de variable. --variable retire 1 variable , et renvoie la nouvelle valeur de variable.
+expression

+, ~

n'a aucun effet sur expression, -expression renvoie la valeur oppose de expression.

~expressionEntiere renvoie le complment de expressionEntiere, bit bit. Par exemple, ~0xA7 (10100111 en binaire) est gale 0x58 (01011000 en binaire). !expressionBooleenne renvoie le complment logique de expressionBooleenne, c'est--dire false si expressionBooleenne gale true, et inversement.

est

*, /

expression1 * expression2 renvoie la multiplication de expression1 par expression2. expression1 / expression2 renvoie la division de expression1 par expression2, ou dclenche une exception ArithmeticException, si expression2 est nulle et la division s'opre sur des expressions entires. expression1 % expression2 renvoie le reste de la division de expression1 par expression2, ou dclenche une exception ArithmeticException, si expression2 est nulle et les expressions

sont de

des entiers.
+, expression1 + expression2 renvoie l'addition de expression1 et expression2. Si l'un des oprandes expression1 ou expression2 est de la classe String, l'autre oprande est converti en String et le rsultat est la

concatnation des deux chanes. expression1 - expression2 renvoie la valeur de expression1 + (expression2).
<<, >>, >>> expressionEntiere << nbreDecalage renvoie la valeur de expressionEntiere dont les bits sont dcals gauche, nbreDecalage

fois.
expressionEntiere >> nbreDecalage renvoie la valeur de expressionEntiere dont les bits sont dcals droite, nbreDecalage

fois, avec extension du bit de signe.


expressionEntiere >>> nbreDecalage renvoie la valeur de expressionEntiere dont les bits sont dcals droite, nbreDecalage

fois, avec introduction de zro gauche.


<, >, <=, >= expression1 < expression2 renvoie true si expression1 est strictement infrieure expression2. expression1 > expression2 renvoie true si expression1 est strictement suprieure expression2. expression1 <= expression2 renvoie true si expression1 est infrieure ou gale expression2.
Page 92

Programmer en java

Dao Issiaka- 3me anne SI

expression1 >= expression2 renvoie true suprieure ou gale expression2. ==, !=

si expression1 est

expression1 == expression2 renvoie true si expression1 est gale expression2. Si expression1 et expression2 sont des rfrences sur des objets, le rsultat est true si les 2 rfrences dsignent le mme objet, ou si elles sont gales null. expression1 != expression2 renvoie true si expression1 est diffrente de expression2. expression1 != expression2 est quivalent !(expression1 == expression2). expressionEntiere1 & expressionEntiere2

&, ^, |

renvoie le rsultat d'un ET renvoie le rsultat d'un

bit bit entre les oprandes.


expressionEntiere1 ^ expressionEntiere2

OU exclusif bit bit entre les oprandes.


expressionEntiere1 | expressionEntiere2

renvoie le rsultat d'un OU bit bit entre les oprandes. Les oprandes peuvent tre ventuellement de type boolean.

&&, ||

expressionBooleenne1 && expressionBooleenne2 renvoie le rsultat d'un ET logique entre les oprandes. Si expressionBooleenne1 est false alors expressionBooleenne2 n'est pas value, et false est tout de suite renvoy. expressionBooleenne1 || expressionBooleenne2 renvoie le rsultat d'un OU logique entre les oprandes. Si expressionBooleenne1 est true alors expressionBooleenne2 n'est pas value, et true est tout de suite renvoy. expressionBooleenne1 ? expression1 : expression2 renvoie la valeur de expression1 si expressionBooleenne1 est true, sinon la valeur de expression2. x = expressionBooleenne1 ? expression1 : expression2; est

? :

quivalent :
if (expressionBooleenne1) x = expression1; else x = expression2;

En Java, les oprandes de l'oprateur % peuvent tre des entiers ou des nombres flottants.

Java a deux oprateurs de dcalages droite >> et >>>. >> recopie gauche le bit de signe tandis que >>> introduit des zros gauche.
L'oprateur instanceof

L'oprateur instanceof permet de vrifier si une rfrence dsigne un objet d'une certaine classe ou d'une certaine interface. Il s'utilise de la manire suivante : objet instanceof Classe1 et le rsultat est true si objet dsigne une instance de Classe1 ou des classes drives de Classe1 , et false sinon. Si objet est gal null, le rsultat est toujours false. Cet oprateur est surtout utile pour valuer la classe Classe1 d'un objet dont la rfrence est d'une super classe de Classe1, comme dans l'exemple suivant :
Programmer en java Page 93

Dao Issiaka- 3me anne SI

class Classe0 { } class Classe1 extends Classe0 { } class UneClasse { void methode () { Classe0 objet1 Classe0 objet2 Object objet3 Object objet4

= = = =

new Classe1 (); new Classe0 (); new Classe0 (); null;

boolean resultat; resultat = objet1 resultat = objet1 resultat = objet2 resultat = objet3 resultat = objet4 } }

instanceof instanceof instanceof instanceof instanceof

Classe1; Classe0; Classe1; Classe0; Object;

// // // // //

true true false true false

Par extension, objet instanceof Object est toujours gal true si objet est diffrent de null (toute classe hrite de Object et donc tout objet est une instance d'une classe drive de Object). Java introduit l'oprateur instanceof qui permet de vrifier si une rfrence dsigne un objet qui est une instance d'une classe ou d'une interface donne.
Oprateurs du C/C++ absent en Java OPERATEUR
-> :: * & sizeof delete

DESCRIPTION

Oprateur primaire d'accs aux pointeurs Oprateur primaire d'accs aux classes Oprateurs unaires pour les pointeurs Oprateur de destruction d'objet

Les liens dfinis dans le tableau dsignent les endroits o il est trait de l'absence de ces oprateurs.
Les conversions (casts)

Il existe 5 contextes dans lesquels une conversion peut avoir lieu :

Les conversions intervenant dans une affectation d'une expression, variable = expression, o le type de expression doit tre converti dans le type de variable.

Programmer en java

Page 94

Dao Issiaka- 3me anne SI

Les conversions appliques sur chacun des arguments d'une mthode pour que leur type correspondent celui dclar par chacun des paramtres de la mthode. Ces conversions se font de la mme manire que pour les affectations. Les conversions explicites du programmeur par un oprateur de cast. Celles-ci permettent d'effectuer n'importe quelle conversion d'un type dans un autre, si ce sont des types primitifs non boolen, et d'une classe dans une autre classe, si ces deux classes ont un lien d'hritage entre elles. Les conversions en chane de caractres permettent de convertir n'importe quel type en un objet de classe String. Les conversions ncessaires pour que dans une opration numrique comme oper1 op oper2, les oprandes oper1 et oper2 soient convertis dans un mme type pour que l'oprateur op puisse tre appel : o Si l'un des deux oprandes est du type double, l'autre est converti en double. o Si l'un des deux oprandes est du type float, l'autre est converti en float. o Si l'un des deux oprandes est du type long, l'autre est converti en long. o Sinon, les deux oprandes sont convertis en int.

Conversions entre types primitifs avec gain de prcision


Conversions de byte en short, int, long, float ou double. Conversions de short en int, long, float ou double. Conversions de char en int, long, float ou double. Conversions de int en long, float ou double. Conversions de long en float ou double. Conversions de float en double.

Toutes ces conversions ne font perdre aucune prcision au nombre converti. Elles ne requirent aucun oprateur de cast, le compilateur effectue automatiquement ces conversions, mais pour clarifier votre code, vous pouvez utiliser un cast.
Conversions entre types primitifs avec perte de prcision

Conversions de byte en char. Conversions de short en byte ou char. Conversions de char en byte ou short. Conversions de int en byte, short ou char. Conversions de long en byte, short, char ou int. Conversions de float en byte, short, char, int ou long. Conversions de double en byte, short, char, int, long ou float.

Ces conversions ne sont autorises par le compilateur que si le nombre convertir est converti explicitement, grce l'oprateur de cast qui s'utilise ainsi : nombreType1 = (type1)nombreType2.
Conversions de rfrences d'une classe dans une autre

Toutes les conversions suivantes sont possibles sans cast explicite dans la programmation : 1. Conversion d'une rfrence de classe ClasseY dans une rfrence de classe ClasseX, si ClasseY est une classe drive directement ou indirectement de ClasseX (qui peut tre la classe Object). Sachant que toute objet objetClasseY

Programmer en java

Page 95

Dao Issiaka- 3me anne SI

de la classe ClasseY hrite des champs et des mthodes de ClasseX, objetClasseY peut aussi tre considr comme un objet de ClasseX. 2. Conversion d'une rfrence de classe ClasseX dans une rfrence d'interface InterfaceX, si ClasseX implmente l'interface InterfaceX. 3. Conversion d'une rfrence sur une interface InterfaceZ dans une rfrence sur une interface InterfaceX, si InterfaceZ est une interface drive de InterfaceX. 4. Conversion d'une rfrence sur une interface ou un tableau dans une rfrence sur la classe Object. 5. Conversion d'une rfrence sur un tableau de classe ou d'interface ClasseY (ClasseY tabY [ ]) dans une rfrence sur un tableau de classe ou d'interface ClasseX (ClasseX tabX [ ]), si ClasseY peut tre convertie en ClasseX suivant les critres prcdents.

Il faut bien percevoir l'intrt de ces conversions car c'est grce l'hritage, la possibilit d'outrepasser des mthodes et grce ces conversions que Java (comme tout langage orient objet) permet de mettre en pratique les concepts de la programmation oriente objet. Comme ce sont des casts implicites, on ne s'aperoit pas forcment qu'on les utilise... Voici des exemples de cast implicite entre rfrences :
interface InterfaceX { } interface InterfaceZ extends InterfaceX { } class ClasseX implements InterfaceX { } class ClasseY extends ClasseX { } class ClasseZ implements InterfaceZ { } class UneClasse { void uneMethode () { // Cration d'un objet de ClasseX objetClasseX = ClasseY objetClasseY = ClasseZ objetClasseZ = // Cration de tableaux ClasseX [] tabClasseX ClasseY [] tabClasseY ClasseZ [] tabClasseZ

chaque classe new ClasseX (); new ClasseY (); new ClasseZ ();

d'un lment = new ClasseX [1]; = new ClasseY [1]; = new ClasseZ [1]; = new InterfaceZ [1];

InterfaceZ [] tabInterfaceZ

// Cast implicite sur les objets ClasseX objetX = objetClasseY; // 1. cast de ClasseY vers ClasseX cast de ClasseY vers Object objet = objetClasseY; // Object
Programmer en java Page 96

Dao Issiaka- 3me anne SI

InterfaceX objetInterfaceX = objetClasseX; // 2. cast de ClasseX vers InterfaceX objetInterfaceX = objetClasseY; // cast de ClasseY vers InterfaceX // classeY drive de classeX // donc classe Y implmente aussi InterfaceX InterfaceZ objetInterfaceZ = objetClasseZ; // 3. cast de ClasseZ vers InterfaceZ objetInterfaceX = objetInterfaceZ; // cast de InterfaceZ vers InterfaceX objet = objetInterfaceX; InterfaceZ vers Object objet = tabClasseY; tableau vers Object objet = tabInterfaceZ; tableau vers Object // 4. cast de // // cast d'un cast d'un

// 5. Les mmes cas de cast mais sur les tableaux ClasseX [] tabObjetsX = tabClasseY; Object [] tabObjets = tabClasseY; InterfaceX [] tab2InterfaceX = tabClasseX; tabInterfaceX = tabInterfaceZ; InterfaceZ [] tabInterfaceZ = tabClasseZ; tabInterfaceX = tabInterfaceZ; tabObjets = tabInterfaceX; } }

Les conversions suivantes ne sont par contre possibles que si vous utilisez explicitement un oprateur de cast, de la manire suivante : objetClasseY = (ClasseY)objetClasseX. 1. Conversion d'une rfrence de classe ClasseX dans une rfrence de classe ClasseY, si ClasseX est une super classe de ClasseY . Ceci implique notamment qu'une rfrence de classe Object peut tre convertie dans une rfrence de n'importe quelle classe. 2. Conversion d'une rfrence de classe ClasseX dans une rfrence d'interface InterfaceX, si ClasseX n'est pas final et que ClasseX n'implmente pas l'interface InterfaceX (ceci veut dire que la conversion sera accepte l'excution si une classe drive de ClasseX implmente InterfaceX). 3. Conversion d'une rfrence sur la classe Object dans une rfrence sur une interface ou un tableau. 4. Conversion d'une rfrence d'interface InterfaceX dans une rfrence de classe ClasseX qui n'est pas final, ou qui est final et implmente l'interface InterfaceX. 5. Conversion d'une rfrence d'interface InterfaceX dans une rfrence d'interface InterfaceZ, si InterfaceX n'est pas une interface drive de InterfaceZ, et que les deux interfaces ne dclarent aucune mthode ayant les mmes paramtres mais un type de retour diffrent. 6. Conversion d'une rfrence sur un tableau de classe ou d'interface ClasseX (ClasseX tabX [ ]) dans une rfrence sur un tableau de classe ou d'interface

Programmer en java

Page 97

Dao Issiaka- 3me anne SI

ClasseY (ClasseY tabY [ ]), si ClasseX peut tre convertie en ClasseY

suivant les critres prcdents.

Toutes ces conversions sont acceptes par le compilateur, mais l'excution peuvent tre refuses aprs vrification et provoquer le dclenchement d'une exception ClassCastException, Cette exception est dclenche si la rfrence dsignant un objet de classe ClasseX (celle utilise sa cration par l'instruction new ClasseX ()) n'est pas convertie dans la classe ClasseX ou dans une classe ou une interface dans laquelle une rfrence de ClasseX est convertible implicitement. Voici des exemples de cast explicite entre rfrences (attention, les classes ne sont pas les mmes que dans l'exemple des conversions implicites) :
interface InterfaceX { } interface InterfaceZ extends InterfaceX { } class ClasseX { } class ClasseY extends ClasseX implements InterfaceX { } class ClasseZ implements InterfaceZ { } class UneClasse { void uneMethode () { // Cration d'un objet de chaque Object objet1 = new ClasseX ClasseX vers Object ClasseX objet2 = new ClasseY ClasseY vers ClasseX Object objet3 = new ClasseZ ClasseZ vers Object

classe (); // cast implicite de (); (); // cast implicite de // cast implicite de

// Cration de tableaux d'un lment Object tab1 = new ClasseX [1]; // Cast explicite sur les objets ClasseY objetY = (ClasseY)objet2; // 1. cast de ClasseX vers ClasseY ClasseX objetX = (ClasseX)objet1; // cast de Object vers ClasseX objetY = (ClasseY)objet1; // cast de Object vers ClasseY // accepte la compilation mais dclenche // une exception ClassCastException l'excution // car objet1 ne dsigne pas un objet de classe ClasseY InterfaceX objet InterfaceX = (InterfaceX)objet2; // 2. cast de ClasseX vers InterfaceX

Programmer en java

Page 98

Dao Issiaka- 3me anne SI

objet InterfaceX = (InterfaceX)objet1; // InterfaceX // compilation mais dclenche // ClassCastException // dsigne un objet // classeX n'implmente //

cast de Object vers accepte la une exception l'excution car objet1 de classe ClasseX et pas InterfaceX

InterfaceZ objetInterfaceZ = (InterfaceZ)objet3; // 3. cast de Object vers InterfaceZ ClasseX [ ] tabObjetsX = (ClasseX [ ])tab1; // cast de Object vers ClasseX [ ] // cast de Object vers tabObjetsX = (ClasseX [ ])objet1; ClasseX [] accepte // la compilation mais dclenche une // exception ClassCastException // l'excution car objet1 ne dsigne pas // un objet de classe ClasseX [ ] ClasseZ objetZ = (ClasseZ)objetInterfaceZ; InterfaceZ vers ClasseZ // 4. cast de

objet InterfaceX = objetZ; // cast implicite de ClasseZ vers InterfaceX objetInterfaceZ = (InterfaceZ)objet InterfaceX; // 5. cast de InterfaceX vers InterfaceZ } }

La figure suivante rsume les conversions les plus usuelles que vous serez amen utiliser :

Programmer en java

Page 99

Dao Issiaka- 3me anne SI

figure 8. Conversions implicites/explicites

Les casts s'oprent sur les rfrences et non sur les objets. Dans les deux lignes suivantes :
Classe2 objetClasse2 = new Classe2 (); Classe1 objetClasse1 = (Classe1)objetClasse2; objetClasse1 Classe2.

et objetClasse2 ne sont que des rfrences sur un objet de classe

Le fait d'effectuer le cast (Classe1) (qu'il soit explicite ou non) ne transforme en rien l'objet de classe Classe2. Ceci est trs important, car si vous invoquez une mthode de Classe1, par l'expression objetClasse1.methode1 () et que methode1 () est outrepasse dans Classe2, ce sera effectivement la mthode methode1 () de Classe2 qui sera appele, car objetClasse1 dsigne un objet de Classe2. Les casts automatiques entre types primitifs sont moins nombreux en Java. Aussitt qu'il y a perte de prcision possible (float en int, long en byte, par exemple), vous devez faire un cast explicite. Les casts d'une rfrence d'un type de classe dans un autre ne sont possibles que si la classe de destination a un lien direct d'hritage avec la classe de l'objet cast. Si la classe de conversion n'est pas la classe relle de l'objet ou une de ses super classes, une exception ClassCastException est dclenche. Plus simplement, vous ne pouvez, comme en C, caster une rfrence sur un type dans n'importe quel autre type. Java ne permet pas de surcharger les oprateurs de cast, mais vous pouvez ventuellement utiliser les constructeurs pour compenser cette absence : pour convertir un objet de classe Classe1 en Classe2, vous crer un constructeur dans la classe Classe2 prenant en paramtre une rfrence de classe Classe1 :
class Classe2 { public Classe2 (Classe1 objetACaster) {
Programmer en java Page 100

Dao Issiaka- 3me anne SI

// Retranscrire les champs de Classe1 // en ceux de Classe2 } }

Il vous suffit de crer un objet de Classe2 ainsi: Classe2 objetCaste = new Classe2 (objetDeClasse1);. Attention, dans ce cas vous crez un autre objet, qui est rellement de classe Classe2, contrairement un cast qui ne cre aucun objet mais seulement convertit une rfrence d'une classe dans une autre.
Priorit des oprateurs

Tableau de prcdence (priorit) des oprateurs. Les oprateurs sur une mme ligne ont la mme priorit, et sont rangs ligne par ligne du plus prioritaire au moins prioritaire.
OPERATEUR ASSOCIATIVITE DESCRIPTION

. ( ) [ ] new

de gauche droite de droite gauche de gauche droite de gauche droite de gauche droite de gauche droite de gauche droite de gauche droite de gauche droite de gauche droite de gauche droite de gauche droite de gauche

Oprateurs primaires Oprateurs unaires Multiplication, division, reste Addition, soustraction Dcalages Comparaisons Egalit, diffrence Oprateur ET bit bit Oprateur OU EXCLUSIF bit bit Oprateur OU bit bit Oprateur ET Oprateur OU Condition
Page 101

! ~ ++ -- + - (cast)

* / %

+ -

<< >> >>>

< <= > >= instanceof

== !=

&

&&

|| ? :

Programmer en java

Dao Issiaka- 3me anne SI

droite
= *= /= %= += -= <<= >>= >>>= &= ^= |=

de droite gauche

Affectation

L'oprateur new a la mme priorit que l'oprateur . , ce qui permet d'crire directement new Classe1 ().methode1 (). En C++, il faut crire (new Classe1 ())->methode1 ().

Programmer en java

Page 102

Dao Issiaka- 3me anne SI

Les exceptions
throw, try, catch,... La classe Throwable

Les exceptions Runtime Les classes d'erreurs Les autres exceptions

throw, try, catch,...

Pourquoi traiter des exceptions ds maintenant ? Parce qu'en Java, contrairement au C et au C++, les exceptions et leur traitement font partie intgrante du langage et sont utilises systmatiquement pour signaler toute erreur survenue pendant l'excution d'une mthode (dbordement d'indice d'un tableau, erreur d'accs un fichier,...). De nombreuses mthodes sont susceptibles de dclencher (throw) des exceptions et donc il est impratif de savoir comment les traiter ou passer outre. Une fois acquis le principe de cette forme de traitement d'erreur, vous pourrez utiliser les classes d'exceptions Java existantes ou crer vos propres classes pour traiter les erreurs qui peuvent survenir dans vos mthodes. La gestion d'erreur par exceptions permet d'crire de manire plus claire (donc plus maintenable) un programme, en isolant le traitement d'erreur de la suite d'instructions qui est excute si aucune erreur ne survient. Gnralement, dans les langages ne disposant pas des exceptions (comme le C), les fonctions susceptibles de poser problme renvoient des valeurs que vous devez traiter immdiatement pour vrifier si aucune erreur n'est survenue. La gestion des erreurs se fait grce aux exceptions en Java. Donc, il n'existe pas de variables telles que errno... Les exceptions sont d'un abord plus difficile mais une fois compris le principe, la programmation des erreurs se fait plus simplement et "proprement". Les exceptions font partie du noyau du langage Java et leur gestion est obligatoire.
Syntaxe

En Java, cinq mots-cls servent traiter les exceptions :

L'instruction throw exception1; permet de dclencher l'exception exception1. exception1 doit tre une rfrence sur un objet d'une classe d'exception. Toutes les classes d'exception sont de la classe Throwable ou de ses drives (les classes Error, Exception, RuntimeException et leur drives). Une exception peut tre dclenche par le systme ou n'importe o dans une mthode. Le bloc suivant l'instruction try permet d'encadrer les sries d'instructions o une ou plusieurs exceptions sont susceptibles d'tre dclenches. Les instructions de ce bloc

Programmer en java

Page 103

Dao Issiaka- 3me anne SI

reprsentent le traitement normal de votre programme. Il peut donc comporter des instructions dclenchant ou non des exceptions et ventuellement des instructions throw. Le bloc de l'instruction try doit tre suivi d'une ou plusieurs instructions catch, et chacun de ces catch doit tre suivi d'un bloc d'instructions. Chaque catch spcifie quelle classe d'exception il est capable d'intercepter, quand une exception est dclenche dans le bloc du try prcdent le catch. Un catch capable de traiter la classe ClasseException ou une des classes drives de ClasseException respecte la syntaxe suivante :
try BlocInstructionsTry catch (ClasseException exceptionInterceptee) BlocInstructions

Quand une exception exception1 de classe ClasseException est dclenche dans le bloc BlocInstructionsTry, le contrle passe au premier catch suivant BlocInstructionsTry qui traite la classe d'exception ClasseException. Ce catch reoit en paramtre l'exception dclenche. Si aucun de ces catch n'est capable d'intercepter exception1, le contrle est rendu au premier catch capable d'intercepter une exception de classe ClasseException, parmi les mthodes mmorises dans la pile d'excution et excutant un try ... catch. Si aucun catch n'est rencontr, la Machine Virtuelle Java indique l'exception qui est survenue et arrte le thread dans laquelle elle est survenue (ce qui gnralement bloque le programme). Le bloc instructions d'un catch peut ventuellement redclencher l'exception intercepte exceptionInterceptee pour la propager dans la pile d'excution, grce l'instruction throw exceptionInterceptee;.

Le bloc d'instructions du dernier catch peut tre optionnellement suivi de l'instruction finally, suivi lui aussi d'un bloc d'instructions spcifiant les instructions qu'il faut toujours excuter la suite du bloc try si aucune exception n'a t dclenche ou la suite du traitement d'un catch. Dans la dclaration d'une mthode methode1 (), le mot-cl throws permet de dclarer la liste des classes d'exceptions que methode1 () est susceptible de dclencher. methode1 () peut dclencher des exceptions dans les deux situations suivantes : o Elle appelle une ou plusieurs instructions throw exception1; et n'intercepte pas toutes ces exceptions avec l'instruction catch. o Elle appelle d'autres mthodes susceptibles de dclencher des exceptions et n'intercepte pas toutes ces exceptions.

Seules les classes d'exceptions RuntimeException, Error et toutes leurs classes drives, ne sont pas obliges d'tre cites aprs throws. Ce type de dclaration permet d'tre sr qu'une exception dclenche par une mthode sera toujours traite ou ignore sciemment par le programmeur. Chacune des instructions try, catch et finally doivent tre suivi d'un bloc { ... } mme si ce bloc ne comporte qu'une seule d'instruction (Dsol, les afficionados du code compact en seront pour leurs frais !). Voici un exemple de traitement local d'une exception dclenche grce throw dans un bloc try et intercepte par un des catch qui suivent :

Programmer en java

Page 104

Dao Issiaka- 3me anne SI

class Classe0 { // ... void methode1 () { try { // ... throw new Exception (); } catch (Exception exception1) { // Que faire en cas d'exception ? } } }

Une mthode qui est susceptible de dclencher une exception peut s'crire ainsi :
class Classe1 { // ... void methode1 () throws ClasseException { // ... // En cas d'erreur, dclenchement d'une exception throw new ClasseException (); // ... } } ClasseException

est soit une classe prdfinie drive de la classe Throwable, soit une classe drive d'une de ces classes cr par vous. Quand vous appelez methode1 (), vous devez soit inclure l'appel cette mthode dans un ... catch, soit dclarer que la mthode qui appelle methode1 () est susceptible de dclencher une exception de la classe ClasseException, comme dans l'exemple suivant :

try

class Classe2 { Classe1 objet1 = new Classe1 (); // ... void methodeX () { try { objet1.methode1 (); // ... } catch (ClasseException exception1) { // Que faire en cas de problme ? } // ... Eventuellement d'autres catch (...) finally { // Le bloc finally est optionnel // Que faire aprs que le bloc try ou // qu'un bloc catch aient t excuts ?
Programmer en java Page 105

Dao Issiaka- 3me anne SI

} } void methodeY () throws ClasseException { objet1.methode1 (); // ... } }

Le bloc finally est toujours excut, mme si l'instruction return est excute dans les blocs try et catch : il sert regrouper les instructions qu'il faut excuter pour laisser dans un tat correct votre programme qu'une exception est t dclenche ou non. Par exemple, si le bloc try traite des accs un fichier (ouverture, lecture/criture,...), il est logique de fermer ce fichier dans le bloc finally, pour qu'il soit toujours finalement ferm. Si une exception exception1 est dclenche dans un bloc try et qu'aucun catch qui suit try n'intercepte exception1, alors le bloc finally est excut avant que le systme ne continue propager l'exception et trouve (ou non) un catch traitant les exceptions de la classe de exception1. Si une exception exception2 est dclenche dans un bloc catch, alors le bloc finally est aussi excut avant que le systme ne continue propager cette exception et trouve (ou non) un catch traitant les exceptions de la classe de exception2.

figure 9. Chemin parcouru lors du traitement d'exceptions

La figure prcdente illustre les chemins diffrents par lesquels peut passer le contrle dans les mthodes methodeX () et methodeY (), suivant qu'une exception dans methode1 () est dclenche (chemins vert et jaune) ou non (chemins rouge et bleu). Afin de bien comprendre la gestion des erreurs avec les exceptions, voici un programme C typique traduit en Java o vous pourrez faire le parallle entre
Programmer en java Page 106

Dao Issiaka- 3me anne SI

constantes numriques faon C, et exception faon Java ( recopier dans un fichier EssaiException.java compil avec l'instruction javac EssaiException.java, pour ensuite l'excuter avec java ou Java Runner, grce l'instruction java EssaiException) :
/* Dclaration des constantes d'erreur */ #define ERR_OK 0 #define ERR_A_EGAL_B 1 // Dclaration d'une classe d'exception class AEgalBException extends Exception { public String toString () { return "A gal B !"; } } public class EssaiException { static void uneMethode (int a, int b) throws AEgalBException { if (a == b) throw new AEgalBException (); else System.out.println (a + " et " + b + " OK !"); }

int uneMethode (int a, int b) { if (a == b) return ERR_A_EGAL_B; else { printf ("%d et %d OK !\n", a, b); return ERR_OK; } } int main () { int erreur; if ((erreur = uneMethode (1, 2)) == ERR_OK) printf ("Pas d'erreur\n"); else if (erreur == ERR_A_EGAL_B) printf ("Erreur\n"); }

public static void main (String [ ] args) { try { uneMethode (1, 2); System.out.println ("Pas d'erreur"); } catch (AEgalBException e) { System.out.println ("Erreur " + e); } } }

Voici un autre exemple d'application dont la mthode newObject () permet de crer un objet en connaissant le nom de sa classe. Cette mthode simplifie le traitement des exceptions que peuvent dclencher les mthodes forName () et newInstance () de la classe Class en renvoyant une exception de classe IllegalArgumentException qu'il n'est pas obligatoire d'intercepter ( recopier dans un fichier InstantiationAvecNom.java compil avec l'instruction
Programmer en java Page 107

Dao Issiaka- 3me anne SI

javac InstantiationAvecNom.java pour ensuite l'excuter avec java grce l'instruction java InstantiationAvecNom) :

ou Java Runner,

public class InstantiationAvecNom { // Methode transformant toutes les exceptions qui peuvent survenir // pendant l'instanciation d'une classe en une exception IllegalArgumentException. // nomClasse doit indiquer un nom de classe avec son package public static Object newObject (String nomClasse) { try { return Class.forName (nomClasse).newInstance (); } catch (ClassNotFoundException e) { throw new IllegalArgumentException ( "La classe " + nomClasse + " n'existe pas"); } catch (InstantiationException e) { throw new IllegalArgumentException ( "La classe " + nomClasse + " est abstract" + " ou n'a pas de constructeur accessible par d\u00e9faut"); } catch (IllegalAccessException e) { throw new IllegalArgumentException ( "La classe " + nomClasse + " n'est pas public"); } } public static void main (String [ ] args) { // Essai avec diffrentes classes String nomsClasses [] = {"java.lang.Object", "java.lang.String", "java.lang.Integer", par dfaut "java.lang.Runnable"}; abstract)

// Ok // Ok // Pas de constructeur // Interface (= classe

for (int i = 0; i < nomsClasses.length; i++) try { System.out.println (nomsClasses [i] + " : " + newObject (nomsClasses [i])); } catch (IllegalArgumentException e) { System.out.println (e); System.out.println ("La classe " + nomsClasses [i] + " ne peut etre instancie par Class.forName (\"" + nomsClasses [i] + "\").newInstance ();"); } } }

Programmer en java

Page 108

Dao Issiaka- 3me anne SI

Autres exemples

Applets Chrono, ObservateurCalcul, EchoClient, PaperBoardClient, PlayApplet, CalculetteSimple, BoutonsNavigation, AnimationFleche, ScrollText et Horloge. Applications LectureFichier, NumerotationLigne, ConcatenationFichiers, TestProtocole, HelloFromNet, EchoServer et PaperBoardServer.
Avantages des exceptions

Bien que d'un abord plus compliqu qu'une gestion d'erreur avec des constantes numriques, les exceptions comportent de nombreux avantages que vous percevrez l'usage :

Chaque exception est une instance d'une classe : cette classe peut comporter toute sorte de mthodes et de champs, qui permettent une gestion d'erreur bien plus riche qu'une simple constante numrique. De plus, vous pouvez crer une hirarchie de classes d'exceptions, si besoin est. Une mthode methode1 () est oblige de dclarer la liste des classes d'exceptions qu'elle est susceptible de dclencher, grce la clause throws. Ceci oblige les utilisateurs de methode1 () de prendre en compte ces exceptions, soit en les traitant dans un try ... catch (voir methodeX ()), soit en les ajoutant la liste des classes d'exceptions dclenches par leur mthode (voir methodeY ()). Cette obligation peut paratre lourde priori, mais elle assure une gestion correcte des erreurs qui peuvent survenir dans un programme. (Qui peut affirmer qu'il a toujours gr toutes les erreurs dans un programme C ?...). Le bloc d'instructions d'un try reprsente la suite des instructions qui sont censes se drouler s'il n'y a pas d'erreur. Quand vous retournez des codes d'erreurs, vous devez les tester tout de suite pour traiter les cas d'erreurs ventuelles : ceci peut nuire la lisibilit du code. Quand une exception est dclenche, le systme recherche dans la pile d'excution la premire mthode qui traite cette exception dans un bloc catch. Comme dans l'exemple qui suit, ceci permet ventuellement de centraliser vos traitements d'exception dans une mthode methodePrincipale () au lieu de traiter toutes les exceptions qui peuvent survenir dans chacune des mthodes methodeI () o pourrait survenir une exception.
class UneClasse { private void methodeQuiDeclencheUneException () throws Exception { throw new Exception (); } private void methode1 () throws Exception { methodeQuiDeclencheUneException (); } private void methode2 () throws Exception { methode1 (); methodeQuiDeclencheUneException (); } private void methode3 () throws Exception
Page 109

Programmer en java

Dao Issiaka- 3me anne SI

{ methode1 (); } public void methodePrincipale () { try { methode2 (); methode3 (); } catch (Exception exception) { // Que faire en cas d'exception } }

L'quivalent de la clause catch (...) du C++ est catch (Throwable exception). En effet, toutes les classes d'exceptions Java hritent de la classe Throwable. La clause throw; qui permet de redclencher une exception traite dans un catch, a pour quivalent en Java throw exception;, o exception est l'exception reu en paramtre par le catch. Java introduit le mot-cl throws qui permet de spcifier la liste des classes d'exceptions que peut dclencher une mthode, et que doit prendre en compte tout utilisateur de cette mthode (certains compilateurs C++ utilisent throw). Le traitement des exceptions en Java comporte une clause supplmentaire et optionnelle par rapport au C++ : l'instruction finally. Cette instruction permet de spcifier l'ensemble des instructions excuter une fois termin le bloc d'instructions d'un try ou d'un des catch, qu'une exception ait t dclenche ou non.

Soit methode1 () une mthode d'une classe Classe1, dclarant avec la clause throws une liste d'exception ClasseExceptionI qu'elle est susceptible de dclencher. Si methode1 () est outrepasse dans une classe Classe2 drive de Classe1, alors cette mthode ne peut dclarer que les exceptions ClasseExceptionI ou les exceptions drives de ClasseExceptionI (interdiction de dclencher des exceptions dont les classes ne sont pas lies celles que peut dclencher la mthode outrepasse). Bien sr, ceci ne s'applique que pour les classes d'exceptions diffrentes de RuntimeException, Error et toutes leurs classes drives. Voici un exemple vous montrant ceci :
abstract class Classe1 { abstract Class chercherClasse (String nomClasse); } class Classe2 extends Classe1
Programmer en java Page 110

Dao Issiaka- 3me anne SI

{ // chercherClasse () est outrepasse Class chercherClasse (String nomClasse) { try { if (nomClasse.equals ("")) throw new IllegalArgumentException ("Nom de classe vide"); return Class.forName (nomClasse); } catch (ClassNotFoundException e) { // nomClasse pas trouve : la mthode forName () de la classe // Class impose d'intercepter cette exception... throw new IllegalArgumentException ("Nom de classe inconnu"); } // IllegalArgumentException est une classe drive de // RuntimeException donc il n'est pas obligatoire d'intercepter // les exceptions de cette classe } // Vous auriez pu dcider de ne pas intercepter l'exception de // de class ClassNotFoundException et de dclarer par exemple : /* Class chercherClasse (String nomClasse) throws ClassNotFoundException { return Class.forName (nomClasse); } */ // Ceci gnre une erreur car il n'est pas possible d'outrepasser // chercherClasse () et de dclarer que cette mthode est susceptible de // dclencher des exceptions que chercherClasse () de Classe1 ne dclare pas... }

Par contre, une mthode methode1 () outrepassant celle d'une super classe peut ne pas dclencher certaines des exceptions que la mthode outrepasse a dclares dans sa clause throws, comme par exemple :
class Classe1 { void methode1 () throws Exception { // ... throw new Exception (); } } class Classe2 extends Classe1 { void methode1 () { // ... }
Programmer en java Page 111

Dao Issiaka- 3me anne SI

Ceci peut tre utile quand vous voulez outrepasser la mthode clone () de la classe Object dans une classe Classe1 pour permettre dans certains cas, de cloner les objets de la classe Classe1 sans avoir intercepter l'exception CloneNotSupportedException :
class Classe1 implements Cloneable { // ... // La mthode clone () de la classe Object peut dclencher // une exception CloneNotSupportedException, mais ici // dans Classe1 clone () ne le fait pas public Object clone () { try { Classe1 clone = (Classe1)super.clone (); // ... return clone; } catch (CloneNotSupportedException e) { // Ne peut survenir car cette classe implmente Cloneable // mais obligation d'intercepter l'exception car la mthode clone () // de la classe Object dclare qu'elle peut dclencher une exception // de classe CloneNotSupportedException return null; } } } class Classe2 { void methode (Classe1 objet1) { Classe1 objet2 = (Classe1)objet1.clone (); // ... } }

La classe java.lang.Throwable

Les classes d'exceptions Java se divisent en plusieurs catgories. Elles hritent toutes de la classe Throwable dcrite ci-dessous. Celle-ci n'est pas habituellement utilise directement, mais toutes les exceptions hritent de ses mthodes, qui peuvent tre intressantes utiliser ou outrepasser.
Constructeurs
public Throwable () public Throwable (String message)

Allocation d'un nouvel objet Throwable, l'un sans message et l'autre avec message dcrivant l'exception survenue. Une trace de l'tat de la pile est automatiquement sauvegard.
Programmer en java Page 112

Dao Issiaka- 3me anne SI

Mthodes
public String getMessage ()

Renvoie le message dtaill associ l'objet.


public void printStackTrace () public void printStackTrace (PrintStream s)

Imprime sur la sortie standard ou sur un stream, l'exception et la trace de l'exception dans la pile.
public Throwable fillInStackTrace ()

Rinitialise la trace de la pile d'excution. Cette mthode est utile uniquement quand vous voulez redclencher une exception traite par un catch, de la manire throw exception.fillInStackTrace ().
public String toString ()

Mthode outrepasse de la classe Object, renvoyant une description sommaire de l'exception


Les exceptions Runtime

Les catgories des exceptions Runtime (classe java.lang.RuntimeException et ses drives) et des classes d'erreurs (classe java.lang.Error et ses drives) sont spciales : contrairement aux autres classes d'exceptions, un programme n'est pas oblig de traiter toutes les instructions pouvant dclencher ce type d'exceptions dans un try ... catch, et ceci essentiellement pour des raisons pratiques de programmation. En effet, en consultant la liste suivante vous vous rendrez compte que ces exceptions peuvent survenir trs souvent dans un programme : Si le compilateur Java obligeait prvoir un traitement en cas d'exception chaque fois qu'une instruction peut dclencher une exception Runtime, votre programme aurait beaucoup plus de traitement d'exceptions que de code rellement utile. De mme, si vous voulez vous servir d'une de ces classes pour dclencher avec throw une exception dans une mthode methode1 (), vous n'tes pas oblig de la dclarer dans la clause throws de methode1 (). La classe RuntimeException drive de la classe Exception. Voici la liste des exceptions drivant de RuntimeException, qui sont susceptibles d'tre dclenches au cours de l'excution d'un programme Java :
java.lang.ArithmeticException : Une exception est survenue sur une opration

arithmtique, comme une division d'un entier par zro.


java.lang.ArrayStoreException : Tentative de stocker dans un tableau un lment qui

n'est pas du type des lments du tableau ou castable dans ce type. java.lang.ClassCastException : Tentative de cast d'un objet dans un type incorrecte. java.lang.IllegalArgumentException : Une mthode a t appele avec un mauvais argument ou invoque sur un mauvais objet. Les classes suivantes drivent de cette classe d'exception : o java.lang.IllegalThreadStateException : Un thread tait dans un tat inadquat pour l'opration requise. o java.lang.NumberFormatException : Tentative de convertir dans un type numrique une chane de caractres mal formatte.
Page 113

Programmer en java

Dao Issiaka- 3me anne SI

java.lang.IllegalMonitorStateException : Le thread courant a tent d'attendre ou

de prvenir d'autres threads, sur un objet non verrouill par ce thread. Cette exception est dclenche par les mthodes wait () et notify () de la classe Object (voir aussi la synchronisation des threads). java.lang.IndexOutOfBoundsException : Un indice (sur un tableau, une chane) ou un intervalle dfini par deux indices ont dpass les limites infrieures ou suprieures. Les classes suivantes drivent de cette classe d'exception : o java.lang.ArrayIndexOutOfBoundsException pour les tableaux (indice ngatif ou suprieur ou gal la taille du tableau). o java.lang.StringIndexOutOfBoundsException pour les chanes de caractres. java.lang.NegativeArraySizeException : Tentative de crer un tableau ou une chane avec une taille ngative. java.lang.NullPointerException : Tentative d'utiliser une rfrence null alors qu'une rfrence sur un objet valide tait attendue. java.lang.SecurityException : Tentative de violation de scurit.

Le package java.util dfinit les exceptions suivantes signalant des oprations interdites :
java.util.EmptyStackException : Tentative d'accder un lment dans une pile vide (classe java.util.Stack). java.util.NoSuchElementException : Cette exception est dclenche par les implmentations de la mthode nextElement () de l'interface java.util.Enumeration quand il n'y a plus d'lments numrer.

Il n'est pas obligatoire de traiter les exceptions des classes RuntimeException, Error et leur drives dans un try ... catch, et ceci qu'elles soient cites ou non dans la clause throws, des mthodes invoques. En fait, quand ce type d'exception est cit, ce n'est que pour information. A la lecture de la liste prcdente, vous pouvez voir que la Machine Virtuelle Java gre de manire fine les erreurs courantes qui peuvent survenir dans un programme. Au cours de la mise au point d'un programme, ce type d'erreur survient souvent : par dfaut, l'exception dclenche sera intercepte par la Machine Virtuelle qui va inscrire l'cran l'exception en question ainsi que l'tat de la pile d'excution au moment de son dclenchement. Grce ces informations, vous retrouverez gnralement trs rapidement d'o provient l'erreur sans avoir lancer un debugger. Globalement, vous verrez qu' l'usage cette fonctionnalit vous permet de corriger beaucoup plus vite vos programmes et que vous vous servirez beaucoup moins souvent du debugger que dans d'autres langages.
Les classes d'erreurs

Les classes d'erreurs drivent de la classe Error, qui drive elle-mme de la classe Throwable. Elles sont gnralement provoque par la Machine Virtuelle Java l'excution, suite un problme sur le chargement ou l'utilisation des classes, ou sur la Machine Virtuelle elle-mme. Elles sont intressantes analyser quand elles sont dclenches par un programme. Voici la liste de ces erreurs :

Programmer en java

Page 114

Dao Issiaka- 3me anne SI

java.lang.LinkageError : Cette classe est la super classe des classes d'erreurs dclenches quand le lien vers une classe est impossible (classe ou mthode inexistante, fichier .class corrompu,...). Ces erreurs surviennent la plupart du temps quand la Machine Virtuelle Java continue utiliser un ancien fichier .class d'une classe qui a chang. Dans ce cas, vrifiez les trois points suivants et recompilez la classe si ncessaire : 1. Les dates du fichier .class et du fichier source .java. 2. Le rpertoire de provenance du fichier .class en consultant le CLASSPATH utilis. 3. L'unicit du fichier .class : peut-tre avez-vous chang votre arborescence de dveloppement en laissant d'anciens fichiers .class utiliss par inadvertance ? o o o java.lang.ClassCircularityError : Une rfrence circulaire a t dtecte

dans la hirarchie d'une classe.


java.lang.ClassFormatError : Une classe n'est pas au bon format. Cette erreur peut tre dclenche par la mthode defineClass () de la classe ClassLoader. java.lang.IncompatibleClassChangeError : Cette classe est la super classe

des classes d'erreurs dclenches quand la Machine Virtuelle Java utilise un champ ou une mthode qui a t change ou supprime d'une classe. Comme le compilateur interdit ces erreurs, elles ne peuvent survenir que si la Machine Virtuelle utilise des fichiers .class qui ne sont pas jour (voir aussi la super classe LinkageError). java.lang.AbstractMethodError : Tentative d'appeler une mthode abstract. java.lang.IllegalAccessError : Tentative d'accder un champ ou une mthode inaccessible (elle est devenue private par exemple). java.lang.InstantiationError : Tentative d'instancier une classe abstract ou une interface. java.lang.NoSuchFieldError : Tentative d'accder un champ qui n'existe pas. java.lang.NoSuchMethodError : Tentative d'accder une mthode qui n'existe pas. o java.lang.NoClassDefFoundError : La classe requise n'a pas t trouve par la Machine Virtuelle Java. Cette erreur survient le plus souvent parce que la classe n'a pas t retrouve avec le CLASSPATH utilis. o java.lang.UnsatisfiedLinkError : Une mthode native n'a pas t trouve par la Machine Virtuelle Java. o java.lang.VerifyError : La classe est incohrente. java.lang.ThreadDeath : Cette erreur est dclenche par la mthode stop () sans paramtre de la classe Thread. java.lang.VirtualMachineError : Cette classe est la super classe des classes d'erreurs dclenches quand la Machine Virtuelle Java n'est plus en mesure de fonctionner. o java.lang.InternalError : Cette erreur est dclenche suite un tat incohrent de la Machine Virtuelle. o java.lang.OutOfMemoryError : La Machine Virtuelle n'a pas assez de mmoire pour instancier un nouvel objet mme aprs que le Garbage Collector soit intervenu. o java.lang.StackOverflowError : Un dbordement de pile est survenu, par exemple suite un appel rcursif dans une mthode sans condition d'arrt. o java.lang.UnknownError : Cette erreur n'est pas utilise.
java.awt.AWTError : Une erreur est survenue pendant l'utilisation d'AWT (le systme de gestion de l'interface utilisateur). Cette erreur est utilise en cas d'erreur d'initialisation du toolkit AWT (pas de DISPLAY sous X11 par exemple) ou de l'impression.

Programmer en java

Page 115

Dao Issiaka- 3me anne SI

Les autres exceptions

Vous devez obligatoirement prendre en compte les exceptions dont la classe drive de java.lang.Exception (sauf RuntimeException et ses classes drives), soit en les traitant dans un try ... catch, soit, grce la clause throws, en les ajoutant la liste des classes d'exception susceptibles d'tre renvoyes par une mthode. La classe Exception drive de la classe Throwable. Les classes d'exceptions qui suivent sont dclenches par certaines mthodes de la bibliothque Java :
java.lang.ClassNotFoundException : Une classe ou une interface d'un certain nom n'a pas t trouve. Cette exception peut tre dclenche par les mthodes forName () de la classe Class, et les mthodes findSystemClass () et loadClass () de la classe ClassLoader. java.lang.CloneNotSupportedException : La mthode clone () de la classe Object a t appele sur un objet dont la classe n'implmente pas l'interface Cloneable. java.lang.IllegalAccessException : Tentative de charger une classe dont le nom est correct, mais qui n'est pas public, ou qui se trouve dans un package diffrent ou dont le constructeur par dfaut n'est pas accessible (s'il est private par exemple). Cette exception peut tre dclenche par la mthode forName () de la classe Class. java.lang.InstantiationException : La classe spcifie en paramtre de newInstance () est abstract, un tableau ou une interface, ceci interdisant la cration d'un nouvel objet. java.lang.InterruptedException : Le thread courant tait en attente et un autre thread a interrompue son attente grce la mthode interrupt () de la classe Thread.

Les packages java.io et java.net dfinissent les exceptions suivantes qui permettent de vrifier les erreurs d'entres-sorties. Ces classes drivent toutes de la classe java.io.IOException (qui drive elle-mme de la classe Exception) :
java.io.EOFException : La fin de fichier a t rencontre pendant une opration de

lecture.
java.io.FileNotFoundException : Fichier inexistant dans le systme de fichiers. java.io.InterruptedIOException : Le thread courant tait en attente de la fin d'une

opration d'entre-sortie, et un autre thread a interrompue son attente grce la mthode interrupt () de la classe Thread. java.io.UTFDataFormatException : Erreur de conversion d'une chane au format UTF-8 (ou inversement).
java.net.MalformedURLException : Une chane de caractres dcrivant un URL tait mal formatte ou indiquait un protocole inconnu. java.net.ProtocolException : Erreur sur le protocole rseau. java.net.SocketException : Une opration sur un socket ne s'est pas droul correctement. java.net.UnknownHostException : L'hte (host) d'un rseau n'a pu tre atteint. java.net.UnknownServiceException : La connection rseau ne supporte pas ce service.

Le package java.awt dfinit l'exception suivante :


java.awt.AWTException : Utilise pour certaines erreurs dans AWT.

Programmer en java

Page 116

Dao Issiaka- 3me anne SI

Pour le traitement d'erreur de vos programmes, vous pouvez dclencher vous-mme des exceptions en utilisant les classes d'exceptions existantes (comme par exemple IllegalArgumentException) ou des nouvelles classes d'exceptions.

Programmer en java

Page 117

Dao Issiaka- 3me anne SI

Les threads
Dfinition d'un thread La cration d'un thread Les tats d'un thread La synchronisation des threads La classe Thread

Dfinition d'un thread

L'environnement de la Machine Virtuelle Java est multi-threads. L'quivalent de thread pourrait tre tche en franais, mais pour viter la confusion avec la notion de systme multitches, on emploiera le mot thread plutt que tche. Le fait que Java permettent de faire tourner en parallle plusieurs threads lui donne beaucoup d'intrt : Ceci permet par exemple de lancer le chargement d'une image sur le Web (ce qui peut prendre du temps), sans bloquer votre programme qui peut ainsi effectuer d'autres oprations. Pour vous montrer les possibilits du multi-threading voici une applet qui peut lancer trois horloges tournant en parallle (au passage, voici une dmonstration de rutilisation de la classe TimeCounter dj utilise au premier chapitre).

Ne confondez pas le multi-threads avec le traitement vnementiel grce un timer, dont le rsultat rendrait la mme chose. Dans cette applet, il y a rellement trois threads diffrents qui grent chacun une horloge mise jour intervalle rgulier. La mise jour n'est pas dclenche suite un vnement du type WM_TIMER mis rgulirement par le gestionnaire de fentres.

Plusieurs aspects des threads sont tudier pour bien comprendre leur fonctionnement et leur utilisation : la gestion par la Machine Virtuelle Java pour rpartir le temps d'excution entre les diffrents threads, la manire de crer un thread, les diffrents tats possibles d'un thread, et la synchronisation entre threads pour le partage de donnes. L'environnement Java est multi-threads, et le langage permet d'utiliser cette fonctionnalit pour crer vos propres threads, et synchroniser des threads qui partagent des donnes.

Programmer en java

Page 118

Dao Issiaka- 3me anne SI

Le partage du temps entre threads

Comment faire tourner plusieurs threads en mme temps alors que votre ordinateur ne possde qu'un seul microprocesseur ? La rponse vient de manire assez vidente : A tout moment, il n'y a en fait qu'un seul thread en cours d'excution, et ventuellement d'autres threads en attente d'excution. Si le systme permet de partager le temps d'excution entre les diffrents threads, il leur donne chacun leur tour un petit temps d'excution du processeur (quelques millisecondes). Sinon, chaque fois qu'un thread a termin d'excuter une srie d'instructions et qu'il cde le contrle au systme, le systme excute un des threads en attente, et ainsi de suite... Si la srie d'instructions qu'excute chaque thread prend un temps assez court, l'utilisateur aura l'illusion que tous les threads fonctionnent ensemble. Le seul contrle que peut avoir le programmeur sur la gestion de l'ordre dans lequel les threads en attente s'excuteront, s'effectue en donnant une priorit chaque thread qu'il cre. Quand le systme doit dterminer quel thread en attente doit tre excut, il choisit celui avec la priorit la plus grande, ou priorit gale, celui en tte de file d'attente. Sur certains systmes, la Machine Virtuelle Java ne partage pas d'elle-mme le temps du processeur entre les threads susceptibles d'tre excuts. Si vous voulez que vos programmes Java se comportent similairement sur tous les systmes, vous devez cder le contrle rgulirement dans vos threads avec les mthodes telles que sleep () ou yield (), pour permettre aux autres threads en attente, de s'excuter. Sinon, tant que l'excution d'un thread n'est pas interrompue, les autres threads resteront en attente !
La cration d'un thread

Il existe deux moyens d'crire des threads dans un programme : Les deux moyens passent par l'criture d'une mthode run () dcrivant les instructions que doit excuter un thread. Cette mthode run () est soit dclare dans une classe drive de la classe Thread , soit dclare dans n'importe quelle classe qui doit alors implmenter l'interface Runnable (cette interface ne dcrit que la mthode run ()). La seconde mthode est trs utile : elle permet d'ajouter les fonctionnalits des threads une classe existante, dans une classe drive. Par exemple, elle est utilise par la classe TimeCounter qui drive de la classe Counter et implmente l'interface Runnable. La classe Counter a d'abord t cre pour des besoins simples : Avoir disposition un compteur digital au look sympa, avec des mthodes telles que incrementCounter () ou decrementCounter (). Puis, le besoin s'est fait sentir d'avoir un compteur de temps : il a suffi donc de crer une classe TimeCounter drive de Counter, et d'y ajouter (entre autres) la mthode run (), qui incrmente toutes les secondes le compteur. Une autre dmarche aurait pu tre de crer la classe TimeCounter en la drivant de la classe Thread, et d'y ajouter en utilisant la composition un champ de classe Counter, et une mthode run () effectuant les mmes oprations. Mais, en conception oriente objet, cette seconde dmarche semblait moins naturelle : En effet, un objet TimeCounter est plutt comme tout objet Counter, un objet graphique auquel il a t ajout la possibilit de s'incrmenter automatiquement toutes les secondes. Un certain nombre de mthodes sont ncessaires pour contrler l'excution d'un thread. Elles sont toutes dcrites au paragraphe dcrivant la classe Thread, mais en voici les principales :

Programmer en java

Page 119

Dao Issiaka- 3me anne SI

La classe Thread dispose principalement de deux sortes de constructeurs : Thread () et Thread (Runnable objetRunnable). Quand vous crez un objet instance d'une classe ClasseThread drive de Thread, le premier est appel implicitement par le constructeur de ClasseThread. Le second est utilis quand vous voulez crer un objet de classe Thread dont la mthode run () excuter se trouve implmente dans un classe implmentant l'interface Runnable. Au passage, vous noterez que le paramtre du second constructeur doit tre une rfrence d'interface Runnable : En fait, vous passerez en argument une rfrence sur un objet d'une classe ClasseRunnable implmentant Runnable ; ceci est un exemple de conversion d'une rfrence d'une classe ClasseX dans une rfrence d'interface InterfaceY, si ClasseX implmente l'interface InterfaceY, applique avec ClasseRunnable pour ClasseX et Runnable pour InterfaceY. start () : Cette mthode permet de dmarrer effectivement le thread sur lequel elle est invoque, ce qui va provoquer l'appel de la mthode run () du thread. Cet appel est obligatoire pour dmarrer l'excution d'un thread. En effet, la cration d'un objet de classe Thread ou d'une classe drive de Thread (par exemple, grce l'appel new Thread ()) ne fait que crer un objet sans appeler la mthode run (). stop () : Cette mthode permet d'arrter un thread en cours d'excution. Elle est utile principalement pour stopper des threads dont la mthode run () ne se termine jamais (comme par exemple, dans la classe TimeCounter, la mthode run () n'a pas de raison de s'arrter d'elle-mme puisqu'aux dernires nouvelles, on n'a pas encore trouver le moyen d'arrter le temps !). sleep () : Ces mthodes static permettent d'arrter le thread courant pendant un certain laps de temps, pour permettre ainsi d'autres threads en attente, de s'excuter. Par exemple, une fois mis jour une horloge par un thread, celui-ci peut arrter son excution pendant une minute, en attendant la prochaine mise l'heure. yield () : Cette mthode static permet au thread courant de cder le contrle pour permettre d'autres threads en attente, de s'excuter. Le thread courant devient ainsi luimme en attente, et regagne la file d'attente. De manire gnrale, vos threads devraient s'arranger effectuer des sries d'instructions pas trop longues ou entrecouper leur excution grce des appels aux mthodes sleep () ou yield (). Il faut viter de programmer des sries d'instructions interminables sans appel sleep () ou yield (), en pensant qu'il n'y aura pas d'autres threads dans votre programme. La Machine Virtuelle Java peut avoir elle aussi des threads systme en attente et votre programme s'enrichira peut-tre un jour de threads supplmentaires... setPriority () : Permet de donner une priorit un thread. Le thread de plus grande priorit sera toujours excut avant tous ceux en attente.

Pour illustrer l'utilisation des threads, voici un exemple d'un chronomtre affichant les 1/10 de seconde (Utiliser le bouton Arrter pour l'arrter et la redmarrer) :

et le programme Java correspondant ( copier dans un fichier dnomm Chrono.java et invoqu partir d'un fichier HTML) :
import java.awt.*; import java.applet.Applet; public class Chrono extends Applet implements Runnable { private Thread chronometre;
Programmer en java Page 120

Dao Issiaka- 3me anne SI

private int

dixiemeseconde = 0;

// Mthode appele par le systme au dmarrage de l'applet public void start () { // Au dbut de l'applet, cration et dmarrage du chronomtre chronometre = new Thread (this); chronometre.start (); } public void run () { try { while (chronometre.isAlive ()) { // Dessine le compteur (appel indirect la mthode paint ()), // puis l'augmente de 1 repaint (); dixiemeseconde++; // Arrte le thread pendant 1/10 s (100 ms) Thread.sleep (100); } } catch (InterruptedException e) { } } // Mthode appele par le systme l'arrt de l'applet public void stop () { // A la fin de l'applet, arrt du chronometre chronometre.stop (); } // Mthode appele par le systme pour mettre jour le dessin de l'applet public void paint (Graphics gc) { // Dessine le temps coul sous forme de hh:mm:ss:d en noir et helvetica gc.setColor (Color.black); gc.setFont (new Font ("Helvetica", Font.BOLD, size ().height)); gc.drawString (dixiemeseconde / 36000 + ":" + (dixiemeseconde / 6000) % 6 + (dixiemeseconde / 600) % 10 + ":" + (dixiemeseconde / 100) % 6 + (dixiemeseconde / 10) % 10 + ":" + dixiemeseconde % 10, 2, size ().height - 2); } }

Ce programme s'utilisant sous forme d'applet, la classe Chrono drive de Applet, et implmente l'interface Runnable. Comme dcrit au chapitre sur les applets et aux chapitres suivants, la mthode paint () de la classe Applet est appele pour mettre jour le dessin apparaissant dans la fentre d'une applet : Ici, elle est outrepasse pour dessiner le chronomtre. Quand l'applet est cre, une instance de la classe Chrono est alloue et la mthode start () crant le thread chronometre, est appele. Si vous observez bien le comportement de cette
Programmer en java Page 121

Dao Issiaka- 3me anne SI

applet, vous vous rendrez facilement compte que le chronomtre une tendance retarder... Ceci est normal : En effet, chaque tour de boucle while (), le thread est arrt pendant un dixime de seconde grce l'appel Thread.sleep (100), aprs le redessin de l'applet avec la mthode repaint () dans run (). Mais, le fait de redessiner le chronomtre prend un faible dlai qui s'additionne au 1/10 de seconde d'arrt du thread chronometre. Une programmation plus prcise devrait notamment tenir compte de ce dlai pour le soustraire de la valeur de 100 millisecondes passe la mthode sleep (). La classe System dclare une mthode currentTimeMillis (), donnant le temps courant, qui peut vous y aider. A vous de jouer !...
Les tats d'un thread

Pendant son existence, un thread passe par plusieurs tats qu'il est utile de connatre pour bien comprendre les threads et leurs possibilits. La figure suivante reprsente l'ensemble des tats possibles d'un thread, et les transitions existantes pour passer d'un tat dans l'autre. Ne vous inquitez pas par sa complexit, vous aurez besoin essentiellement des mthodes dcrites dans le paragraphe prcdent (start (), stop (), yield () et sleep ()).

figure 10. Etats d'un thread

Quand un nouveau thread est cr, il est dans l'tat nouveau thread et ne devient excutable qu'aprs avoir appel la mthode start () sur ce nouveau thread. Parmi tous les threads dans l'tat excutable, le systme donne le contrle au thread de plus grande priorit, ou priorit gale, celui en tte de file d'attente, parmi les threads dans l'tat excutable. Le thread qui a le contrle un moment donn est le thread courant. Le thread courant en cours d'excution cde le contrle un autre thread excutable dans l'une des circonstances suivantes :

A la fin de la mthode run (), le thread passe dans l'tat mort. A l'appel de yield (), le thread passe dans l'tat excutable et rejoint la fin de la file d'attente. Sur les systmes permettant de partager le temps d'excution entre diffrents threads, le thread passe dans l'tat excutable aprs qu'un certain laps de temps se soit coul. En attentant que des oprations d'entre/sortie (IO) se terminent, le thread passe dans l'tat bloqu.
Page 122

Programmer en java

Dao Issiaka- 3me anne SI

A l'appel de sleep (), le thread passe dans l'tat bloqu pendant le temps spcifi en argument, puis repasse l'tat excutable, une fois ce dlai coul. A l'appel d'une mthode synchronized sur un objet Objet1, si Objet1 est dj verrouill par un autre thread, alors le thread passe dans l'tat bloqu tant que Objet1 n'est pas dverrouill (voir la synchronisation). A l'invocation de wait () sur un objet, le thread passe dans l'tat en attente pendant le dlai spcifi en argument ou tant qu'un appel notify () ou notifyAll () n'est pas survenu (voir la synchronisation). Ces mthodes sont dclares dans la classe Object. A l'appel de stop (), le thread passe dans l'tat mort. A l'appel de suspend (), le thread passe dans l'tat bloqu, et ne redevient excutable qu'une fois que la mthode resume () a t appele.

Les deux derniers mthodes ne sont pas static et peuvent tre invoques aussi sur les threads excutables qui ne sont en cours d'excution.
La synchronisation des threads

Tous les threads d'une mme Machine Virtuelle partage le mme espace mmoire, et peuvent donc avoir accs n'importe quels mthode ou champ d'objets existants. Ceci est trs pratique, mais dans certains cas, vous pouvez avoir besoin d'viter que deux threads n'aient accs n'importe quand certaines donnes. Si par exemple, un thread threadCalcul a pour charge de modifier un champ var1 qu'un autre thread threadAffichage a besoin de lire pour l'afficher, il semble logique que tant que threadCalcul n'a pas termin la mise jour ou le calcul de var1, threadAffichage soit interdit d'y avoir accs. Vous aurez donc besoin de synchroniser vos threads.
Utilisation de synchronized

La synchronisation des threads se fait grce au mot cl synchronized, employ principalement comme modificateur d'une mthode. Soient une ou plusieurs mthodes methodeI () dclares synchronized, dans une classe Classe1 et un objet objet1 de classe Classe1 : Comme tout objet Java comporte un verrou (lock en anglais) permettant d'empcher que deux threads diffrents n'aient un accs simultan un mme objet, quand l'une des mthodes methodeI () synchronized est invoque sur objet1, deux cas se prsentent :

Soit objet1 n'est pas verrouill : le systme pose un verrou sur cet objet puis la mthode methodeI () est excute normalement. Quand methodeI () est termine, le systme retire le verrou sur Objet1. La mthode methodeI () peut tre rcursive ou appeler d'autres mthodes synchronized de Classe1 ; chaque appel d'une mthode synchronized de Classe1, le systme rajoute un verrou sur Objet1, retir en quittant la mthode. Quand un thread a obtenu accs un objet verrouill, le systme l'autorise avoir accs cet objet tant que l'objet a encore des verrous (rentrance des mthodes synchronized). Soit objet1 est dj verrouill : Si le thread courant n'est pas celui qui a verrouill objet1, le systme met le thread courant dans l'tat bloqu, tant que objet1 est verrouill. Une fois que objet1 est dverrouill, le systme remet ce thread dans l'tat excutable, pour qu'il puisse essayer de verrouiller objet1 et excuter methodeI ().

Programmer en java

Page 123

Dao Issiaka- 3me anne SI

Si une mthode synchronized d'une classe Classe1 est aussi static, alors l'appel de cette mthode, le mme mcanisme s'excute mais cette fois-ci en utilisant le verrou associ la classe Classe1. Si Classe1 a d'autres mthodes qui ne sont pas synchronized, celles-ci peuvent toujours tre appeles n'importe quand, que objet1 soit verrouill ou non. Voici un exemple illustrant l'utilisation de mthodes synchronized, avec une applet affichant les rsultats d'un calcul de courbes, quand ceux-ci sont valables. Comme cette applet fait des calculs continuels dans des boucles sans fin, elle n'est pas incluse dans cette page pour viter de bloquer votre navigateur, mais essayez-l sur votre machine pour dcouvrir tout l'intrt de la synchronisation des threads.

Voici le programme Java ( copier dans un fichier dnomm AfficheurDeCalcul.java et invoqu partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; public class AfficheurDeCalcul extends Applet { private Thread calculateur; private Thread afficheur; // Mthode appele par le systme au dmarrage de l'applet public void start () { setBackground (Color.white); // Dmarrage de deux threads l'un pour calculer une courbe, // l'autre pour l'affichage calculateur = new Calculateur (this); afficheur = new Afficheur (this); calculateur.start (); afficheur.start (); } // Mthode appele par le systme l'arrt de l'applet public void stop () { // Arrt des deux threads afficheur.stop (); calculateur.stop (); } private int [ ] courbe; // calculerCourbe () et paint () sont // synchronized ce qui les empche de fonctionner simultanment synchronized public void calculerCourbe () { // Cration d'un tableau de la largeur de l'applet courbe = new int [size ().width]; // Calcul des points d'une sinusode avec frquence alatoire

Programmer en java

Page 124

Dao Issiaka- 3me anne SI

double pasCalcul = 2 * Math.PI / courbe.length / Math.random (); for (int i = 0; i < courbe.length; i++) courbe [i] = (int)( (Math.sin (i * pasCalcul) + 1) * size ().height / 2); } synchronized public void dessinerCourbe () { update (getGraphics ()); // update () efface le fond puis appelle paint () } // Mthode appele par le systme pour mettre jour le dessin de l'applet synchronized public void paint (Graphics gc) { if (courbe != null) { // Dessin de la courbe en noir en reliant les points un un gc.setColor (Color.black); for (int i = 1; i < courbe.length; i++) gc.drawLine (i - 1, courbe [i - 1], i, courbe [i]); } } } class Calculateur extends Thread { private AfficheurDeCalcul applet; public Calculateur (AfficheurDeCalcul applet) { this.applet = applet; } public void run () { while (isAlive ()) applet.calculerCourbe (); // Lance les calculs indfiniment } } class Afficheur extends Thread { private AfficheurDeCalcul applet; public Afficheur (AfficheurDeCalcul applet) { this.applet = applet; } public void run () { while (isAlive ()) applet.dessinerCourbe (); // Lance les affichages indfiniment } }

Dans cette exemple, les mthodes calculerCourbe () et dessinerCourbe () de la classe AfficheurDeCalcul sont synchronized. Quand calculerCourbe () prparent les rsultats
Programmer en java Page 125

Dao Issiaka- 3me anne SI

dans le tableau courbe de l'applet, il ne faut pas qu'un autre thread puisse dessiner la courbe de cette applet en appelant dessinerCourbe (), et inversement ! L'objet reprsentant l'applet est verrouill l'appel de ces mthodes, pour bloquer tout autre thread tentant d'invoquer calculerCourbe () ou dessinerCourbe () sur cet objet. Les deux threads calculateur et afficheur s'interdisent ainsi mutuellement d'excuter simultanment calculerCourbe () ou dessinerCourbe () sur l'objet calculateur. Si, en recopiant l'exemple, vous essayez de supprimer l'un ou les deux synchronized, vous verrez tout coup que les courbes affiches ne sont plus trs rgulires, preuve que la courbe est modifie pendant son affichage !... A l'usage, vous vous rendrez compte que les boucles sans fin (ou presque !) des mthodes run () fonctionnent gnralement correctement mais ont une forte tendance plomber les performances du systme, car elles tournent continuellement sans s'arrter... Le programme se prsente ainsi par soucis de simplification et pour que vous puissiez vous rendre compte que deux threads qui s'ignorent (ils ne s'appellent jamais l'un l'autre) peuvent se synchroniser pour accder un mme objet pour obtenir un rsultat correct. Le systme ne cre pas de file d'attente pour les threads bloqus : Quand un objet est dverrouill, n'importe quel thread bloqu sur cet objet est susceptible d'tre dbloqu pour avoir accs une de ses mthodes synchronized. Dans l'exemple prcdent, rien n'empche en effet les mthodes calculerCourbe () ou dessinerCourbe () de s'excuter plusieurs fois de suite, avant que l'autre mthode ne verrouille l'objet reprsentant l'applet et puisse s'excuter. Pour vous le prouver, il vous suffit d'ajouter des appels System.out.println (...) dans ces deux mthodes... Il existe une autre syntaxe d'utilisation de synchronized :
class Classe1 { // ... void methode1 () { // ... synchronized (objet1) { // objet1 est verrouill // jusqu' la fin du bloc } } }

Un thread peut accder un bloc synchronized, si objet1 n'est pas verrouill par un autre thread. Si c'est le cas, comme pour une mthode synchronized, le thread est bloqu tant que objet1 n'est pas dverrouill. La Machine Virtuelle Java n'a pas de moyen de reprer les deadlocks (impasses) : Ceux-ci peuvent survenir quand par exemple, deux threads thread1 et thread2 restent dans l'tat bloqu parce que thread1 attend qu'un objet objetX soit dverrouill par thread2, alors que thread2 attend qu'un objetY soit dverrouill par thread1. C'est vous de faire attention dans votre programmation pour qu'un deadlock ne survienne pas.

Programmer en java

Page 126

Dao Issiaka- 3me anne SI

Synchronisation avec wait () et notify ()

Comme il est expliqu dans l'exemple prcdent, synchronized permet d'viter que plusieurs threads aient accs en mme temps mme objet, mais ne garantit pas l'ordre dans lequel ces mthodes seront excutes par des threads. Pour cela, il existe plusieurs mthodes de la classe Object qui permettent de mettre en attente volontairement un thread sur un objet (avec les mthodes wait ()), et de prvenir des threads en attente sur un objet que celui-ci est jour (avec les mthodes notify () ou notifyAll ()). Ces mthodes ne peuvent tre invoques que sur un objet verrouill par le thread courant, c'est--dire que le thread courant est en train d'excuter une mthode ou un bloc synchronized, qui a verrouill cet objet. Si ce n'est pas le cas, une exception IllegalMonitorStateException est dclenche. Quand wait () est invoque sur un objet objet1 (objet1 peut tre this), le thread courant perd le contrle, est mis en attente et l'ensemble des verrous d'objet1 est retir. Comme chaque objet Java mmorise l'ensemble des threads mis en attente sur lui, le thread courant est ajout la liste des threads en attente de objet1. objet1 tant dverrouill, un des threads bloqus parmi ceux qui dsiraient verrouiller objet1, peut passer dans l'tat excutable et excuter une mthode ou un bloc synchronized sur objet1. Un thread thread1 mis en attente est retir de la liste d'attente de objet1, quand une des trois raisons suivantes survient :
thread1 a t mis en attente en donnant en argument wait () un dlai qui a fini de s'couler. Le thread courant a invoqu notify () sur objet1, et thread1 a t choisi parmi tous les threads en attente. Le thread courant a invoqu notifyAll () sur objet1.

thread1

est mis alors dans l'tat excutable, et essaye de verrouiller objet1, pour continuer son excution. Quand il devient le thread courant, l'ensemble des verrous qui avait t enlev d'objet1 l'appel de wait (), est remis sur objet1, pour que thread1 et objet1 se retrouvent dans le mme tat qu'avant l'invocation de wait (). Un thread mis en attente en utilisant la mthode wait () sans argument sur un objet, ne peut redevenir excutable qu'une fois qu'un autre thread a invoqu notify () ou notifyAll () sur ce mme objet. Donc, wait () doit toujours tre utilis avec notify (), et tre invoqu avant cette dernire mthode.

Par exemple, si dans l'exemple prcdent, vous ajoutez la fin de la mthode calculerCourbe (), vous ajoutez notifyAll () et au dbut de dessinerCourbe (), vous ajoutez wait (), vous obtiendrez ceci :
public class AfficheurDeCalcul extends Applet { // ... synchronized public void calculerCourbe () {

Programmer en java

Page 127

Dao Issiaka- 3me anne SI

courbe = new int [size ().width]; double pasCalcul = 2 * Math.PI / courbe.length / Math.random (); for (int i = 0; i < courbe.length; i++) courbe [i] = (int)( (Math.sin (i * pasCalcul) + 1) * size ().height / 2); // Prvenir les autres threads du calcul d'une nouvelle courbe notifyAll (); } synchronized public void dessinerCourbe () { try { // Attendre qu'une nouvelle courbe soit calcule wait (); update (getGraphics ()); } catch (InterruptedException e) { } } // ... }

A l'appel de wait () (ici sur l'objet this), le thread afficheur qui appelle la mthode dessinerCourbe () est mis en attente jusqu' ce que ce que calculerCourbe () appelle notifyAll () pour prvenir les threads en attente qu'une nouvelle courbe est maintenant disponible. Ceci vite que dessinerCourbe () soit ventuellement excute plusieurs fois de suite alors qu'aucune nouvelle courbe n'a t calcule. Il vaut mieux utiliser notifyAll () que notify (), car il est possible d'enrichir ce programme en crant par exemple des threads qui devront appeler dessinerCourbe () pour mettre jour des fentres supplmentaires, ou en crant un autre thread appelant une mthode synchronized qui enregistre la courbe dans un fichier. Si la mthode notify () tait appele, un seul thread serait prvenu et mis jour en ignorant les autres. Cette modification du programme n'empche toujours pas la mthode calculerCourbe () de s'excuter plusieurs fois de suite, car le thread calculateur qui appelle cette mthode, prvient en invoquant notifyAll () les threads en attente qu'une nouvelle courbe a t calcule, mais n'est jamais mis en attente pour laisser les autres threads utiliser ces nouveaux rsultats. Une dernire modification des mthodes calculerCourbe () et dessinerCourbe () permet au thread afficheur appelant dessinerCourbe () de prvenir le thread calculateur en attente qu'il a termin de dessiner la nouvelle courbe :
public class AfficheurDeCalcul extends Applet { // ... synchronized public void calculerCourbe () { try { // Attendre que les autres threads aient utilis une courbe if (courbe != null) wait (); } catch (InterruptedException e) { }

Programmer en java

Page 128

Dao Issiaka- 3me anne SI

courbe = new int [size ().width]; double pasCalcul = 2 * Math.PI / courbe.length / Math.random (); for (int i = 0; i < courbe.length; i++) courbe [i] = (int)( (Math.sin (i * pasCalcul) + 1) * size ().height / 2); notifyAll (); } synchronized public void dessinerCourbe () { try { // Attendre qu'une courbe soit cre if (courbe == null) wait (); update (getGraphics ()); // Prvenir que la courbe a t utilise courbe = null; notify (); } catch (InterruptedException e) { } } // ... }

Ici, en modifiant le champ courbe avec null ou un nouveau tableau, un thread peut savoir si l'autre terminer son traitement ou non. Si ce traitement n'est pas termin, le thread se met en attente. Il redeviendra excutable quand l'autre thread le prviendra qu'il a fini en appelant notify (). Vous noterez que dessinerCourbe () mettant null le champ courbe avant d'appeler notify (), il faudrait utiliser une autre logique de programmation pour que cette courbe reste disponible pour d'autres threads qui seraient crs. Cet exemple, utilisant deux boucles (sans fin) pour le calcul et l'affichage des courbes, entrane une programmation d'un abord assez complexe. Mais, ceci n'est utilis que pour des moyens de dmonstration : Gnralement, dans ce type de programme, un calcul est effectu ponctuellement sur commande et pas en boucle, et l'affichage attend la fin du calcul pour dmarrer. Donc, la programmation avec uniquement synchronized comme dans la premire version de cet exemple, suffira dans la plupart des cas pour synchroniser l'accs aux donnes. La programmation de la synchronisation des threads est une tche ardue, sur laquelle vous passerez srement du temps... Si vous dsirez l'utiliser, il faut bien s'imaginer par quels tats vont passer les threads, quelle implication aura l'utilisation des mthodes wait () et notify () sur l'ordre d'excution des instructions du programme, tout en gardant bien l'esprit que ces mthodes ne peuvent tre invoques que sur des objets verrouills. Le pige le plus classique est de se retrouver avec un deadlock parce que les threads sont tous en attente aprs avoir appel chacun d'eux la mthode wait ().

Programmer en java

Page 129

Dao Issiaka- 3me anne SI

La classe java.lang.Thread Champs


public final static int MIN_PRIORITY public final static int NORM_PRIORITY public final static int MAX_PRIORITY

Ces constantes sont utilises en argument de la mthode setPriority (), pour donner une priorit vos threads (MIN_PRIORITY est gal 1, NORM_PRIORITY 5 et MAX_PRIORITY 10). NORM_PRIORITY est la priorit par dfaut d'un thread.
Constructeurs
public Thread () public Thread (Runnable target)

Construit un nouveau thread partir de la classe target implmentant l'interface Runnable. target doit implmenter la mthode run () qui sera la mthode excute au dmarrage du nouveau thread cr.
public Thread (ThreadGroup group, Runnable target) throws SecurityException, IllegalThreadStateException

Construit un nouveau thread partir de la classe target avec comme groupe de thread group. La classe ThreadGroup permet de regrouper un ensemble de threads, et d'excuter (stop (), suspend (),...) des mthodes sur tous les threads d'un groupe.
public Thread (String name) public Thread (ThreadGroup group, String name) throws SecurityException, IllegalThreadStateException public Thread (Runnable target, String name) public Thread (ThreadGroup group, Runnable target, String name) throws SecurityException, IllegalThreadStateException

Mmes constructeurs que prcdemment avec un nom name.


Mthodes

La classe Thread compte un grand nombre de mthodes, dont voici la description des plus intressantes. Pour pouvoir manipuler le thread courant que vous ne connaissez pas forcment, certaines de ces mthodes sont des mthodes de classe :
public static Thread currentThread ()

Renvoie une rfrence sur le thread actuellement en cours d'excution.


public synchronized void start () throws IllegalThreadStateException

Provoque le dmarrage du thread sur lequel start () est invoqu puis l'appel la mthode run (). Cette mthode rend la main immdiatement (le nouveau thread est lanc en parallle au thread courant).
public void run ()
Programmer en java Page 130

Dao Issiaka- 3me anne SI

est la mthode o sont dcrites les instructions que doit excuter un thread. Elle est appele une fois que le thread a dmarr. run () doit tre outrepasse dans une classe drive de Thread ou une classe implmentant l'interface Runnable.
run () public final synchronized void stop () throws SecurityException

Arrte le thread sur lequel stop () est invoqu.


public final void stop (Throwable exception) throws SecurityException

Arrte le thread sur lequel stop () est invoqu en dclenchant l'exception exception.
public final boolean isAlive ()

Renvoie true si un thread est vivant, c'est--dire que ce thread a dmarr avec start () et n'a pas t arrt soit avec stop (), soit parce qu'il a termin d'excuter toutes les instructions de la mthode run ().
public static void yield ()

Permet de suspendre le thread courant pour laisser la main d'autres threads en attente d'excution.
public static void sleep (long millis) throws InterruptedException public static void sleep (long millis, int nanos) throws InterruptedException

Provoque l'arrt du thread courant pendant millis millisecondes, ou pendant millis millisecondes et nanos nanosecondes. Ces mthodes sont susceptibles de dclencher une exception InterruptedException, qui n'est pas utilise dans Java 1.0, mais vous oblige quand mme inclure l'appel sleep () dans un try ... catch.
public final void suspend () throws SecurityException

Suspend l'excution d'un thread vivant. Si plusieurs suspend () ont t invoques sur un mme thread, un seul resume () est ncessaire pour que ce thread reprenne son activit.
public final void resume () throws SecurityException

Reprend l'excution d'un thread, aprs une suspension avec suspend (). Si ce thread n'a pas t suspendu, le thread poursuit son excution.
public void checkAccess ()

Vrifie si le thread courant peut modifier le thread sur lequel checkAccess () est invoqu. Si cela lui est interdit, une exception SecurityException est dclenche.
public final void setPriority (int newPriority) throws SecurityException, IllegalArgumentException public final int getPriority ()

Programmer en java

Page 131

Dao Issiaka- 3me anne SI

Modifie ou renvoie la priorit d'un thread. newPriority doit avoir une valeur comprise entre MIN_PRIORITY et MAX_PRIORITY.
public final void setName (String name) throws SecurityException public final String getName ()

Modifie ou renvoie le nom d'un thread.


public final void setDaemon (boolean on) throws SecurityException, IllegalThreadStateException public final boolean isDaemon ()

Permet de spcifier ou de savoir si un thread est un thread qui tourne en tche de fond, pour rendre en gnral des services aux autres threads (daemon thread en anglais). Quand il n'a plus que des threads qui tournent en tche de fond dans le systme, la Machine Virtuelle Java s'arrte.
public final synchronized void join (long millis) throws InterruptedException public final synchronized void join (long millis, int nanos) throws InterruptedException public final void join () throws InterruptedException

Ces mthodes provoquent l'arrt du thread courant jusqu' la mort du thread sur lequel est invoqu join (), et pendant un dlai maximum de de millis millisecondes, ou millis millisecondes et nanos nanosecondes.
public static void dumpStack ()

Imprime sur System.err l'tat de la pile d'excution du thread courant.


public final ThreadGroup getThreadGroup ()

Renvoie le groupe de threads auquel appartient un thread.


public static int activeCount () public static int enumerate (Thread tarray [ ])

Ces mthodes renvoient le nombre de threads actifs dans le groupe auquel appartient le thread courant, et la liste des threads actifs de ce groupe dans le tableau tarray ( tarray doit exister et tre de taille suprieure ou gale la valeur renvoye par activeCount ()).
public void interrupt ()

Cette mthode et les deux suivantes ne sont implmentes qu' partir de Java 1.1. Cette mthode permet d'interrompre un thread. Si ce thread est en attente, il est excut et une exception InterruptedException est dclenche.
public static boolean interrupted () public boolean isInterrupted () public String toString ()

Programmer en java

Page 132

Dao Issiaka- 3me anne SI

Renvoie une chane de caractre reprsentant un thread (comprenant son nom, sa priorit et le nom du groupe de thread auquel il appartient). Cette mthode outrepasse celle de la classe Object.
public void destroy () public int countStackFrames () throws IllegalThreadStateException

Exemples

Application PaperBoardServer. Applets Chrono, AfficheurDeCalcul, ObservateurCalcul, PaperBoardClient, AnimationFleche, ScrollText et Horloge.

Programmer en java

Page 133

Dao Issiaka- 3me anne SI

Les classes internes


Les classes internes Les classes anonymes Autres nouveauts Java 1.1

Ce chapitre dcrit les ajouts apports dans le langage Java partir de Java 1.1, et particulirement les classes internes (inner classes).
Les classes internes Syntaxe

Avec Java 1.0, il n'est possible de crer des classes public ou non qu'au niveau le plus haut dans un fichier .java, c'est dire des classes externes dpendant directement d'un package. Java 1.1 introduit la possibilit de crer des classes internes ou interfaces internes qui sont dclares l'intrieur d'une classe ou d'une interface, en plus des mthodes et des champs :
class ClasseExterne { // Dclararation d'une classe interne ModificateurClasseInterne class ClasseInterne { // Corps de ClasseInterne : // Dclaration des champs, des mthodes, des constructeurs,... } // Dclaration d'une classe interne drivant d'une super classe // et implmentant une interface ModificateurClasseInterne class ClasseInterne2 extends nomDeSuperClasse implements nomInterface //, nomInterface2, ... { // ... } // Dclararation d'une interface interne ModificateurInterfaceInterne interface InterfaceInterne { } // Autres dclarations }

Programmer en java

Page 134

Dao Issiaka- 3me anne SI

ModificateurClasseInterne

est optionnel et peut tre un ou plusieurs des mots-cls

suivants :
public, protected ou private : Ces mots cls indiquent le modificateur d'accs de la

classe interne et ont le mme sens que pour la dclaration des champs d'une classe.
final : Comme pour une classe externe, une classe interne dclare final ne peut tre

drive.
abstract : Comme pour une classe externe, il est impossible de crer une instance d'une classe interne dclare abstract. static : Les classes internes dclares sont trs diffrentes si elles sont dclares static

ou non. Comme pour les champs static, une classe interne static ou ses instances ne dpend d'aucune instance de la classe externe dans laquelle est elle est dfinie. Dans ce cas, il est possible de crer une instance d'une classe interne simplement par new ClasseExterne.ClasseInterne () par exemple. L'instance d'une classe interne non static stocke automatiquement une rfrence vers l'instance de la classe externe ClasseExterne dont elle dpend, ce qui permet d'utiliser directement toutes les mthodes et les champs de la classe ClasseExterne. Cette rfrence doit tre donne la cration d'un objet de cette classe interne comme par exemple objetClasseExterne.new ClasseInterne () pour crer un objet de classe ClasseInterne dpendant de l'objet objetClasseExterne de classe ClasseExterne.
ModificateurInterfaceInterne peut prendre toutes les valeurs que ModificateurClasseInterne, sauf final (abstract est implicite). Une classe interne non static ne peut pas dclarer des champs et des mthodes static.

De mme dans un bloc, il est possible de dclarer des classes internes locales dont la porte est limite au bloc. Dans ce cas, ModificateurClasseInterne ne peut tre prendre comme valeur que final ou abstract. Une classe interne peut dclarer elle-mme d'autres classes internes. Pour chacune des classes internes dclares est gnr un fichier .class la compilation. Pour assurer l'unicit du nom de ces fichiers, la syntaxe suivante est utilise : La classe interne ClasseInterne dclare l'intrieur d'une classe externe ClasseExterne, sera stocke dans le fichier ClasseExterne$ClasseInterne.class. Pour les classes internes dclares dans un bloc, le nom de fichier comporte en plus un identifiant numrique gnr par le compilateur donnant comme nom de fichier par exemple ClasseExterne$1$ClasseInterne.class. Java 1.1 permet de dclarer des classes internes (inner classes). Les classes internes static correspondent aux classes internes du C++ (nested classes). Par contre les classes internes non static sont un concept inexistant en C++ et permettent aux instances de ces classes de garder implicitement un lien avec l'instance de la classe externe dont elles dpendent.

Le mcanisme utilis par le compilateur Java 1.1 pour gnrer les classes internes est entirement compatible avec la Machine Virtuelle Java 1.0.
Programmer en java Page 135

Dao Issiaka- 3me anne SI

Donc mme si vous faites fonctionner vos applets avec Java 1.0, vous pouvez leur permettre quand mme d'utiliser les classes internes en les compilant avec un compilateur Java 1.1 en donnant comme classpath la librairie des classes de Java 1.0.
Utilisation

Bien qu'il ne soit pas obligatoire de s'en servir, les classes internes apportent un plus pour l'organisation et la programmation des classes de votre programme :

L'existence de certaines classes n'a de sens que dans le contexte d'une autre classe. Dans ce cas, il peut tre intressant de les dclarer comme classes internes pour montrer aux utilisateurs de ces classes dans quel contexte elles s'utilisent. Les classes externes peuvent avoir un modificateur d'accs public ou friendly. Toutes les classes non public d'un package donn sont accessibles toutes les autres classes de ce package, ce qui n'a pas toujours l'effet dsir. Une classe interne dont le modificateur d'accs est private n'est accessible que par la classe externe dans laquelle elle est dclare. Le nommage des classes est simplifi : certaines classes utilitaires de mme genre peuvent avoir tre dclares dans des contextes diffrents. Si ces classes sont dclares comme classes internes, elles pourront porter le mme nom sans interfrer entre elles, et vous n'aurez pas inventer des noms rallonge pour les diffrencier. Comme une classe interne peut tre dclare n'importe o dans une classe, il est permis de la rapprocher de l'endroit o elle est le plus utilise, pour amliorer la lisibilit du programme. La possibilit d'utiliser directement toutes les champs et les mthodes de la classe externe dans une classe interne non static simplifie dans de nombreux cas la programmation, comme dans le cas suivant repris de l'applet AfficheurDeCalcul : Cette applet dclare les deux classes non public Calculateur et Afficheur drivant de la classe Thread. Ces deux classes ont besoin d'une rfrence sur l'instance de l'applet et l'utilisation des classes internes permet d'en simplifier la programmation car elles gardent cette rfrence automatiquement : Sans classe interne
import java.applet.Applet; import java.awt.*; public class AfficheurDeCalcul extends Applet { private Thread calculateur; private Thread afficheur; public void start () { setBackground (Color.white); // Cration de deux instances des classes // Calculateur et Afficheur calculateur = new Calculateur (this); afficheur = new Afficheur (this);

Avec classe interne


import java.applet.Applet; import java.awt.*; public class AfficheurDeCalcul extends Applet { private Thread calculateur; private Thread afficheur; public void start () { setBackground (Color.white); // Cration de deux instances des classes // internes Calculateur et Afficheur calculateur = new Calculateur (); afficheur = new Afficheur

Programmer en java

Page 136

Dao Issiaka- 3me anne SI

(); calculateur.start (); afficheur.start (); } } // ... // Les mthodes stop (), calculerCourbe () // dessinerCourbe () et paint () // sont inchanges } // Fin de AfficheurDeCalcul // Classe friendly drivant de Thread class Calculateur extends Thread { private AfficheurDeCalcul applet; public Calculateur (AfficheurDeCalcul applet) { this.applet = applet; } public void run () { while (isAlive ()) applet.calculerCourbe (); } } // ... // Les mthodes stop (), calculerCourbe () // dessinerCourbe () et paint () // sont inchanges calculateur.start (); afficheur.start ();

// Classe interne drivant de Thread private class Calculateur extends Thread { public void run () { while (isAlive ()) // calculerCourbe (), mthode de // la classe externe AfficheurDeCalcul // peut tre appele directement calculerCourbe (); } }

// Classe friendly drivant de Thread class Afficheur extends Thread { private AfficheurDeCalcul applet; public Afficheur (AfficheurDeCalcul applet) { this.applet = applet; } public void run () { while (isAlive ()) applet.dessinerCourbe (); } }

// Classe interne drivant de Thread private class Afficheur extends Thread { public void run () { while (isAlive ()) // dessinerCourbe (), mthode de // la classe externe AfficheurDeCalcul // peut tre appele directement dessinerCourbe (); } }

} // Fin de AfficheurDeCalcul

Programmer en java

Page 137

Dao Issiaka- 3me anne SI

Les classes anonymes

Par extension des classes internes locales, vous pouvez dclarer aussi des classes "anonymes" en Java. C'est un ajout la syntaxe de l'oprateur new : Aprs l'instruction new Classe1 (), il est possible d'ajouter un bloc permettant de modifier le comportement de Classe1, en outrepassant telle ou telle mthode de Classe1. Rsultat : un objet d'une classe "anonyme" drive de Classe1 est cr, puis un cast implicite de cette classe vers Classe1 est effectu.
SuperClasse objet = new SuperClasse (/* argument1, argument2, ...*/) { // Mthodes de SuperClasse outrepasses // pour modifier le comportement de SuperClasse };

Dans la mme logique, il est possible de crer une instance d'une classe anonyme implmentant une interface InterfaceX, grce l'instruction :
InterfaceX objet2 = new InterfaceX () { // Implmentation de toutes les mthodes de InterfaceX };

Dans ce cas, le bloc qui suit new InterfaceX () doit implmenter toutes les mthodes de InterfaceX pour qu'il soit possible de crer une instance d'une telle classe. Comme toute classe interne, une classe anonyme peut dclarer un ensemble de champs et de mthodes d'instances. Pour chacune des classes anonymes dclares est gnr un fichier .class la compilation. Pour assurer l'unicit du nom de ces fichiers, le nom de chaque fichier est constitu du nom de la classe externe suivi du symbole $ et d'un identifiant numrique gnr par le compilateur, comme par exemple ClasseExterne$1.class. Bien que les classes anonymes peuvent en apparence obscurcir la lisibilit d'un programme, il existe un ensemble de circonstances o il est intressant de les utiliser :

Pour crer une instance d'un objet d'une classe dont on veut outrepasser juste une ou deux mthodes. Implmenter localement une interface telle qu'un listener. Ce type d'interface est utilis dans la gestion de l'Interface Utilisateur AWT partir de Java 1.1 pour dclarer les mthodes qu'une classe doit implmenter pour tre rappeles quand un vnement survient.

Par exemple, il est possible d'encore simplifier l'applet AfficheurDeCalcul, en remplaant les classes internes Calculateur et Afficheur par des classes anonymes :
import java.applet.Applet; import java.awt.*; public class AfficheurDeCalcul extends Applet { private Thread calculateur; private Thread afficheur;
Programmer en java Page 138

Dao Issiaka- 3me anne SI

public void start () { setBackground (Color.white); // Cration de deux instances de classes // anonymes implmentant la mthode run () // de la classe Thread calculateur = new Thread () { public void run () { while (isAlive ()) // calculerCourbe (), mthode de // la classe externe AfficheurDeCalcul // peut tre appele directement calculerCourbe (); } }; afficheur = new Thread () { public void run () { while (isAlive ()) // dessinerCourbe (), mthode de // la classe externe AfficheurDeCalcul // peut tre appele directement dessinerCourbe (); } }; calculateur.start (); afficheur.start (); } // // // // } ... Les mthodes stop (), calculerCourbe () dessinerCourbe () et paint () sont inchanges

Les classes anonymes permettent de transformer facilement un programme existant pour excuter un bloc d'instructions dans un thread isol en ajoutant sur place les quelques instructions suivantes :
Avant
// ...

Aprs
// ... new Thread () { public void run () { // Bloc d'instructions } }.start ();

{ // Bloc d'instructions }

Pour viter toute confusion avec le reste des instructions, utilisez des rgles d'criture et une indentation claires pour l'criture des classes anonymes.
Programmer en java Page 139

Dao Issiaka- 3me anne SI

Autres nouveauts Java 1.1 Initialisations d'instance

En plus des initialisations static, il est possible d'ajouter une classe des blocs d'initialisations d'instance. Ces blocs d'instructions sont excuts la cration d'un objet juste aprs le constructeur de sa super classe et avant tout constructeur de sa classe. Ces initialisations sont surtout utiles pour les classes anonymes qui ne peuvent pas dclarer de constructeurs. Sauf pour les classes anonymes, les blocs d'initialisations d'instance d'une classe Classe1 ne peuvent dclencher d'exceptions que si tous les constructeurs de Classe1 dclarent qu'ils sont susceptibles de dclencher ces classe d'exceptions avec la clause throws.
Initialisation de tableaux

Les tableaux peuvent tre initialiss leur cration en faisant suivre l'instruction de cration du tableau new Classe0 [], par la liste des lments stocker, comme dans l'exemple suivant :
class Classe1 { // Les deux instructions suivantes sont quivalentes int [ ] tab1 = {1, 2}; int [ ] tab2 = new int [] {1, 2}; void methode1 (String [] tab) { } void methode2 () { // Possibilit de crer des tableaux, envoys // directement en paramtre une mthode methode1 (new String [] {"valeur1", "valeur2"}); } }

Comme vous pouvez le voir, c'est surtout pratique pour envoyer un tableau en paramtre sans avoir le dclarer dans une instruction spare.
Utilisation du mot-cl class

Toute classe ou interface peut tre suivie du mot-cl class : ceci produit le mme effet que l'utilisation de la mthode forName () de la classe Class. L'instruction String.class quivalente Class.forName ("java.lang.String") est bien plus pratique utiliser car vous n'tes pas oblig de donner le package complet de la classe String et d'intercepter l'exception ClassNotFoundException que peut dclencher la mthode forName (). Cette nouvelle syntaxe peut tre aussi utilise pour tous les types primitifs et void, de la manire suivante :

Programmer en java

Page 140

Dao Issiaka- 3me anne SI

byte.class short.class int.class long.class float.class double.class char.class boolean.class void.class

Ceci est utilis en particulier par les classes du package java.lang.reflect pour manipuler tous les types Java (que ce soient des classes ou des types primitifs) sous forme d'un objet de classe Class.
Variables locales et paramtres final

Les variables locales et les paramtres d'une mthode ou d'un constructeur peuvent tre dclars final.
TypeRetour methode1 (final TypeParam1 param1Name /*,... */) { final TypeVariable variableLocale1 = valeur; // ... }

Il n'est pas obligatoire d'initialiser une variable locale final ds sa dclaration, mais par contre il n'est possible de lui assigner qu'une seule fois une valeur. Tout paramtre ou toute variable locale que vous voulez utiliser dans une classe anonyme doivent tre dclars final. Ceci permet cette classe anonyme d'utiliser ces variables temporaires sans risque qu'elles soient modifies ultrieurement. Par contre, tous les champs d'instance ou de classe existent de faon permanente et peuvent tre utilises dans une classe anonyme qu'elles soient final ou non. Comme avec const en C/C++, les paramtres d'une mthode peuvent tre dclars constants grce final en Java. Mais ceci interdit uniquement une mthode de modifier la valeur d'un paramtre. Si un paramtre param1 final est une rfrence sur un objet, il est impossible de modifier param1 mais l'objet dsign par param1 lui peut tre modifi.

Programmer en java

Page 141

Dao Issiaka- 3me anne SI

Ajouts syntaxiques de Java 5.0


Enumration
import static

Liste d'arguments variable Autoboxing / auto-unboxing Boucle itrative Gnricit Annotations

Ce chapitre prsente un aperu des nombreuses nouveauts syntaxiques apportes au langage Java partir de Java 5.0 (ou 1.5), savoir :

les numrations de constantes avec le mot-cl enum import static pour viter d'crire systmatiquement l'identificateur d'une classe devant l'un de ses membres static les listes d'arguments variables l'autoboxing pour faciliter la cration d'une instance de classe d'emballage partir d'une valeur de type primitif la gnricit et les boucles itratives pour simplifier la gestion des lments d'un tableau ou d'une collection la possibilit d'ajouter des annotations ou metadata une classe.

Enumration

Le nouveau mot-cl enum permet d'numrer une liste homogne de constantes, comme en C++ et en C#. Dans les faits, une numration Java, appele aussi une numration de type sr, est une classe qui dfinit un ensemble de constantes dont le type est la classe elle-mme. Le langage Java a t aussi enrichi pour permettre de tester les valeurs d'une numration avec l'instruction switch. Par exemple, les deux applications suivantes effectuent un test avec l'instruction switch, l'une sur un ensemble de constantes dfinies dans une classe, l'autre sur une numration.
Avec classe de constantes
// Dclaration d'une classe de constantes class Titre { public static final int MONSIEUR
Programmer en java

Avec numration
// Dclaration d'une numration enum Titre {MONSIEUR, MADAME, MADEMOISELLE};

Page 142

Dao Issiaka- 3me anne SI

= 0; public static final int MADAME = 1; public static final int MADEMOISELLE = 2; }; class AfficherTitre { public static void main(String[] args) { int titreContact = Titre.MONSIEUR; String message = "Titre " + titreContact + " = "; switch (titreContact) { case Titre.MONSIEUR : message += "Mr"; break; case Titre.MADAME : message += "Mme"; break; case Titre.MADEMOISELLE : message += "Melle"; break; } // Affiche Titre 0 = Mr System.out.println (message); } }

class EnumerationTitre { public static void main(String[] args) { Titre titreContact = Titre.MONSIEUR; String message = "Titre " + titreContact + " = "; switch (titreContact) { case MONSIEUR : message += "Mr"; break; case MADAME : message += "Mme"; break; case MADEMOISELLE : message += "Melle"; break; } // Affiche Titre MONSIEUR = Mr System.out.println (message); } }

Le contrle de type sur une variable de type enum est plus stricte en Java qu'en C/C++ car vous n'avez pas de possibilit de convertir une variable de type enum en type int.
import static

La clause import static permet d'importer les membres static d'une classe, pour vous viter par exemple de citer la classe System pour utiliser son champ out :
import static java.lang.System.*;

Liste d'arguments variable

Une liste d'arguments variable permet une mthode de recevoir en dernier paramtre un nombre variable de valeurs (zro ou plus). Une telle liste est dclare en prcdant le dernier paramtre de trois points ..., ce paramtre tant en fait un tableau. Par exemple, la mthode additionner() de la classe suivante peut prendre un nombre variable d'entiers en paramtre :
Programmer en java Page 143

Dao Issiaka- 3me anne SI

import static java.lang.System.*; class AdditionnerArgumentsVariable { public static int additionner(int x, int ... tab) { for (int i = 0; i < tab.length; i++) x += tab [i]; return x; } public static void main(java.lang.String [] args) { out.println ("1 + 2 = " + additionner(1, 2)); out.println ("1 + 2 + 3 + 4 = " + additionner(1, 2, 3, 4)); } }

Java simplifie grandement le traitement des lments d'une liste d'arguments variable par rapport au C, puisque c'est en fait un simple tableau ; par contre, vous tes oblig de spcifier un type pour les lments de cette liste. Si vous tenez accepter n'importe quel type objet, vous pouvez toujours utiliser la classe Object comme type.
Autoboxing / auto-unboxing

La cration d'une instance d'une classe d'emballage partir d'une valeur du type primitif correspondant est simplifie grce l'autoboxing (littralement mise en bote automatique). Cette fonctionnalit vite d'crire explicitement l'appel new ClasseEmballage pour crer un objet d'une classe d'emballage. Par exemple, l'instruction :
Integer zero = 0;

sera automatiquement traduite par le compilateur par l'instruction :


Integer zero = new Integer(0);

Symtriquement, l'auto-unboxing vite de faire appel explicitement la mthode d'une classe d'emballage qui renvoie la valeur de type primitif stocke par un objet de ce type. Par exemple, l'instruction :
int x = zero;

sera automatiquement traduite par le compilateur par l'instruction :


int x = zero.intValue();

Cette fonctionnalit simplifie grandement la programmation, mais fates attention ne pas en abuser involontairement, car chaque opration d'autoboxing implique la cration d'un objet. Par exemple, le remplacement du f minuscule du type float par un F majuscule dans le code suivant va provoquer la cration de plusieurs objets :
Float valeur = 0.2f; Float somme = valeur + 10;

Programmer en java

Page 144

Dao Issiaka- 3me anne SI

Boucle itrative

La syntaxe de l'instruction for peut tre simplifie pour numrer un un les lments d'un tableau. Par exemple, la mthode additionner de la classe AdditionnerArgumentsVariable dfinie ci-dessus peut tre simplifie ainsi :
public static int additionner(int x, int ... tab) { for (int val : tab) x += val; return x; }

cette boucle signifiant pour chaque lment val de l'ensemble tab.


Gnricit

La gnricit quivalente au template C++ est probablement la fonctionnalit la plus demande dans Java depuis son origine : elle est utilise par les classes de collection de donnes pour laisser le choix au programmeur de spcifier une classe diffrente d'Object comme classe des objets stocks. La classe des objets est spcifie entre les symboles < et > qui suivent la classe de collection : par exemple Vector<Integer> reprsente une collection de classe Vector dans laquelle seuls des objets de classe Integer pourront tre ajouts. La gnricit simplifie aussi la consultation des lments d'une collection car :

elle vite de faire appel l'oprateur de cast pour manipuler un lment de l'ensemble dans son type elle autorise le recours aux boucles itratives pour numrer un un les lments d'un ensemble, sans faire appel explicitement un indice de boucle ou aux mthodes de l'interface Enumeration.

Pour les collections de classe Hashtable, il faut spcifier la classe des cls et celle des lments en sparant les classes par une virgule (par exemple, Hashtable<String,String> pour une collection contenant des cls et des lments de classe String). Les deux applications suivantes cre un ensemble d'objets de classe Vector, l'une sans prciser la classe des objets stocks dans l'ensemble, l'autre en prcisant que cet ensemble ne peut contenir que des chanes de caractres de classe String. La premire application va dclencher une exception de classe ClassCastException dans la boucle numrative sur l'objet de classe Object, tandis que la seconde application ne provoque pas d'erreur l'excution : le recours la gnricit a empch ds la compilation d'ajouter l'ensemble un objet dont la classe n'est pas String (ou une de ses sous-classes mais elle n'en a pas).
Sans gnricit
import java.util.*; class AfficherPrenomsSansGenericite {

Avec gnricit
import java.util.*; class AfficherPrenomsAvecGenericite

Programmer en java

Page 145

Dao Issiaka- 3me anne SI

public static void main (String args []) { // Cration d'un ensemble d'objets Vector prenoms = new Vector(); prenoms.addElement("Thomas"); prenoms.addElement("Sophie"); // La mthode add n'interdit pas // d'ajouter n'importe quel objet prenoms.addElement(new Object()); // Enumration des objets de prenoms for (int i = 0; i < prenoms.size(); i++) { // Cast explicite obligatoire // pour manipuler l'objet dans son type String prenom = (String)prenoms.elementAt(i); System.out.println (prenom); } } }

{ public static void main (String args []) { // Cration d'un ensemble capable // de ne stocker que des objets String Vector<String> prenoms = new Vector<String> (); prenoms.addElement("Thomas"); prenoms.addElement("Sophie"); // La mthode add interdit d'ajouter // un autre type d'objet // prenoms.addElement(new Object()); // Boucle itrative for (String prenom : prenoms) System.out.println (prenom);

} }

A la diffrence des templates C++ qui gnre une classe ou une mthode pour chaque instanciation avec un type diffrent entre < > , la gnricit en Java utilise une seule classe par classe gnrique. Pour une information complte sur la gnricit, consultez le document Generics in the Java Programming Language.
Annotations

Les annotations permettent d'ajouter des informations dclaratives avant la dclaration d'une classe, d'un champ, d'une mthode ou d'un constructeur grce des balises qui dbutent par le symbole @ comme dans les commentaires javadoc ; par exemple, l'annotation @Override place avant une mthode redfinie force javac vrifier sa signature. A la diffrence des commentaires javadoc, les annotations sont crites en dehors de tout commentaire et sont enregistres dans les fichiers .class ce qui permet de les exploiter l'excution de la JVM sans les programmes sources.

Programmer en java

Page 146

Dao Issiaka- 3me anne SI

Conventions d'criture et portage


Conventions d'criture Portage de programmes crits en C/C++

Ce chapitre vous indique les conventions gnralement utilises dans l'criture des programmes et des suggestions pour vous aider rcuprer des programmes crits en C ou C++. Ces suggestions et les exemples qui sont donns peuvent vous servir aussi comme complment d'information avant de passer l'tude de la bibliothque Java.
Conventions d'criture

Par convention, l'criture de vos classes devrait respecter les conventions suivantes :

Si un fichier .java dfinit une classe ou une interface public, cette classe et le nom du fichier doivent avoir le mme nom. Le nom des classes est une suite d'un ou plusieurs mots en minuscules, dont la premire lettre est en majuscule (par exemple MaClasse). Le nom des interfaces utilise la convention des classes et utilise gnralement un adjectif qualificatif (se terminant souvent par able). Le nom des mthodes commence par une minuscule, et reprsente une action : o Les mthodes utilises pour interroger ou modifier la valeur d'un champ var, doivent s'appeler getVar () et setVar () respectivement, ou ventuellement isVar () et setVar () si var est du type boolean. Cette convention n'est utile que si vous voulez utiliser facilement une classe comme JavaBean. o Le nom des mthodes convertissant un objet en autre chose, commence par to (par exemple toString ()). Le nom des champs non final commence par une minuscule. Ce type de variable est rarement dclar public ou protected ; il vaut mieux utiliser des variables private accessibles par des mthodes comme expliqu prcdemment. Le nom des champs final (constantes) est une suite d'un ou plusieurs mots en majuscules, spars par le caractre _ (par exemple MAX_PRIORITY). Le nom des packages reprsentant des sous-rpertoires est en minuscules, et java est un nom de package rserv pour les classes standards Java.

Comme vous pouvez le voir, ces conventions ne laissent que peu de choix sur la langue utiliser dans un programme Java. Mais, comme toute convention, vous pouvez l'ignorer et crer votre propre convention d'criture.

Programmer en java

Page 147

Dao Issiaka- 3me anne SI

Documentation des fichiers .java

Java dfinit des rgles de syntaxe pour l'criture des commentaires destins des fins de documentation. Si vous les respectez, vous pourrez les extraire pour fabriquer un fichier HTML, en utilisant la commande javadoc.

Portage de programmes crits en C/C++

Vous avez dvelopp un certains nombres de routines en C ou de classes en C++, et vous aimeriez les porter en Java... Les remarques signales par les symboles et des chapitres prcdents et les suggestions qui suivent devraient vous guider pour mener bien cette tche qui peut prendre un certain temps suivant les fonctionnalits du C/C++ que vous avez utilis. Les suggestions dcrites ici ne concernent que les routines C/C++ utilisant la bibliothque standard du C (stdio.h, stdlib.h,...) et pas les applications utilisant les routines de l'Interface Graphique de tel ou tel systme (Windows, XWindow/Motif,...). Elles ne reprsentent pas forcment la solution idale tel ou tel problme, mais plutt une solution pragmatique et rapidement ralisable. Rien ne vous empche de revoir compltement l'architecture de vos routines pour qu'elles respectent les principes de la programmation oriente objets la lettre.
Conception des classes

Tout d'abord, essayez d'ventuellement modifier et de rassembler vos routines pour qu'elles puissent former des classes cohrentes. Si la conception de vos routines n'utilise pas de principes de la programmation oriente objets comme l'encapsulation, n'ayez pas de scrupules transposez toutes vos variables globales et vos fonctions en champs et mthodes de classe static. Une fois votre premire version de portage termine, vous pourrez ventuellement utiliser plus amplement la programmation objet. N'oubliez d'ajouter le nom de la classe et l'oprateur point (.) devant les champs et les mthodes static d'une classe, quand vous voulez y accder en dehors de cette classe (comme par exemple System.arraycopy ()). Java n'utilisant pas de fichiers header .h, il faut rassembler les dclarations de constantes et de types avec les fonctions dans des classes dclares dans un ou plusieurs fichiers .java.
Remplacement des dfinitions de type typedef
typedef

peut tre utilis en C de deux manires diffrentes :

Pour donner un nom aux types structurs struct, aux unions union et ventuellement aux types pointeurs sur ces types. Tous les types structurs sont transforms en classes. Pour renommer un type primitif C : Dans ce cas, soit vous crez une classe ne contenant qu'un champ de ce type, soit vous remplacez le nom de ce type par le type primitif Java correspondant partout o il est utilis.
Page 148

Programmer en java

Dao Issiaka- 3me anne SI

Remplacement des instructions de prcompilation #define

s'utilise de deux manires diffrentes en C, l'une pour dclarer des constantes, l'autre pour crer des macros :
#define

Les macros doivent tre transformes en mthodes : ceci oblige typer les paramtres d'une macro, mais grce la surcharge des mthodes, vous pouvez crer plusieurs mthodes de mme nom mais avec des paramtres de type diffrent. Les constantes doivent tre remplaces par des champs static final et ajoutes soit aux classes auxquelles elles se rapportent, soit ventuellement une ou plusieurs interfaces implmentes dans les classes qui ont besoin d'y avoir accs. Remplacement des instructions de prcompilation #ifdef, #else, #endif
#ifdef

s'utilise en C pour indiquer au compilateur qu'il doit compiler ou non une partie du code selon qu'un symbole est dfini ou non. Il est trs souvent utilis pour ajouter des instructions spciales de suivi lorsqu'un programme est en phase de mise au point (ou de debugging). L'utilisation de constantes Java boolennes (champs static final boolean) permettent de raliser un effet comparable comme dans l'exemple suivant :

class Classe1 // Dfinit un symbole DEBUG { #define DEBUG static final boolean DEBUG = true; void methode () { //... #ifdef DEBUG printf ("OK"); #endif } void methode () { //... if (DEBUG) System.out.println ("OK"); } }

Un des avantages de l' instruction #ifdef est notamment qu'il permet d'allger le code compil (le fichier .obj) des instructions qui sont dfinis dans le bloc #ifdef si la condition est fausse. Le compilateur Java fait de mme : c'est--dire que dans l'exemple prcdent si vous dfinissez DEBUG comme tant gal false, l'instruction System.out.println ("OK"); ne sera pas dans le fichier compil Classe1.class. Comme la condition if (DEBUG) est forcment fausse, le compilateur utilise ds le dpart une optimisation qui exclut l'instruction qui suit.
Remplacement des numrations enum

Les numrations enum, disponible uniquement partir de Java 5.0, dfinissent un ensemble cohrent de constantes. Vous pouvez les remplacer soit par des classes dclarant un ensemble de constantes public, soit par des interfaces implmentes dans les classes qui en ont besoin.

Programmer en java

Page 149

Dao Issiaka- 3me anne SI

Remplacement des unions union

En C, les variables d'un type union permettent de typer de manire diffrente leur zone mmoire. Dans l'exemple :
union { double x; int a; } varUnion;

a pour taille, la taille du plus grand de ses lments, ici la taille d'un double (8 octets), et mmorise soit un double par varUnion.x ou soit un int par varUnion.a.
varUnion

Le portage le plus rapide consiste remplacer les variables C de type union par une rfrence de classe Object. Une instance de classe Object permet de dsigner n'importe quel objet Java, car toutes les classes hritent de cette classe. De plus, l'oprateur instanceof permet de tester qu'elle est la classe de l'objet mmoris par une telle rfrence. Si comme dans l'exemple prcdent l'union C utilise des types primitifs, utilisez ventuellement la place les classe d'emballages Java (Boolean, Character, Integer, Long, Float, Double). Voici un programme C et un programme Java mis en parallle pour illustrer une manire de transformer une union de cette manire. Ces programmes permettent d'valuer une expression comportant des nombres double et les oprateurs +, -, * et /, mmorise sous forme d'un arbre :
#include <stdio.h> #include <stdlib.h> struct _Expression; /* Structure Operation mmorisant */ /* une expression avec oprateur binaire */ typedef struct { char operateur; struct _Expression *expr1, *expr2; } Operation; #define TYPE_VALEUR 0 #define TYPE_OPERATION 1 /* Structure _Expression mmorisant */ /* une union entre un double et une */ /* valeur de type Operation */ /* et un champ type permettant de
Programmer en java

// Fichier TestExpression.java // A excuter par la commande // java TestExpression // Classe Operation mmorisant // une expression avec oprateur binaire class Operation { char operateur; Object expr1, expr2; }

// Pas besoin d'une classe Expression : // une expression est mmorise par une // rfrence de classe Object // contenant soit un objet de classe // Double, soit une objet de
Page 150

Dao Issiaka- 3me anne SI

*/ /* connatre le type dans l'union */ typedef struct _Expression { int type; union { double valeur; Operation operation; } expr; } *Expression; double calculerOperation (Operation oper); double calculerExpression (Expression expr) { /* Calcul du rsultat suivant le type */ /* d'expression mmorise dans l'union */ switch (expr->type) { case TYPE_VALEUR : return expr->expr.valeur; case TYPE_OPERATION : return calculerOperation (expr>expr.operation); } return 0; } /* Calcul d'une opration binaire */ double calculerOperation (Operation oper) { /* Evaluation des deux oprandes */ double val1 = calculerExpression (oper.expr1); double val2 = calculerExpression (oper.expr2); switch (oper.operateur) { case '+' : return val1 case '-' : return val1 case '*' : return val1 case '/' : return val1 } return 0; }

classe // Operation

// Classe TestExpression public class TestExpression { static double calculerExpression (Object expr) { // Calcul du rsultat suivant la classe // de l'objet expr

if (expr instanceof Double) return ((Double)expr).doubleValue (); if (expr instanceof Operation) return calculerOperation ((Operation)expr); throw new IllegalArgumentException (); } // Calcul d'une opration binaire static double calculerOperation (Operation oper) { // Evaluation des deux oprandes double val1 = calculerExpression (oper.expr1); double val2 = calculerExpression

+ * /

val2; val2; val2; val2;

(oper.expr2); switch (oper.operateur) { case '+' : return val1 + val2; case '-' : return val1 val2; case '*' : return val1 *

Programmer en java

Page 151

Dao Issiaka- 3me anne SI

void main () { /* Allocation de 5 expressions */ Expression expr = malloc (5 * sizeof (struct _Expression)); /* Construction de l'arbre reprsentant */ /* l'expression 2 + 3 / 4 */ expr [0].type = expr [1].type = TYPE_OPERATION; expr [0].expr.operation.operateur = '+'; expr [0].expr.operation.expr1 = &expr [2]; expr [0].expr.operation.expr2 = &expr [1]; expr [1].expr.operation.operateur = '/'; expr [1].expr.operation.expr1 = &expr [3]; expr [1].expr.operation.expr2 = &expr [4]; expr expr expr expr expr expr [2].type = [3].type = [4].type = TYPE_VALEUR; [2].expr.valeur = 2; [3].expr.valeur = 3; [4].expr.valeur = 4;

val2; case '/' : return val1 / val2; } throw new IllegalArgumentException (); } public static void main (String [] arg) {

// Construction de l'arbre reprsentant // l'expression 2 + 3 / 4 Operation expr1 = new Operation (); expr1.operateur = '/'; expr1.expr1 = new Double (3); expr1.expr2 = new Double (4); Operation expr0 = new Operation (); expr0.operateur = '+'; expr0.expr1 = new Double (2); expr0.expr2 = expr1;

printf ("Resultat de 2 + 3/4 = %g", calculerExpression (&expr [0])); }

System.out.println ( "Resultat de 2 + 3/4 = " + calculerExpression (expr0)); } }

Enfin, voici une version plus oriente objet du programme TestExpression.java :


// Dclaration de l'interface Calculable // (Aurait pu tre aussi une classe abstract) interface Calculable { double calculer (); } // Classe Nombre mmorisant un double // Le rsultat de calculer () est ce nombre class Nombre implements Calculable { private double nombre; // Constructeur
Programmer en java Page 152

Dao Issiaka- 3me anne SI

Nombre (double nombre) { this.nombre = nombre; } // Implmentation de la mthode calculer () public double calculer () { return nombre; } } // Classe Operation mmorisant une expression avec oprateur binaire // Le rsultat de calculer () est l'valuation de cette expression class Operation implements Calculable { private char operateur; private Calculable expr1, expr2; // Constructeur Operation (char operateur, Calculable expr1, Calculable expr2) { this.operateur = operateur; this.expr1 = expr1; this.expr2 = expr2; } // Implmentation de la mthode calculer () public double calculer () { // Evaluation des deux oprandes double val1 = expr1.calculer (); double val2 = expr2.calculer (); switch (operateur) { case '+' : return val1 + val2; case '-' : return val1 - val2; case '*' : return val1 * val2; case '/' : return val1 / val2; } throw new IllegalArgumentException ("Operateur inconnu"); } } // Classe de test TestExpression public class TestExpression { public static void main (String [] arg) { // Cration de l'expression 2 + 3 / 4 Calculable expr = new Operation ('+', new Nombre (2), new Operation ('/', new Nombre (3), new Nombre (4))); System.out.println ("Resultat de 2 + 3/4 = " + expr.calculer ()); } }

Programmer en java

Page 153

Dao Issiaka- 3me anne SI

Passage des valeurs par adresse

Comme il est signal au chapitre sur la cration des classes, tous les paramtres des fonctions sont passs par valeur en Java. Si certaines de vos fonctions requirent de leur passer des paramtres d'un type primitif par adresse, comme dans l'exemple suivant :
void fonction1 (int *param1); int fonction2 (double *param1);

vous devrez transformer vos fonctions d'une des trois manires suivantes :
o

Pour une fonction void du style de fonction1 (), vous pouvez la transformer en int fonction1 (int param1), et renvoyer dans fonction1 () la valeur modifie de param1. L'inconvnient de cette mthode est qu'elle vous oblige transformer tous les appels fonction1 () pour en rcuprer la valeur de retour. Pour une fonction du style fonction2 (), vous pouvez crer une classe DoubleValue mmorisant un champ value de type double et passer une instance de DoubleValue fonction2 (). Ainsi, si vous modifiez la valeur du champ value dans fonction2 (), l'appelant de fonction2 () aura accs ce champ modifi. Notez que cette mthode est applicable aussi fonction1 (). Dans les deux cas, la manire la plus rapide mais la moins oriente objet consiste crer un tableau contenant un seul lment. Comme pour tout objet Java, si vous modifiez l'lment que contient le tableau dans la fonction appele, l'appelant aura accs cet elment modifi.

Voici un programme C et un programme Java mis en parallle pour illustrer ces trois types de transformation :
class VotreClasse { int fonction1 (int param1) { param1 = 1; // ... return param1; } int fonction2 (DoubleValue param1) { param1.value = 1; // ... return 0; } int fonction3 (float [] param1) { param1 [0] = 1; // ... return 0; } void fonctionAppelante () {
Page 154

void fonction1 (int *param1) { *param1 = 1; /* ... */ }

int fonction2 (double *param1) { *param1 = 1; /* ... */ return 0; } void fonction3 (float *param1) { *param1 = 1; /* ... */ return 0; } void fonctionAppelante () { int argInt = 0;
Programmer en java

Dao Issiaka- 3me anne SI

double argDouble = 0; float argFloat = 0; int valRetour; (0);

int argInt = 0; DoubleValue argDouble = new DoubleValue int float [] valRetour; argFloat = {0};

fonction1 (&argInt); valRetour = fonction2 (&argDouble); fonction3 (&argFloat); /* ... */ }

argInt = fonction1 (argInt); valRetour = fonction2 (argDouble); fonction3 (argFloat); // ... } } // Classe d'emballage du type double // avec champ d'accs public class DoubleValue { public double value; public DoubleValue (double value) { this.value = value; } }

Les classes d'emballage des types primitifs Boolean, Character, Integer, Long, Float, Double ne permettent pas de modifier la valeur de type primitif qu'elle mmorise, donc elles ne peuvent pas tre utilises dans ce cas. Si vous utilisez trs souvent le passage de valeurs par adresse, il est conseill de crer des le dpart vos propres classes d'emballage mmorisant un champ public de type primitif.
Allocation dynamique

Java ne permet de crer dynamiquement que des instances de classes, grce l'oprateur new. Tous les appels au fonctions malloc () et calloc () doivent tre remplacs par new Classe1 () pour crer une instance de Classe1 et par new Classe1 [nbreElements] pour crer un tableau mmorisant nbreElements rfrences de classe Classe1 (il est rappel que vous devez individuellement crer ou affecter chacun des nbreElements rfrences du tableau). Java n'a pas d'quivalent de la fonction realloc () et ne permet pas d'agrandir un tableau existant : il faut crer un second tableau, puis copier le premier dans le second grce la mthode arraycopy () de la classe System. La classe Vector peut ventuellement vous servir pour utiliser des tableaux de taille variables, mais ceci peut vous obliger transformer beaucoup d'instructions de votre programme : Comme Java n'autorise pas la surcharge de l'oprateur [ ], l'accs aux lments d'une instance de Vector ne se fait que par des mthodes.

Programmer en java

Page 155

Dao Issiaka- 3me anne SI

Tous les appels free (ptr) peuvent tre directement supprims ou ventuellement remplacs par ptr = null; dans les cas o vous voulez que l'objet dsign par ptr ne soit plus rfrenc par ptr. Plus vous matriserez le fonctionnement du Garbage Collector et la notion de rfrence, plus vous n'hsiterez plus supprimer les instructions free () (C'est un des plus grand plaisirs du portage !).
Utilisation des chanes de caractres

En Java, les chanes de caractres sont reprsentes par les classes String et StringBuffer. Il faut remplacer tous les tests de caractre nul ('\0') permettant de savoir si on a atteint la fin d'une chane de caractres en C, par des appels aux mthodes length () de ces classes.
Arithmtique des pointeurs

L'arithmtique des pointeurs est une notion absente en Java. Vous devrez remplacer son usage par l'utilisation d'un indice courant associ un tableau, ou pour les chanes de caractres utiliser ventuellement les mthodes de la classe String comme substring (), pour crer des chanes de caractres la vole sans se soucier de la libration de ces chanes puisque le Garbage Collector est l pour a. Voici un programme C et un programme Java mis en parallle pour illustrer une manire de transformer une fonction chercherSousChaine (str1, str2) , qui recherche dans la chane de caractres str1 une chane str2 (quivalent de la fonction C strstr (char *str1, char *str2) et de la mthode Java indexOf (String str) de la classe String) :
#include <string.h> char *chercherSousChaine (char *str1, char *str2) { while (strlen (str1) >= strlen (str2)) if (!strncmp (str1, str2, strlen (str2))) return str1; else str1++; return NULL; // Pas trouv } class ClasseChaine { public int chercherSousChaine (String str1, String str2) { int i = 0; while (str1.length () >= str2.length ()) if (str1.startsWith (str2)) return i; else { str1 = str1.substring (1); i++; } return -1; // Pas trouv } }

Programmer en java

Page 156

Dao Issiaka- 3me anne SI

Transformation des pointeurs sur fonctions

En C, les pointeurs sur fonctions sont trs pratiques et beaucoup de bibliothques C en font l'usage. Son utilisation se regroupe principalement en deux catgories :

Comme paramtre d'une fonction fct (), elle est utilise souvent comme fonction rappeler (call-back en anglais), pour modifier le comportement de fct (). Par exemple, la fonction de comparaison passe en paramtre la fonction qsort () permet de trier un tableau de n'importe quel type d'lment, ou la procdure passe en paramtre la fonction CreateDialog () de Windows permet de modifier le comportement d'une boite de dialogue. Ce type de pointeurs de fonctions peut tre transform par l'utilisation de mthodes outrepasses et a t aborde au chapitre sur la cration des classes. Comme lment d'un tableau regroupant un ensemble de pointeurs sur fonctions ayant toutes le mme prototype. Ce procd est souvent utilis par les automates, pour qu'ils puissent excuter une action pour un tat donn. Dans ce cas, soit vous utilisez le procd prcdent en mmorisant des objets place des fonctions dans le tableau, comme dans l'exemple suivant :
/* Dclaration d'un type pointeur sur */ /* fonction prenant en paramtre un int */ typedef void (* Action) (int param); // Dclaration d'une interface dclarant une // mthode prenant en paramtre un int interface Action { void action (int param); } // Dclaration de deux classes implmentant // la mthode action () de cette interface class Action1 implements Action { public void action (int param) { /* Corps de action () */ } } class Action2 implements Action { public void action (int param) { /* Corps de action () */ } } // Dclaration de la classe Automate class Automate { // Dclaration d'un tableau mmorisant // diffrents objets dont la classe // implmente l'interface Action Action tabAction [] = {new Action1 (), null, new Action2 (), new Action1 ()};
Page 157

/* Dclaration de deux fonctions */ /* du mme type que Action () */

void action1 (int param) { /* Corps de action1 () */

void action2 (int param) { /* Corps de action2 () */

/* Dclaration d'un tableau mmorisant */ /* diffrents pointeurs de type Action */ Action tabAction [] = {action1, NULL, action2, action1};
Programmer en java

Dao Issiaka- 3me anne SI

void ExecuterAction (int etat, int param) { /* Appel de fonction suivant etat */ if (tabAction [etat] != NULL) tabAction [etat] (param); } /* ... */

void ExecuterAction (int etat, int param) { // Appel de action () en fonction de etat if (tabAction [etat] != null) tabAction [etat].action (param); } // ... }

soit vous associez une constante chacune des fonctions, vous remplacez les pointeurs du tableau par ces constantes et choisissez la bonne fonction appeler grce l'instruction switch (), comme dans l'exemple suivant :
/* Dclaration d'un type pointeur sur */ /* fonction prenant en paramtre un int */ typedef void (* Action) (int param); /* Dclaration de deux fonctions */ /* du mme type que Action () */ void action1 (int param) { /* Corps de action1 () */ } void action2 (int param) { /* Corps de action2 () */ // Dclaration de la classe Automate class Automate { // Dclaration de deux fonctions // d'action void action1 (int param) { /* Corps de action1 () */ } void action2 (int param) { /* Corps de action2 () */ // Dclaration des deux constantes // reprsentant les deux mthodes final static int ACTION1 = 1; final static int ACTION2 = 2; // Dclaration d'un tableau mmorisant // diffrentes constantes d'action int tabAction [] = {ACTION1, 0, ACTION2, ACTION1}; void ExecuterAction (int etat, int param) { // Appel de la bonne mthode // en fonction de etat switch (etat) { case ACTION1 : action1 (param); break; case ACTION2 : action2 (param);

/* Dclaration d'un tableau mmorisant */ /* diffrents pointeurs de type Action */ Action tabAction [] = {action1, NULL, action2, action1}; void ExecuterAction (int etat, int param) { /* Appel de fonction suivant etat */ if (tabAction [etat] != NULL) tabAction [etat] (param); }

Programmer en java

Page 158

Dao Issiaka- 3me anne SI

/* ... */ } } }

break;

Remplacement de l'hritage multiple

Java ne permet pas l'hritage multiple du C++. Si vous voulez nammoins conserver une architecture de classes qui utilise l'hritage multiple, vous pouvez utiliser les interfaces, en utilisant par exemple la solution suivante :
class Type1 class Type1 { { public : public void methode1 () { /* ... void methode1 () { /* ... */ */ } } } }; // Utilisation d'une interface la place class Type2 // de la seconde classe interface Type2 { public : { void methode2 () { /* ... */ void methode2 (); } } }; class Classe2 implements Type2 { public void methode2 () { /* ... */ } } class ClasseDerivee : public public class ClasseDerivee extends Type1, public Type1 implements Type2 { Type2 // La classe ClasseDerivee { hrite des // Cration d'une instance de // mthodes methode1 () et Classe2 // pour remplacer le second lien methode2 () }; d'hritage Type2 objetClasse2 = new Classe2 (); // Implmentation de methode2 () pour // qu'elle appelle la mthode de Classe2 public void methode2 () { objetClasse2.methode2 (); } public static void main (String []

void main () { Type1 *objet1 = new Type1 (); Type2 *objet2 = new Type2 ();

Programmer en java

Page 159

Dao Issiaka- 3me anne SI

ClasseDerivee *objet3 = new ClasseDerivee (); objet3->methode1 (); objet3->methode2 ();

args) { Type1 objet1 = new Type1 (); Type2 objet2 = new Classe2 (); ClasseDerivee objet3 = new ClasseDerivee (); objet3.methode1 (); objet3.methode2 (); // Cast implicite vers la super classe // ou l'interface Type2 objet1 = objet3; objet2 = objet3; } }

// Cast implicite vers les super classes objet1 = objet3; objet2 = objet3; }

Cette solution peut tre longue programmer si les super classes dfinissent un nombre important de mthodes. Par contre, cette solution permet de modifier aisment le programme qui utilise les classes transformes en interfaces : vous n'avez qu' modifier le nom de la classe utilise l'instantiation des objets (ici transformer new Type2 () en new Classe2 ()).
Autres problmes propres au C++ Paramtres passs par rfrence en C++ : si le paramtre est d'un type primitif, vous devrez le traiter comme s'il tait pass par adresse. Si le paramtre est une instance d'une classe ou une structure, supprimer simplement le symbole & de la dclaration. Les appels l'oprateur delete du C++ pour des destructeurs n'effectuant que des librations de mmoire deviennent normalement inutiles en Java. Pour les autres vous pouvez crer une mthode delete () dans vos classes, et remplacer les appels delete objet; par objet.delete ();.

Programmer en java

Page 160

Dao Issiaka- 3me anne SI

La bibliothque Java 1.0


Les packages de la bibliothque Java Hirarchie des classes Java 1.0

Maintenant que vous connaissez le langage Java, il vous reste apprendre les classes Java fournies en standard avec la Machine Virtuelle Java. Il est fourni avec le JDK le code source des classes des packages Java standards. Alors, n'hsitez pas le consulter si vous recherchez plus d'informations sur le fonctionnement d'une classe ou d'une mthode. Dans certaines classes, vous pouvez tre tonn que certaines mthodes synchronized semblent similaires d'autres qui ne le sont pas. Ceci tient gnralement du fait que certaines mthodes s'appellent entre elles, et seule la mthode finalement appele est synchronized.
Les packages de la bibliothque Java 1.0

Les packages ci-aprs sont cits dans l'ordre des chapitres du manuel.
Classes de base : le package java.lang

Ce package est dvelopp dans le chapitre suivant et rassemble les classes de base de Java. Toutes les classes et interfaces de java.lang sont automatiquement importes par le compilateur.
Gestion de donnes et utilitaires : le package java.util

Ce package est dvelopp dans le chapitre sur les outils Java et rassemble des classes d'utilitaires (gestion des collections de donnes, gnration de nombres alatoires, numration, date,...). Il dfinit aussi les classes d'exceptions EmptyStackException et NoSuchElementException.
Les entres-sorties : le package java.io

Ce package est dvelopp dans le chapitre sur la gestion des fichiers et des flux de donnes et rassemble les classes permettant de grer les entres-sorties (accs fichiers, gestion de rpertoires,...). Il dfinit aussi les classes d'exceptions IOException, EOFException, FileNotFoundException, InterruptedIOException et UTFDataFormatException.
Programmer en java Page 161

Dao Issiaka- 3me anne SI

Les accs rseau : le package java.net

Ce package est dvelopp dans le chapitre sur les accs au rseau et rassemble les classes permettant de grer les accs rseau. Il dfinit aussi les classes d'exceptions MalformedURLException, ProtocolException, SocketException, UnknownHostException et UnknownServiceException.
Gestion des applets : le package java.applet

Ce package est dvelopp dans le chapitre sur les applets. La classe Applet et les interfaces de ce package permettent de programmer une applet Java et d'intgrer une applet dans un navigateur.
Interface utilisateur : le package java.awt

Ce package est dvelopp dans le chapitre sur les composants AWT et les suivants. Les classes de ce package permettent de programmer l'interface graphique d'un programme ou d'une applet Java. Il dfinit aussi les classes d'exceptions AWTException et AWTError.
Manipulation d'images : le package java.awt.image

Ce package est dvelopp dans le chapitre sur les images. Les classes de ce package permettent de manipuler les images (gestion du chargement des images, filtres, gestion des couleurs,...).
Liaison avec l'interface utilisateur du systme : le package java.awt.peer

Ce package est abord dans le chapitre sur les composants. Il dfinit un ensemble d'interfaces permettant aux composants graphiques Java (boutons, fentres,...) d'tre reprsents l'cran par les composants du systme sur lequel fonctionne une Machine Virtuelle Java.
Hirarchie des classes Java 1.0

Voici la hirarchie des classes Java dans sa version 1.0. Les liens vous permettent d'atteindre la page o elles sont dcrites.

Classe java.lang.Object o Interface java.applet.AppletContext o Interface java.applet.AppletStub o Interface java.applet.AudioClip o Classe java.util.BitSet (implmente java.lang.Cloneable) o Classe java.lang.Boolean o Classe java.awt.BorderLayout (implmente java.awt.LayoutManager) o Classe java.awt.CardLayout (implmente java.awt.LayoutManager) o Classe java.lang.Character o Classe java.awt.CheckboxGroup o Classe java.lang.Class o Classe java.lang.ClassLoader o Interface java.lang.Cloneable o Classe java.awt.Color
Page 162

Programmer en java

Dao Issiaka- 3me anne SI

o o

o o o o o o o o

o o o o o o o o o o o o o o o o

Classe java.awt.image.ColorModel Classe java.awt.image.DirectColorModel Classe java.awt.image.IndexColorModel Classe java.lang.Compiler Classe java.awt.Component (implmente java.awt.image.ImageObserver) Classe java.awt.Button Classe java.awt.Canvas Classe java.awt.Checkbox Classe java.awt.Choice Classe java.awt.Container Classe java.awt.Panel Classe java.applet.Applet Classe java.awt.Window Classe java.awt.Dialog Classe java.awt.FileDialog Classe java.awt.Frame (implmente java.awt.MenuContainer) Classe java.awt.Label Classe java.awt.List Classe java.awt.Scrollbar Classe java.awt.TextComponent Classe java.awt.TextArea Classe java.awt.TextField Classe java.net.ContentHandler Interface java.net.ContentHandlerFactory Interface java.io.DataInput Interface java.io.DataOutput Classe java.net.DatagramPacket Classe java.net.DatagramSocket Classe java.util.Date Classe java.util.Dictionary Classe java.util.Hashtable (implmente java.lang.Cloneable) Classe java.util.Properties Classe java.awt.Dimension Interface java.util.Enumeration Classe java.awt.Event Classe java.io.File Classe java.io.FileDescriptor Interface java.io.FilenameFilter Classe java.awt.image.FilteredImageSource (implmente java.awt.image.ImageProducer) Classe java.awt.FlowLayout (implmente java.awt.LayoutManager) Classe java.awt.Font Classe java.awt.FontMetrics Classe java.awt.Graphics Classe java.awt.GridBagConstraints (implmente java.lang.Cloneable) Classe java.awt.GridBagLayout (implmente java.awt.LayoutManager) Classe java.awt.GridLayout (implmente java.awt.LayoutManager) Classe java.awt.Image Interface java.awt.image.ImageConsumer

Programmer en java

Page 163

Dao Issiaka- 3me anne SI

o o o o

o o o o o o

o o

o o o

o o o

Classe java.awt.image.ImageFilter (implmente java.awt.image.ImageConsumer, java.lang.Cloneable) Classe java.awt.image.CropImageFilter Classe java.awt.image.RGBImageFilter Interface java.awt.image.ImageObserver Interface java.awt.image.ImageProducer Classe java.net.InetAddress Classe java.io.InputStream Classe java.io.ByteArrayInputStream Classe java.io.FileInputStream Classe java.io.FilterInputStream Classe java.io.BufferedInputStream Classe java.io.DataInputStream (implmente java.io.DataInput) Classe java.io.LineNumberInputStream Classe java.io.PushbackInputStream Classe java.io.PipedInputStream Classe java.io.SequenceInputStream Classe java.io.StringBufferInputStream Classe java.awt.Insets (implmente java.lang.Cloneable) Interface java.awt.LayoutManager Classe java.lang.Math Classe java.awt.MediaTracker Classe java.awt.image.MemoryImageSource (implmente java.awt.image.ImageProducer) Classe java.awt.MenuComponent Classe java.awt.MenuBar (implmente java.awt.MenuContainer) Classe java.awt.MenuItem Classe java.awt.CheckboxMenuItem Classe java.awt.Menu (implmente java.awt.MenuContainer) Interface java.awt.MenuContainer Classe java.lang.Number Classe java.lang.Double Classe java.lang.Float Classe java.lang.Integer Classe java.lang.Long Classe java.util.Observable Interface java.util.Observer Classe java.io.OutputStream Classe java.io.ByteArrayOutputStream Classe java.io.FileOutputStream Classe java.io.FilterOutputStream Classe java.io.BufferedOutputStream Classe java.io.DataOutputStream (implmente java.io.DataOutput) Classe java.io.PrintStream Classe java.io.PipedOutputStream Classe java.awt.image.PixelGrabber (implmente java.awt.image.ImageConsumer) Classe java.awt.Point Classe java.awt.Polygon
Page 164

Programmer en java

Dao Issiaka- 3me anne SI

o o o o o o o o o o o o o o o o o o o

Classe java.lang.Process Classe java.util.Random Classe java.io.RandomAccessFile (implmente java.io.DataOutput, java.io.DataInput) Classe java.awt.Rectangle Interface java.lang.Runnable Classe java.lang.Runtime Classe java.lang.SecurityManager Classe java.net.ServerSocket Classe java.net.Socket Classe java.net.SocketImpl Interface java.net.SocketImplFactory Classe java.io.StreamTokenizer Classe java.lang.String Classe java.lang.StringBuffer Classe java.util.StringTokenizer (implmente java.util.Enumeration) Classe java.lang.System Classe java.lang.Thread (implmente java.lang.Runnable) Classe java.lang.ThreadGroup Classe java.lang.Throwable Classe java.lang.Error Classe java.awt.AWTError Classe java.lang.LinkageError Classe java.lang.ClassCircularityError Classe java.lang.ClassFormatError Classe java.lang.IncompatibleClassChangeError Classe java.lang.AbstractMethodError Classe java.lang.IllegalAccessError Classe java.lang.InstantiationError Classe java.lang.NoSuchFieldError Classe java.lang.NoSuchMethodError Classe java.lang.NoClassDefFoundError Classe java.lang.UnsatisfiedLinkError Classe java.lang.VerifyError Classe java.lang.ThreadDeath Classe java.lang.VirtualMachineError Classe java.lang.InternalError Classe java.lang.OutOfMemoryError Classe java.lang.StackOverflowError Classe java.lang.UnknownError Classe java.lang.Exception Classe java.awt.AWTException Classe java.lang.ClassNotFoundException Classe java.lang.CloneNotSupportedException Classe java.lang.IllegalAccessException Classe java.lang.InstantiationException Classe java.lang.InterruptedException Classe java.io.IOException Classe java.io.EOFException Classe java.io.FileNotFoundException Classe java.io.InterruptedIOException
Page 165

Programmer en java

Dao Issiaka- 3me anne SI

Classe java.net.MalformedURLException Classe java.net.ProtocolException Classe java.net.SocketException Classe java.io.UTFDataFormatException Classe java.net.UnknownHostException Classe java.net.UnknownServiceException Classe java.lang.RuntimeException Classe java.lang.ArithmeticException Classe java.lang.ArrayStoreException Classe java.lang.ClassCastException Classe java.util.EmptyStackException Classe java.lang.IllegalArgumentException Classe
java.lang.IllegalThreadStateException Classe java.lang.NumberFormatException Classe java.lang.IllegalMonitorStateException Classe java.lang.IndexOutOfBoundsException

Classe
java.lang.ArrayIndexOutOfBoundsExceptio n

Classe
java.lang.StringIndexOutOfBoundsExcepti on Classe java.lang.NegativeArraySizeException Classe java.util.NoSuchElementException Classe java.lang.NullPointerException Classe java.lang.SecurityException Classe java.awt.Toolkit Classe java.net.URL Classe java.net.URLConnection Classe java.net.URLEncoder Classe java.net.URLStreamHandler Interface java.net.URLStreamHandlerFactory Classe java.util.Vector (implmente java.lang.Cloneable) Classe java.util.Stack

o o o o o o o

(Les classes du package java.awt.peer ne sont pas cites)

Programmer en java

Page 166

Dao Issiaka- 3me anne SI

Les classes de bases


Les classes de gestion des objets Les classes d'emballage Calcul mathmatique : la classe java.lang.Math Les classes de gestion des threads Les classes de gestion du systme

Ce chapitre dcrit le package java.lang de Java 1.0 qui rassemble les classes de base de Java. Les principales classes de ce package ayant dj t tudies (Class, Object, String, StringBuffer, System, Thread, Throwable et ses drives), voici la description des autres classes et interfaces fournies par ce package. Rappel : Toutes les classes et interfaces de java.lang sont automatiquement importes par le compilateur.
Gestion des objets La classe java.lang.Object

Cette classe est la racine de la hirarchie des classes Java, donc toute classe hrite implicitement de la classe Object. Elle est dtaille au chapitre sur les objets.
L'interface java.lang.Cloneable

Cette interface ne dclare ni constantes, ni mthodes. Elle doit tre implmente par toute classe qui veut outrepasser et utiliser la mthode clone () de la classe Object, qui permet de crer une copie d'un objet.
La classe java.lang.Class

Cette classe final permet de reprsenter chacune des classes charges par la Machine Virtuelle Java. Elle est dtaille au chapitre sur les objets.
La classe java.lang.ClassLoader

La cration d'une classe drive de cette classe abstract permet de crer un chargeur de classe spcifique. Par dfaut, chaque classe est charge dynamiquement sa premire utilisation partir du
Programmer en java Page 167

Dao Issiaka- 3me anne SI

fichier .class de mme nom que la classe partir de la machine locale ou sur un rseau. Mais vous pouvez charger vous-mme une ou plusieurs classes pour qu'elles existent et soient utilisables dans la Machine Virtuelle Java. Ceci permet par exemple de protger l'ensemble des fichiers .class d'une application, pour viter qu'il soit repris par d'autres personnes. Il suffit de coder ces fichiers et de crer une classe de chargeur de classes capable de les dcoder. Au chargement d'une classe, les fichiers seront dcods puis transmis la Machine Virtuelle Java.
Constructeur
protected ClassLoader () throws SecurityException

Mthodes
protected abstract Class loadClass (String name, boolean resolve) throws ClassNotFoundException

Cette mthode doit tre outrepasse pour charger et renvoyer la classe de nom name. Si resolve est gal true, les classes qu'utilise cette classe doivent tre rsolues. Si la classe n'est pas trouve une exception de classe ClassNotFoundException doit tre dclenche. Les trois autres mthodes sont final et protected et sont des outils utiliss pour crer ou prparer les classes.
protected final Class defineClass (byte data [ ], int offset, int length) throws IndexOutOfBoundsException, ClassFormatError

Permet de crer une instance de la classe Class partir des length octets du tableau data pris partir de l'indice offset. Si cet ensemble d'octets ne reprsente pas une classe Java valide, une exception ClassFormatError est dclenche.
protected final void resolveClass (Class c)

Permet de rsoudre et charger les classes qu'utilise la classe c. Cette opration doit tre effectue avant d'utiliser la classe c et entrane que la mthode loadClass () sera appele pour chacune des classes que rfrencent les champs de la classe c.
protected final Class findSystemClass (String name) throws ClassNotFoundException

Charge la classe de nom name avec le chargeur de classe par dfaut. Le constructeur de la classe ClassLoader peut ventuellement dclencher une exception de classe SecurityException, si le gestionnaire de scurit interdit de crer d'autres chargeurs de classes, comme le font par exemple les navigateurs. Donc, si vous crez des applets pour Internet vous ne pourrez pas changer le chargeur de classe par dfaut.
La classe java.lang.Compiler

Cette classe final fournit un ensemble de mthodes relatives la compilation des classes Java en code machine du systme sur lequel fonctionne la Machine Virtuelle Java.

Programmer en java

Page 168

Dao Issiaka- 3me anne SI

Mthodes
public public public public public static static static static static Object command (Object any) boolean compileClass (Class class) boolean compileClasses (String string) void disable () void enable ()

La classe java.lang.Throwable

Cette classe est la racine de toutes les classes d'exceptions. Throwable et toutes ses classes drives sont dtailles au chapitre traitant des exceptions.
Les classes d'emballage

La bibliothque Java fournit un ensemble de classes qui permettent de manipuler les types primitifs sous forme d'objets, comme par exemple la classe Boolean pour le type boolean. Chacune de ces classes ne mmorisant qu'un champ du type primitif donn associ, on appelle ce type de classe une classe d'emballage (wrapper en anglais). Ces classes peuvent tre utile pour les classes ne manipulant que des objets, comme par exemple la classe java.util.Vector, qui permet de crer un ensemble d'objets quelconques. Une classe d'emballage existant pour tous les types primitifs (sauf pour les types byte, short et void sous Java 1.0), il est donc possible de programmer du "pur objet" en Java, o toutes les variables ne seraient que des objets et uniquement cela. Les classes d'emballage de Java ne permettent pas de modifier la valeur qu'elles mmorisent.
La classe java.lang.Boolean

Cette classe final est la classe d'emballage qui correspond au type boolean.
Champs
public final static Boolean TRUE public final static Boolean FALSE TRUE et FALSE boolean.

sont deux constantes qui correspondent aux valeurs true et false du type

Constructeurs
public Boolean (boolean value) public Boolean (String s)

Ces constructeurs permettent de crer une instance de la classe Boolean partir de la valeur boolene value ou de la chane de caractres s.
Mthodes
public boolean booleanValue ()

Renvoie la valeur boolenne mmorise.


public static Boolean valueOf (String s)

Programmer en java

Page 169

Dao Issiaka- 3me anne SI

Renvoie une instance de la classe Boolean partir de la chane de caractres s. s est considre gale true si et seulement si elle est gale "true" en minuscules ou en majuscules.
public static boolean getBoolean (String s)

Renvoie true ou false si la proprit name du systme est gale "true". Si cette proprit n'existe pas, cette mthode renvoie false.
public int hashCode () public boolean equals (Object obj) public String toString ()

Ces mthodes outrepassent celles de la classe Object, pour renvoyer un code de hash, comparer un objet boolen un objet ou renvoyer une chane de caractres dcrivant la valeur boolenne.
La classe java.lang.Character

Cette classe final est la classe d'emballage qui correspond au type char. Elle dclare un grand nombre de mthodes static permettant de reconnatre le type de lettres (majuscule, minuscule, chiffre,...) et d'effectuer des conversions.
Champs
public final static int MIN_RADIX public final static int MAX_RADIX

Ces constantes sont les bases de conversion minimum (= 2) et maximum (= 36) des nombres entiers.
public final static char MIN_VALUE public final static char MAX_VALUE

Valeurs minimum ('\u0000') et maximum ('\ffff') d'un caractre Unicode.


Constructeur
public Character (char value)

Construit une instance de la classe Character partir du caractre value.


Mthodes
public char charValue ()

Renvoie le caractre mmoris.


public static boolean isLowerCase (char ch) public static boolean isUpperCase (char ch) public static boolean isTitleCase (char ch)

Ces mthodes renvoient true si le caractre ch est une minuscule, une majuscule ou une lettre de titre.

Programmer en java

Page 170

Dao Issiaka- 3me anne SI

public static boolean isDefined (char ch)

Ces mthodes renvoient true si le caractre ch est dfini dans l'ensemble des caractres Unicode.
public static boolean isDigit (char ch)

Renvoie true si le caractre ch est un chiffre.


public static boolean isLetter (char ch)

Renvoie true si le caractre ch est une lettre.


public static boolean isLetterOrDigit (char ch)

Renvoie true si le caractre ch est un chiffre ou une lettre.


public static boolean isJavaLetter (char ch)

Renvoie true si le caractre ch est une lettre Java, c'est--dire qu'elle est permise comme premire lettre d'un identifiant Java.
public static boolean isJavaLetterOrDigit (char ch)

Renvoie true si le caractre ch est une lettre ou un chiffre Java, c'est--dire qu'elle est permise comme lettre d'un identifiant Java diffrente de la premire.
public static boolean isSpace (char ch)

Renvoie true si le caractre ch est un espace c'est--dire un des caractres ' ', '\t', '\f', '\n' ou '\r'.
public static char toLowerCase (char ch) public static char toUpperCase (char ch) public static char toTitleCase (char ch)

Ces mthodes renvoient le caractre ch converti en minuscule, en majuscule ou en lettre de titre.


public static int digit (char ch, int radix)

Renvoie le nombre correspondant au caractre ch en base radix ou -1 si le caractre ch est incorrect en base radix.
public static char forDigit (int digit, int radix)

Renvoie le caractre correspondant au nombre digit en base radix, ou le caractre '\0' si le nombre est ngatif ou plus grand que la base radix.
public int hashCode () public boolean equals (Object obj) public String toString ()

Programmer en java

Page 171

Dao Issiaka- 3me anne SI

Ces mthodes outrepassent celles de la classe Object, pour renvoyer un code de hash, comparer un objet caractre un objet ou renvoyer une chane de caractres avec le caractre mmoris.
Exemples

Applet Unicode. Classe ToUpperCaseInputStream.


La classe java.lang.Number

Cette classe abstract est la super classe des classes d'emballage Integer, Long, Float et Double qui permettent de traiter des nombres de type int, long, float et double sous forme d'objets.
Constructeur
public Number ()

Mthodes
public public public public abstract abstract abstract abstract int intValue () long longValue () float floatValue () double doubleValue ()

Ces mthodes doivent renvoyer le nombre mmoris dans l'un des types primitifs int, long, float ou double.
La classe java.lang.Integer

Cette classe final qui drive de la classe Number est la classe d'emballage qui correspond au type int.
Champs
public final static int MIN_VALUE public final static int MAX_VALUE

Valeurs minimum (-2147483648) et maximum (21474836487) d'un entier de type int.


Constructeurs
public Integer (int value) public Integer (String s) throws NumberFormatException

Ces constructeurs permettent de crer une instance de la classe Integer partir de la valeur entire value ou du nombre contenu dans la chane de caractres s.
Mthodes
public public public public int intValue () long longValue () float floatValue () double doubleValue ()

Implmentation des mthodes de la classe Number.


Programmer en java Page 172

Dao Issiaka- 3me anne SI

public static String toString (int i, int radix)

Renvoie la chane de caractres correspondant au nombre i en base radix.


public public public public static static static static String String String String toHexString (int i) toOctalString (int i) toBinaryString (int i) toString (int i)

Renvoie la chane de caractres correspondant au nombre i en base 16 (hexadcimal), en base 8 (octal), en base 2 (binaire) ou en base 10 (dcimal).
public static int parseInt (String s, int radix) throws NumberFormatException public static int parseInt (String s) throws NumberFormatException

Ces mthodes renvoient le nombre contenu dans la chane de caractres s en base radix (radix = 10 par dfaut). Si s contient des caractres invalides ou si le nombre contenu dans s est plus grand que MAX_VALUE ou plus petit que MIN_VALUE, une exception NumberFormatException est dclenche.
public static Integer valueOf (String s, int radix) throws NumberFormatException public static Integer valueOf (String s) throws NumberFormatException

Ces mthodes renvoient une instance de la classe Integer mmorisant le nombre contenu dans la chane de caractres s en base radix (radix = 10 par dfaut).
public static Integer getInteger (String name) public static Integer getInteger (String name, int val) public static Integer getInteger (String name, Integer val)

Ces mthodes renvoient la proprit name du systme. Si cette proprit n'existe pas ou n'est pas un entier, la valeur val (ou par dfaut null) est renvoye.
public int hashCode () public boolean equals (Object obj) public String toString ()

Ces mthodes outrepassent celles de la classe Object, pour renvoyer un code de hash, comparer un objet entier un objet ou renvoyer une chane de caractres dcrivant la valeur entire.
Exemples

Applets PaperBoardClient, Unicode et ListePolices. Application LectureFichier.


La classe java.lang.Long

Cette classe final qui drive de la classe Number est la classe d'emballage qui correspond au type long.
Programmer en java Page 173

Dao Issiaka- 3me anne SI

Champs
public final static int MIN_VALUE public final static int MAX_VALUE

Valeurs minimum (-9223372036854775808) et maximum (9223372036854775807) d'un entier de type long.


Constructeurs
public Long (long value) public Long (String s) throws NumberFormatException

Ces constructeurs permettent de crer une instance de la classe Long partir de la valeur entire value ou du nombre contenu dans la chane de caractres s.
Mthodes
public public public public int intValue () long longValue () float floatValue () double doubleValue ()

Implmentation des mthodes de la classe Number.


public static String toString (long i, int radix)

Renvoie la chane de caractres correspondant au nombre i en base radix.


public public public public static static static static String String String String toHexString (long i) toOctalString (long i) toBinaryString (long i) toString (long i)

Renvoie la chane de caractres correspondant au nombre i en base 16 (hexadcimal), en base 8 (octal), en base 2 (binaire) ou en base 10 (dcimal).
public static long parseLong (String s, int radix) throws NumberFormatException public static long parseLong (String s) throws NumberFormatException

Ces mthodes renvoient le nombre contenu dans la chane de caractres s en base radix (radix = 10 par dfaut). Si s contient des caractres invalides une exception NumberFormatException est dclenche.
public static Long valueOf (String s, int radix) throws NumberFormatException public static Long valueOf (String s) throws NumberFormatException

Ces mthodes renvoient une instance de la classe Long mmorisant le nombre contenu dans la chane de caractres s en base radix (radix = 10 par dfaut).
public static Long getLong (String name) public static Long getLong (String name, long val) public static Long getLong (String name, Long val)

Programmer en java

Page 174

Dao Issiaka- 3me anne SI

Ces mthodes renvoient la proprit name du systme. Si cette proprit n'existe pas ou n'est pas un entier, la valeur val (ou par dfaut null) est renvoye.
public int hashCode () public boolean equals (Object obj) public String toString ()

Ces mthodes outrepassent celles de la classe Object, pour renvoyer un code de hash, comparer un objet entier un objet ou renvoyer une chane de caractres dcrivant la valeur entire.
La classe java.lang.Float

Cette classe final qui drive de la classe Number est la classe d'emballage qui correspond au type float.
Champs
public final static float POSITIVE_INFINITY public final static float NEGATIVE_INFINITY public final static float NaN

Ces constantes permettent d'obtenir les valeurs correspondantes l'infini positif, ngatif ou reprsentant une valeur non significative.
public final static double MAX_VALUE public final static double MIN_VALUE

Valeurs minimum (1.40129846432481707e-45f) et maximum (3.40282346638528860e+38f) d'un nombre flottant de type float.
Constructeurs
public Float (float value) public Float (double value) public Float (String s) throws NumberFormatException

Ces constructeurs permettent de crer une instance de la classe Float partir de la valeur flottante value ou du nombre contenu dans la chane de caractres s.
Mthodes
public public public public int intValue () long longValue () float floatValue () double doubleValue ()

Implmentation des mthodes de la classe Number.


public boolean isInfinite () public boolean isNaN ()

Ces mthodes renvoie true si le nombre mmoris est infini ou si c'est une valeur non significative.
public static boolean isInfinite (float v)
Programmer en java Page 175

Dao Issiaka- 3me anne SI

public static boolean isNaN (float v)

Ces mthodes renvoie true si v est une valeur infinie ou si c'est une valeur non significative.
public static String toString (float f)

Renvoie la chane de caractres correspondant au nombre f.


public static Float valueOf (String s) throws NumberFormatException

Renvoie une instance de la classe Float mmorisant le nombre contenu dans la chane de caractres s. Si s contient des caractres invalides une exception NumberFormatException est dclenche.
public static int floatToIntBits (float value) public static float intBitsToFloat (int bits)

Ces mthodes convertissent la valeur value en son quivalent en int, ou inversement la valeur bits de type int en float. Elles sont utilises par les mthodes writeFloat () et readFloat () de certaines des classes d'entre-sortie qui manipulent un nombre de type float sous forme de valeur 32 bits.
public int hashCode () public boolean equals (Object obj) public String toString ()

Ces mthodes outrepassent celles de la classe Object, pour renvoyer un code de hash, comparer un objet de classe Float un objet ou renvoyer une chane de caractres dcrivant la valeur flottante.
Exemple

Applet CalculetteSimple.
La classe java.lang.Double

Cette classe final qui drive de la classe Number est la classe d'emballage qui correspond au type double.
Champs
public final static double POSITIVE_INFINITY public final static double NEGATIVE_INFINITY public final static double NaN

Ces constantes permettent d'obtenir les valeurs correspondantes l'infini positif, ngatif ou reprsentant une valeur non significative (par exemple, Math.sqrt (-1) renvoie Double.NaN).
public final static double MAX_VALUE public final static double MIN_VALUE

Programmer en java

Page 176

Dao Issiaka- 3me anne SI

Valeurs minimum (2.2250738585072014e-308) et maximum (1.79769313486231570e+308) d'un nombre flottant de type double.
Constructeurs
public Double (double value) public Double (String s) throws NumberFormatException

Ces constructeurs permettent de crer une instance de la classe Double partir de la valeur flottante value ou du nombre contenu dans la chane de caractres s.
Mthodes
public public public public int intValue () long longValue () float floatValue () double doubleValue ()

Implmentation des mthodes de la classe Number.


public boolean isInfinite () public boolean isNaN ()

Ces mthodes renvoie true si le nombre mmoris est infini ou si c'est une valeur non significative.
public static boolean isInfinite (double v) public static boolean isNaN (double v)

Ces mthodes renvoie true si v est une valeur infinie ou si c'est une valeur non significative.
public static String toString (double d)

Renvoie la chane de caractres correspondant au nombre d.


public static Double valueOf (String s) throws NumberFormatException

Renvoie une instance de la classe Double mmorisant le nombre contenu dans la chane de caractres s. Si s contient des caractres invalides une exception NumberFormatException est dclenche.
public static long doubleToLongBits (double value) public static double longBitsToDouble (long bits)

Ces mthodes convertissent la valeur value en son quivalent en long, ou inversement la valeur bits de type long en double. Elles sont utilises par les mthodes writeDouble () et readDouble () de certaines des classes d'entre-sortie qui manipulent un nombre de type double sous forme de valeur 64 bits.
public int hashCode () public boolean equals (Object obj) public String toString ()

Programmer en java

Page 177

Dao Issiaka- 3me anne SI

Ces mthodes outrepassent celles de la classe Object, pour renvoyer un code de hash, comparer un objet de classe Double un objet ou renvoyer une chane de caractres dcrivant la valeur flottante.
Exemple

Application TestExpression.
La classe java.lang.String

Cette classe final permet de manipuler les chanes de caractres constantes. Elle est dtaille au chapitre sur les chanes de caractres.
La classe java.lang.StringBuffer

Cette classe permet de manipuler et modifier des chanes de caractres. Elle est dtaille au chapitre sur les chanes de caractres.
Calcul mathmatique : la classe java.lang.Math

Cette classe final rassemble l'ensemble des mthodes de calcul mathmatique Java. Toutes ses mthodes sont static.
Champs
public final static double E public final static double PI

Ces champs permettent d'obtenir les nombres e (= 2.71828...) et Pi ( = 3.14159...).


Mthodes
public static double sin (double a) public static double cos (double a) public static double tan (double a)

Ces mthodes permettent de calculer le sinus, le cosinus du nombre a exprim en radian.


public static double asin (double a)

Renvoie l'arc sinus (sin-1) du nombre a, exprim en radian et compris entre -PI/2 et PI/2.
public static double acos (double a)

Renvoie l'arc cosinus (cos-1) du nombre a, exprim en radian et compris entre 0 et PI.
public static double atan (double a)

Renvoie l'arc tangente (tan-1) du nombre a, exprim en radian et compris entre -PI/2 et PI/2.
public static double atan2 (double a, double b)

Programmer en java

Page 178

Dao Issiaka- 3me anne SI

Renvoie l'arc tangente (tan-1) de a/b, exprim en radian et compris entre -PI et PI.
public static double exp (double a) public static double log (double a)

Ces mthodes permettent de calculer l'exponentielle ou le logarithme nprien du nombre a.


public static double IEEEremainder (double f1, double f2)

Renvoie le reste de la division de f1 par f2 (par exemple Math.IEEEremainder (4.5, 2) = 0.5, Math.IEEEremainder (4.5, 2.2) = 0.1) .
public static double floor (double a)

Renvoie la plus grande valeur entire plus petite ou gale a.


public static double ceil (double a)

Renvoie la plus petite valeur entire plus grande ou gale a.


public static double sqrt (double a)

Renvoie la racine carre du nombre a.


public static double pow (double a, double b)

Renvoie le nombre a la puissance b (ab).


public static double rint (double a) public static int round (float a) public static long round (double a)

Ces mthodes renvoient la valeur arrondie au plus proche entier du nombre dcimal a.
public static synchronized double random ()

Renvoie un nombre alatoire compris entre 0. inclus et 1. exclu. Voir aussi la classe java.util.Random.
public public public public static static static static int abs (int a) long abs (long a) float abs (float a) double abs (double a)

Ces mthodes renvoient la valeur absolue du nombre a.


public public public public public public public public static static static static static static static static int max (int a, int b) long max (long a, long b) float max (float a, float b) double max (double a, double b) int min (int a, int b) long min (long a, long b) float min (float a, float b) double min (double a, double b)
Page 179

Programmer en java

Dao Issiaka- 3me anne SI

Ces mthodes renvoient la valeur maximum ou minimum des nombres a et b. Les mthodes log (), sqrt (), pow (),... auxquelles sont envoys des arguments interdits en mathmatique (comme le logarithme nprien d'un nombre ngatif) renvoie la valeur non significative Double.NaN sans dclencher d'exception.
Exemples

Applets AfficheurDeCalcul, ObservateurCalcul, DrawIt, ImageNoirEtBlanc, Compteur et Horloge.


Gestion des threads L'interface java.lang.Runnable

Cette interface dclare uniquement la mthode run () :


public void run ()

Toute classe Classe1 peut implmenter l'interface Runnable, et implmenter une mthode run () qui sera excute par les threads crs partir de la classe Classe1.
Exemples

Application PaperBoardServer. Applets Chrono, AfficheurDeCalcul, ObservateurCalcul, PaperBoardClient, AnimationFleche, ScrollText et Horloge.
La classe java.lang.Thread

Cette classe permet de crer et de manipuler les threads. Elle est dtaille au chapitre sur les threads.
La classe java.lang.ThreadGroup

Cette classe permet de consulter ou crer des groupes de threads, pour rassembler vos threads par exemple par type. Voir aussi la classe Thread.
Constructeurs
public ThreadGroup (String name) throws SecurityException public ThreadGroup (ThreadGroup parent, String name) throws SecurityException, IllegalThreadStateException

Mthodes
public public public public public public public public String toString () final void checkAccess () final String getName () final ThreadGroup getParent () final boolean parentOf (ThreadGroup g) final synchronized void stop () throws SecurityException final synchronized void suspend () throws SecurityException final synchronized void resume () throws SecurityException
Page 180

Programmer en java

Dao Issiaka- 3me anne SI

public final synchronized void destroy () throws SecurityException, IllegalThreadStateException public final int getMaxPriority () public final synchronized void setMaxPriority (int newMaxPriority) throws SecurityException, IllegalArgumentException public final boolean isDaemon () public final void setDaemon (boolean daemon) throws SecurityException public synchronized int activeCount () public synchronized int activeGroupCount () public int enumerate (Thread list [ ]) public int enumerate (Thread list [ ], boolean recurse) public int enumerate (ThreadGroup list [ ]) public int enumerate (ThreadGroup list [ ], boolean recurse) public synchronized void list () public void uncaughtException (Thread t, Throwable e)

Gestion du systme La classe java.lang.System

Cette classe final permet d'accder diffrentes fonctionnalits du systme de la Machine Virtuelle Java. Elle est dtaille au chapitre sur les objets.
La classe java.lang.Runtime

Cette classe permet de manipuler le Runtime Java, renvoy par la mthode getRuntime (). Les mthodes exit (), exec (), load () et loadLibrary () sont susceptibles de dclencher une exception SecurityException si le gestionnaire de scurit interdit ces oprations.
Mthodes
public static Runtime getRuntime ()

Renvoie le Runtime Java.


public synchronized void load (String filename) throws SecurityException, UnsatisfiedLinkError public synchronized void loadLibrary (String libname) throws SecurityException, UnsatisfiedLinkError public void exit (int status) throws SecurityException public void gc () public void runFinalization ()

Ces mthodes ont le mme effet que celles que de la classe java.lang.System.
public Process exec (String command) throws IOException, SecurityException public Process exec (String command, String envp [ ]) throws IOException, SecurityException public Process exec (String cmdarray [ ]) throws IOException, SecurityException public Process exec (String cmdarray [ ], String envp [ ]) throws IOException, SecurityException

Programmer en java

Page 181

Dao Issiaka- 3me anne SI

Ces mthodes permettent d'excuter la commande du systme command ou cmdarray [0]. envp [] est un tableau contenant les paramtres passer la commande au format param=valeur (pour passer par exemple des paramtres java). exec () renvoie une instance de la classe Process qui permet de contrler la commande excute.
public long freeMemory () public long totalMemory ()

Ces mthodes renvoient la taille de la mmoire libre et la taille totale de la mmoire.


public public public public void traceInstructions (boolean on) void traceMethodCalls (boolean on) InputStream getLocalizedInputStream (InputStream in) OutputStream getLocalizedOutputStream (OutputStream out)

La classe java.lang.Process

Les objets drivant de cette classe abstract sont retourns par les mthodes exec () de l a classe Runtime. Ces mthodes permettent de contrler l'tat d'un process.
Constructeurs
public Process ()

Mthodes
public abstract OutputStream getOutputStream () public abstract InputStream getInputStream () public abstract InputStream getErrorStream ()

Ces mthodes renvoient les flux de sortie, d'entre et d'erreur d'un process.
public abstract int waitFor () throws InterruptedException public abstract void destroy ()

Ces mthodes permettent d'attendre la fin d'un process ou de le dtruire.


public abstract int exitValue () throws IllegalThreadStateException

Renvoie la valeur renvoye par le process.


La classe java.lang.SecurityManager

Une classe drive de cette classe abstract permet de dfinir un gestionnaire de scurit dont l'instance est passe en paramtre la mthode setSecurityManager () de la classe System. Ce gestionnaire est utilis par les navigateurs pour interdire aux applets entre autre, l'accs au systme de fichiers local. Comme l'implmentation de toutes les mthodes check... () de cette classe dclenche une exception de classe SecurityException, toute classe qui drive de la classe SecurityManager doit outrepasser les mthodes pour autoriser tel ou tel action de la Machine Virtuelle Java.

Programmer en java

Page 182

Dao Issiaka- 3me anne SI

Champs
protected boolean inCheck

Constructeurs
protected SecurityManager () throws SecurityException

Mthodes
protected Class [ ] getClassContext () protected int classDepth (String name) protected boolean inClass (String name) protected ClassLoader currentClassLoader () protected int classLoaderDepth () protected boolean inClassLoader () public boolean getInCheck () public Object getSecurityContext () public void checkAccept (String host, int port) throws SecurityException public void checkAccess (Thread t) throws SecurityException public void checkAccess (ThreadGroup g) throws SecurityException public void checkConnect (String host, int port) throws SecurityException public void checkConnect (String host, int port, Object context) throws SecurityException public void checkCreateClassLoader () throws SecurityException public void checkDelete (String file) throws SecurityException public void checkExec (String cmd) throws SecurityException public void checkExit (int status) throws SecurityException public void checkLink (String libname) throws SecurityException public void checkListen (int port) throws SecurityException public void checkPackageAccess (String packageName) throws SecurityException public void checkPackageDefinition (String packageName) throws SecurityException public void checkPropertiesAccess () throws SecurityException public void checkPropertyAccess (String key) throws SecurityException public void checkRead (FileDescriptor fd) throws SecurityException public void checkRead (String file) throws SecurityException public void checkRead (String file, Object context) throws SecurityException public void checkSetFactory () throws SecurityException public boolean checkTopLevelWindow () throws SecurityException public void checkWrite (FileDescriptor fd) throws SecurityException public void checkWrite (String file) throws SecurityException

Programmer en java

Page 183

Dao Issiaka- 3me anne SI

Les outils Java


Gestion de collections de donnes Gestion des dates Gnration de nombres alatoires Autres classes d'outils

Gestion de collections de donnes

Le package java.util rassemble des classes d'utilitaires dont les plus intressantes permettent de grer les collections de donnes (classes Vector, Stack, Dictionary, Hashtable, BitSet et interface Enumeration).
L'interface java.util.Enumeration

Cette interface est implmente par les classes dsirant pouvoir faire une numration des objets mmoriss par une autre classe, comme par exemple la classe Vector. Les mthodes de cette interface sont gnralement utilises dans une boucle while, comme dans l'exemple suivant ( recopier dans un fichier EssaiEnumeration.java que vous compilez avec l'instruction javac EssaiEnumeration.java pour ensuite l'excuter avec java ou Java Runner, grce l'instruction java EssaiEnumeration) :
import java.util.*; // Classe mmorisant des chanes de caractres class CollectionChaines { String [ ] tabChaines; int nbreChaines = 0; CollectionChaines (int max) { tabChaines = new String [max]; } public void ajouterChaine (String chaine) { tabChaines [nbreChaines++] = chaine; } public Enumeration chanes () { return new EnumerationChaines (this); } }

Programmer en java

Page 184

Dao Issiaka- 3me anne SI

// Classe permettant d'numrer les chanes de CollectionChaines class EnumerationChaines implements Enumeration { CollectionChaines collection; int indice = 0; public EnumerationChaines (CollectionChaines collection) { this.collection = collection; } public boolean hasMoreElements () { return indice < collection.nbreChaines; } public Object nextElement () { if (indice < collection.nbreChaines) return collection.tabChaines [indice++]; else throw new NoSuchElementException (); } } // Classe d'essai public class EssaiEnumeration { public static void main (String [ ] args) { // Cration d'une collection de chanes et ajout de 3 chanes CollectionChaines donnees = new CollectionChaines (10); donnees.ajouterChaine ("Toto"); donnees.ajouterChaine ("Titi"); donnees.ajouterChaine ("Tutu"); // Enumration des lments de la collection Enumeration enumeration = donnees.chanes (); while (enumeration.hasMoreElements ()) System.out.println (enumeration.nextElement ()); } }

Mthodes
public boolean hasMoreElements ()

Cette mthode doit renvoyer true s'il reste encore un ou plusieurs lments numrer.
public Object nextElement () throws NoSuchElementException

Cette mthode doit retourner l'lment suivant numrer ou dclencher une exception de classe NoSuchElementException si le dernier lment a dj t numr.
La classe java.util.Vector

Cette classe qui implmente l'interface Cloneable, permet de crer un vecteur. Ce type d'ensemble permet de mmoriser un ensemble d'objets de classe quelconque dans un tableau de taille variable (ces lments peuvent tre ventuellement gal null). Comme pour les
Programmer en java Page 185

Dao Issiaka- 3me anne SI

tableaux, l'accs aux lments se fait par un indice. La classe Vector comporte de nombreuses mthodes qui permettent d'ajouter, d'insrer, de supprimer ou de rechercher des lments. Toutes les mthodes de Vector sont final sauf clone ().
Champs
protected Object [ ] elementData protected int elementCount protected int capacityIncrement

Ces champs correspondent aux lments mmoriss, au nombre d'lments mmoriss et l'incrment appliquer au tableau elementData quand il est rempli. Ces classes tant protected ne sont accessibles que dans les classes drives de Vector.
Constructeurs
public Vector () public Vector (int initialCapacity) public Vector (int initialCapacity, int capacityIncrement)

Ces constructeurs permettent de crer un vecteur de capacit initiale initialCapacity (gal 10 par dfaut) et d'incrment capacityIncrement (gal 0 par dfaut). Si l'incrment est nul, la taille du tableau mmorisant les lments du vecteur sera double chaque fois que ce tableau a besoin d'tre agrandi.
Mthodes
public final synchronized void addElement (Object obj)

Ajoute l'lment obj en fin de vecteur. Si le tableau du vecteur est trop petit, il est automatiquement agrandi.
public final synchronized void insertElementAt (Object obj, int index) throws IndexOutOfBoundsException

Insre l'lment obj l'indice index. Si le tableau du vecteur est trop petit, il est automatiquement agrandi.
public final synchronized Object elementAt (int index) throws IndexOutOfBoundsException public final synchronized void setElementAt (Object obj, int index) throws IndexOutOfBoundsException

Ces mthodes permettent d'interroger ou de modifier l'lment mmoris l'indice index. Si index est plus grand que le nombre d'lments du vecteur, une exception IndexOutOfBoundsException est dclenche.
public final synchronized boolean removeElement (Object obj) public final synchronized void removeElementAt (int index) throws IndexOutOfBoundsException public final synchronized void removeAllElements ()

Ces mthodes permettent de retirer du vecteur, soit l'lment obj, soit l'lment mmoris l'indice index, soit tous les lments mmoriss. Les deux premires mthodes dcalent les lments qui suivent l'lment retir du tableau du vecteur un indice infrieur.
Programmer en java Page 186

Dao Issiaka- 3me anne SI

public final boolean isEmpty ()

Renvoie true si le vecteur est vide.


public final int size ()

Renvoie le nombre d'lments mmoriss dans le vecteur.


public final synchronized void setSize (int newSize)

Modifie la taille du vecteur. Si newSize est plus petit que le nombre d'lments courant du vecteur, les derniers lments sont perdus, sinon un ensemble d'lments gaux null sont ajouts pour atteindre la taille newSize.
public final int capacity () public final synchronized void ensureCapacity (int minCapacity)

Ces mthodes permettent d'interroger ou de modifier la capacit courante du vecteur. La capacit du vecteur est le nombre maximum que son tableau peut contenir avant que celui-ci est besoin d'tre agrandi.
public final synchronized void trimToSize ()

Rduit la capacit du tableau du vecteur aux nombres d'lments mmoriss par le vecteur.
public final synchronized Object firstElement () throws NoSuchElementException public final synchronized Object lastElement () throws NoSuchElementException

Ces mthodes renvoient le premier ou le dernier lment mmoris par le vecteur.


public final synchronized void copyInto (Object array [ ]) throws IndexOutOfBoundsException

Recopie dans le tableau array l'ensemble des lments mmoriss par le vecteur. Si array est top petit, une exception IndexOutOfBoundsException est dclenche.
public final synchronized Enumeration elements ()

Permet d'numrer les lments du vecteur.


public final boolean contains (Object elem)

Renvoie true si le vecteur contient un lment gal elem. La mthode equals () de la classe de l'objet elem est utilise pour comparer les objets.
public final int indexOf (Object elem) public final synchronized int indexOf (Object elem, int index) throws IndexOutOfBoundsException public final int lastIndexOf (Object elem) public final synchronized int lastIndexOf (Object elem, int index) throws IndexOutOfBoundsException

Programmer en java

Page 187

Dao Issiaka- 3me anne SI

Ces mthodes renvoient l'indice du premier ou du dernier lment gal elem, ou -1 si elem n'est pas trouv. La mthode equals () de la classe de l'objet elem est utilise pour comparer les objets. index permet d'ventuellement spcifier le premier indice partir duquel commencer la recherche.
public synchronized Object clone ()

Renvoie un clone du vecteur. Les lments du vecteur ne sont pas clons eux-mmes. Cette mthode outrepasse la mthode clone () de la classe Object.
public final synchronized String toString ()

Cette mthode outrepasse la mthode toString () de la classe Object, pour renvoyer une chane de caractres dcrivant la liste des lments mmoriss par le vecteur.
Exemples

Application ConcatenationFichiers. Applet PaperBoardClient.


La classe java.util.Stack

Cette classe qui drive de Vector permet de crer des piles, o vous pouvez empiler un objet avec la mthode push (), retirer l'lment en haut de la pile avec pop (), ou consulter sans le retirer l'lment en haut de la pile avec peek ().
Mthodes
public public public public public Object push (Object item) Object pop () throws EmptyStackException Object peek () throws EmptyStackException boolean empty () int search (Object o)

La classe java.util.Dictionary

Cette classe abstract permet de crer un dictionnaire reprsent par un ensemble d'entres associant un lment et une cl. Chaque cl du dictionnaire est unique et est associ au plus un lment, mais un mme lment peut avoir plusieurs cls d'accs. Les lments et les cls devant tre de la classe Object, le cast de rfrences permet donc d'utiliser n'importe quel type de classe pour les cls et les lments (chanes de caractres, classes d'emballage des nombres ou d'autres classes). Un dictionnaire peut tre compar un tableau : Dans un tableau tab, vous mmorisez un ensemble d'lments accessible grce un indice entier i, par l'expression tab [i]. Il est possible de mmoriser plusieurs fois le mme objet dans tab des indices diffrents, mais par contre chaque indice i est unique et vous permet d'accder aux diffrents lments du tableau grce tab [i]. Dans un dictionnaire dict, vous mmorisez de la mme manire des lments auquel vous accdez grce une cl plutt que par un indice entier. Cette cl peut tre de n'importe quelle classe, ce qui permet de mmoriser les lments d'une manire plus riche qu'avec un simple indice entier. Pour faire un parallle entre l'utilisation d'un tableau tab et d'un dictionnaire dict, l'expression tab [i] = element a pour quivalent dict.put
Programmer en java Page 188

Dao Issiaka- 3me anne SI

(cle, element) et dict.get (cle).

l'expression element = tab [i] a pour quivalent element =

Voici toutes les mthodes que doit implmenter une classe drivant de Dictionary, pour pouvoir tre instancie (comme la classe Hashtable) :
Constructeur
public Dictionary ()

Mthodes
abstract public int size () size () doit renvoyer le nombre d'entres dans le dictionnaire. Chaque cl devant tre unique ce nombre est gal au nombre de cls. abstract public boolean isEmpty () isEmpty ()

renvoie true si le dictionnaire ne contient aucune entre.

abstract public Object get (Object key)

Cette mthode doit renvoyer l'lment associ la cl key, ou null si la cl key n'existe pas.
abstract public Object put (Object key, Object element)

Cette mthode doit ajouter dans le dictionnaire une entre associant la cl key avec l'lment element. Si une entre avec une cl gale key existe dj (par la mthode equals ()), l'lment de cette entre est renvoy par put () aprs avoir t remplac par element. Sinon put () renvoie null, aprs avoir ajout une nouvelle entre.
abstract public Object remove (Object key)

Cette mthode doit supprimer du dictionnaire l'entre ayant comme cl key. Si une entre avec une cl gale key existe dj (par la mthode equals ()), l'lment de cette entre est renvoy par remove () aprs que cette entre ait t supprime. Sinon, remove () renvoie null.
abstract public Enumeration keys () abstract public Enumeration elements ()

Ces mthodes doivent renvoyer un objet d'une classe implmentant Enumeration permettant d'numrer les cls et les lments du dictionnaire respectivement.
La classe java.util.Hashtable

Cette classe implmente l'interface Cloneable et drive de la classe Dictionary dont elle implmente toutes les mthodes, en y ajoutant certaines mthodes. Les tables de hash utilise la valeur que retourne la mthode hashCode () des cls, pour organiser le rangement des entres de la table afin que get () fonctionne avec efficacit. Les objets utiliss comme cls dans une table de hash devraient avoir leur classe qui outrepassent les mthodes equals () et hashCode () pour un fonctionnement correct (voir la classe Object).

Programmer en java

Page 189

Dao Issiaka- 3me anne SI

Constructeurs
public Hashtable (int initialCapacity, float loadFactor)

Cre une table de hash avec une capacit initiale de initialCapacity entres. La table est rorganise avec la mthode rehash (), chaque fois que le nombre d'entres atteint loadFactor multipli par la capacit de la table (0 < loadFactor < 1) . Plus loadFactor est petit, plus souvent la table sera rorganise, mais attention cette opration prend du temps ! Si c'est possible, Il vaut mieux prvoir une table de hash avec une capacit initiale proche du nombre d'lments mmoriser dans la table, pour viter que la table ait trop souvent se rorganiser.
public Hashtable (int initialCapacity) public Hashtable ()

Mthodes
public public public public public public public int size () boolean isEmpty () synchronized Object get (Object key) synchronized Object put (Object key, Object element) synchronized Object remove (Object key) synchronized Enumeration keys () synchronized Enumeration elements ()

Ces mthodes outrepassent celles de la classe Dictionary. Pour plus d'informations, consultez la classe Dictionary.
public synchronized boolean contains (Object element) public synchronized boolean containsKey (Object key)

Ces mthodes renvoient true si respectivement un lment ou une cl existe dans la table.
public synchronized void clear () clear ()

supprime toutes les entres (cls et lments) de la table.

protected void rehash ()

Cette mthode agrandit et rorganise la table pour plus d'efficacit.


public synchronized Object clone ()

Renvoie un clone de la table de hash. Cette mthode outrepasse la mthode clone () de la classe Object.
public synchronized final String toString ()

Cette mthode outrepasse la mthode toString () de la classe Object, pour renvoyer une chane de caractres dcrivant l'ensemble des entres (cl + lment) de la table.
La classe java.util.Properties

Cette classe drivant de Hashtable dsigne une table de hash ne pouvant mmoriser que des chanes de caractres et comportant des fonctionnalits de sauvegarde/lecture dans un fichier.
Programmer en java Page 190

Dao Issiaka- 3me anne SI

Cette classe ressemble un peu la gestion des fichiers profile Windows (.INI), et la classe System l'utilise pour mmoriser les proprits associs un programme Java.
Champ
protected Properties defaults

Constructeurs
public Properties () public Properties (Properties defaults)

Mthodes
public String getProperty (String property) public String getProperty (String property, String defaultValue)

Ces mthodes renvoient la proprit de nom property, ou defaultValue si cette proprit n'est pas dfinie.
public Enumeration propertyNames ()

Permet d'numrer l'ensemble des noms de proprits.


public void list (PrintStream out)

Ecrit sur le flux de donnes out la liste des proprits et de leur valeur.
public synchronized void load (InputStream in) throws IOException public synchronized void save (OutputStream out, String header)

Ces mthodes permettent d'crire ou de lire un ensemble de proprits patir des flux de donnes in ou out. Le format des donnes est ensemble de couples property=value.
La classe java.util.BitSet

Cette classe final qui implmente l'interface Cloneable permet de manipuler aisment un ensemble de bits. Les objets de cette classe ont leur nombre de bits mmoriss qui croit automatiquement l'appel des mthodes set () et clear (). Les mthodes and (), or () et xor () permettent d'effectuer les oprations ET, OU et OU Exclusif bit bit sur les ensembles de bits des objets de cette classe.
Constructeurs
public BitSet () public BitSet (int nbits)

Les nbits bits qu'une instance de la classe BitSet mmorise sont stocks dans un tableau dont les lments sont de type long (64 bits).
Mthodes
public public public public public public boolean get (int bitIndex) void set (int bitIndex) void clear (int bitIndex) void and (BitSet set) void or (BitSet set) void xor (BitSet set)
Page 191

Programmer en java

Dao Issiaka- 3me anne SI

public int size () public public public public boolean equals (Object obj) int hashCode () Object clone () String toString ()

Gestion des dates La classe java.util.Date

Cette classe permet de manipuler les dates. Les objets de cette classe reprsente un moment donn la seconde prs. La classe Date fournit des mthodes permettant d'obtenir ou de modifier l'anne, le mois, le jour, l'heure, la minute ou la seconde d'une date et de comparer des dates.

L'anne est un int gal 0 pour l'anne 1900. Le mois est un int allant de 0 pour le mois de Janvier 11 pour le mois de dcembre. Le jour du mois est un int allant de 1 31. L'heure est un int allant de 0 23. La minute est un int allant de 0 59. La seconde est un int allant de 0 59.

Les objets de la classe Date ne sont pas des horloges. A chaque fois que vous voulez obtenir le temps courant, utilisez la mthode currentTimeMillis () de la classe System, ou crez un nouvel objet de classe Date avec le constructeur par dfaut.
Constructeurs
public public public public public () (long time) (int year, int month, int date) (int year, int month, int date, int hours, int minutes) (int year, int month, int date, int hours, int minutes, int seconds) public Date (String s) throws IllegalArgumentException Date Date Date Date Date

Mthodes
public public public public public public public public public public public public int getYear () void setYear (int year) int getMonth () void setMonth (int month) int getDate () void setDate (int date) int getHours () void setHours (int hours) int getMinutes () void setMinutes (int minutes) int getSeconds () void setSeconds (int seconds)

Ces mthodes permettent d'interroger ou de modifier l'anne, le mois, le jour du mois, l'heure, la minute ou la seconde d'une date.

Programmer en java

Page 192

Dao Issiaka- 3me anne SI

public int getDay ()

Renvoie le jour de la semaine sachant que le nombre 0 correspond dimanche.


public long getTime () public void setTime (long time)

Ces mthodes permettent d'interroger ou de modifier le temps en millisecondes


public boolean before (Date when) public boolean after (Date when)

Ces mthodes renvoient true si une date est infrieure ou suprieure la date when.
public int getTimezoneOffset () public static long UTC (int year, int month, int date, int hours, int minutes, int seconds) public static long parse (String s) throws IllegalArgumentException

Renvoie le temps partir d'une chane de caractre respectant le format IETF.


public String toLocaleString ()

Renvoie une chane de caractres dcrivant la date courante respectant la notation locale.
public String toGMTString ()

Renvoie une chane de caractres dcrivant la date courante respectant la notation GMT.
public boolean equals (Object obj) public int hashCode () public String toString ()

Exemples

Applets TraitementTexte, MiseAJourHorloge et Horloge.


Gnration de nombres alatoires La classe java.util.Random

Les mthodes de la classe Random permettent de gnrer des nombres alatoires, comme la mthode random () de la classe java.lang.Math. Ces mthodes peuvent gnrer des nombres entiers, dcimaux (entre 0. inclus et 1. exclus) ou respectant la courbe de Gauss (entre -1. et 1.).
Constructeurs
public Random () public Random (long seed)

Le second constructeur permet de crer un gnrateur dont on fournit la base de dpart. Pour une mme base, la srie de nombres alatoires gnres sera toujours la mme chaque
Programmer en java Page 193

Dao Issiaka- 3me anne SI

excution d'un programme. Le premier constructeur cre un gnrateur dont la base est gale au temps courant. Ce temps tant toujours diffrent d'une excution l'autre, chaque srie sera diffrente chaque excution.
Mthodes
public public public public public public synchronized void setSeed (long seed) int nextInt () long nextLong () float nextFloat () double nextDouble () synchronized double nextGaussian ()

Exemples

Applets ObservateurCalcul, DrawIt et ImageNoirEtBlanc.


Autres classes d'outils La classe java.util.StringTokenizer

Cette classe permet d'numrer partir d'une chane de caractres str un ensemble de souschanes spares par des dlimiteurs (voir aussi la classe java.io.StreamTokenizer).
Constructeurs
public StringTokenizer (String str, String delim, boolean returnTokens) public StringTokenizer (String str, String delim) public StringTokenizer (String str)

Permet de spcifier la chane str dans laquelle on recherche des sous-chanes. Les souschanes sont spares par des dlimiteurs qui peuvent tre n'importe quel caractre de delim. Si returnTokens est true, l'numration rendra les sous-chanes et les dlimiteurs. Par dfaut, le dlimiteur est un espace et returnTokens est gal false.
Mthodes
public boolean hasMoreElements () public boolean hasMoreTokens ()

Ces deux mthodes renvoient vraies si la chane str a encore des sous-chanes numrer.
public Object nextElement () throws NoSuchElementException public String nextToken () throws NoSuchElementException public String nextToken (String delim) throws NoSuchElementException

Ces trois mthodes renvoient la sous-chane suivante de str (ou le dlimiteur si returnTokens est true), et avance la position de recherche dans str au caractre suivant la sous-chane renvoye. La troisime mthode permet de remplacer les dlimiteurs recherchs.
public int countTokens ()

Renvoie le nombre de sous-chanes restant numrer.

Programmer en java

Page 194

Dao Issiaka- 3me anne SI

L'interface java.util.Observer

Toute classe qui implmente cette interface peut instancier un observateur d'un objet observ. Cette objet observ dont la classe est Observable ou ses drives, peut prvenir tous ses observateurs d'un changement en appelant automatiquement la mthode update () de chacun d'eux. Voir la classe Observable.
Mthode
public void update (Observable o, Object arg)

Exemple

Applet ObservateurCalcul.
La classe java.util.Observable

Cette classe permet de crer des objets observs par des observateurs, ces derniers tant des objets dont la classe implmente l'interface Observer. Quand un objet observ appelle la mthode notifyObservers () la suite d'un changement, chacun de ses observateurs voit sa mthode update () appele. La mthode notifyObservers () n'a d'effet que si l'objet observ a chang suite un appel la mthode setChanged (). Comme setChanged () est protected, il n'est possible de l'invoquer qu' partir d'une sous classe d'Observable, ce qui vous oblige crer une classe drive de la classe Observable pour pouvoir vous en servir.
Constructeur
public Observable ()

Mthodes
public public public public synchronized synchronized synchronized synchronized void addObserver (Observer o) void deleteObserver (Observer o) void deleteObservers () int countObservers ()

Ces mthodes permettent d'ajouter, de supprimer ou de compter les observateurs d'un objet.
public void notifyObservers () public synchronized void notifyObservers (Object arg)

Ces mthodes provoqueront l'appel de la mthode update () de chacun des observateurs, si l'objet a appel setChanged () pour spcifier que l'objet a t modifi. arg, par dfaut gal null, est pass en paramtre la mthode update () des observateurs.
protected synchronized void setChanged () protected synchronized void clearChanged () public synchronized boolean hasChanged ()

Ces mthodes permettent de valider, d'annuler ou d'interroger un flag indiquant si l'objet a chang.

Programmer en java

Page 195

Dao Issiaka- 3me anne SI

Voici un exemple illustrant l'utilisation de la classe Observable et de l'interface Observer, avec une applet affichant des sinusodes, drive de l'exemple du chapitre sur les threads :

et le programme Java correspondant ( copier dans un fichier dnomm ObservateurCalcul.java et invoqu partir d'un fichier HTML) :
import java.awt.*; import java.applet.Applet; import java.util.*; public class ObservateurCalcul extends Applet implements Observer { private CalculateurObservable calculateur; private int [ ] courbe; private Random generateur = new Random (); public void start () { // Cration d'un calculateur CalculateurObservable calculateur = new CalculateurObservable (size ().width, size ().height); // L'applet se dclare comme observateur du calculateur calculateur.addObserver (this); } public void stop () { calculateur.stop (); } // Implmentation de l'interface Observer public void update (Observable calculateur, Object courbe) { // Rcupration de la courbe calcule this.courbe = (int [])courbe; // Affichage de la nouvelle courbe repaint (); // repaint () efface le fond puis appelle paint () } // Mthode appele par le systme pour mettre jour le dessin de l'applet public void paint (Graphics gc) { // Cration d'une couleur alatoire gc.setColor (new Color (generateur.nextFloat (), generateur.nextFloat (), generateur.nextFloat ())); if (courbe != null) // Dessin de la courbe en reliant les points un un for (int i = 1; i < courbe.length; i++) gc.drawLine (i - 1, courbe [i - 1], i, courbe [i]); } } class CalculateurObservable extends Observable implements Runnable
Programmer en java Page 196

Dao Issiaka- 3me anne SI

{ private int private int private Thread width; height; threadCalculateur;

public CalculateurObservable (int width, int height) { this.width = width; this.height = height; // Dmarrage d'un thread de calcul (threadCalculateur = new Thread (this)).start (); } public void stop () { threadCalculateur.stop (); } public void calculerCourbe () { int [] courbe = new int [width]; // Calcul d'une sinusode avec frquence alatoire double pasCalcul = 2 * Math.PI / courbe.length / Math.random (); for (int i = 0; i < courbe.length; i++) courbe [i] = (int)((Math.sin (i * pasCalcul) + 1) * height / 2); // Nouveau calcul setChanged (); // Appel de la mthode update () des observateurs notifyObservers (courbe); } public void run () { try { while (threadCalculateur.isAlive ()) { // Calculer une courbe calculerCourbe (); Thread.sleep (200); } } catch (InterruptedException e) { } } }

Programmer en java

Page 197

Dao Issiaka- 3me anne SI

La gestion des fichiers et des flux de donnes


Gestion des entres-sorties Manipulation des fichiers Gestion des flux de donnes Accs un flux de donnes en lecture Accs un flux de donnes en criture Gestion de l'accs alatoire aux fichiers

Ce chapitre dcrit le package java.io de Java 1.0 qui rassemble les classes permettant de manipuler les fichiers et de grer les entres-sorties.
Gestion des entres-sorties

En observant la hirarchie des classes de Java, vous serez peut-tre tonn par le nombre de classes dvolues la gestion des entres-sorties (package java.io), et particulirement celles de gestion des flux de donnes (stream). Ne vous inquitez pas : une fois que vous aurez cerner le principe de fonctionnement de la gestion des flux de donnes, vous verrez que toutes les classes drivant des classes InputStream et OutputStream s'utilisent de manire intuitive.
Mode d'accs aux donnes

Comme dans la plupart des langages informatiques, Java permet de manipuler les fichiers soit en accs par flux de donnes (Stream), soit en accs alatoire (Random access) :

Le mode d'accs par flux de donnes permet d'accder aux donnes sous la forme d'un flux squentiel. Pour faire un parallle, imaginez un lecteur de CD sans les touches d'avance et de retour rapides >> et << : Vous pouvez accder un morceau de musique grce aux touches >>| et |<< et l'couter, mais quand le morceau est en train d'tre lu, vous ne pouvez que l'couter de manire continu sans revenir en arrire ni sauter une partie. Similairement quand vous accdez un flux de donnes, une fois que vous commencez accder aux donnes, vous devez traiter les donnes au fur et mesure qu'elles vous sont dlivres.

Ce systme permet d'accder toute sorte de sources de donnes comme :


o o

un fichier (classes FileInputStream et FileOutputStream) une chane de caractres (classe StringBufferInputStream)

Programmer en java

Page 198

Dao Issiaka- 3me anne SI

o o o o o

un tableau d'octets (classes ByteArrayInputStream et ByteArrayOutputStream) un pipeline (classes PipedInputStream et PipedOutputStream) l'entre et les sorties standards (champs System.in, System.out et System.err ou FileDescriptor.in, FileDescriptor.out et FileDescriptor.err) une URL un socket.

Quel est l'intrt d'utiliser un flux de donnes pour accder une chane de caractres ou un tableau d'octets, alors qu'il sera impossible d'accder aux donnes dans un ordre quelconque ? La programmation oriente objet utilise par Java permet de manipuler les donnes entrantes ou sortantes avec les mmes classes, quelque soit le type de source de donnes : Pour lire les donnes d'un flux vous utilisez les mthodes des classes InputStream, FilterInputStream ou de ses classes drives, et pour crire dans un flux de donnes, vous utilisez les mthodes des classes OutputStream, FilterOutputStream ou de ses classes drives. Grce ceci, si vous crez une mthode qui effectue des traitements sur des donnes provenant d'un flux, elle acceptera n'importe quelle source de donnes, qu'elle soit en mmoire, dans un fichier ou sur Internet. Contrairement au C o il existe des fonctions diffrentes suivant le type de source de donnes (comme scanf (), fscanf (), sscanf ()), Java permet d'accder aux diffrents types de flux de donnes par les mmes mthodes.

Le mode d'accs alatoire permet d'accder aux donnes dans n'importe quel ordre. Vous pouvez tout moment aller en avant ou en arrire pour lire ou crire une partie des donnes. Ce mode d'accs est comparable celui utilis pour la mmoire vive (Random Access Memory elle aussi !). Du fait que certains types de source de donnes, comme les pipelines ou les URL ne peuvent supporter ce mode d'accs, son usage est plus spcifique et Java fournit uniquement la classe RandomAccessFile qui permet d'accder une position quelconque dans un fichier.

En C, la diffrence entre les deux types d'accs par flux de donnes (fonctions f... () de stdio.h) et accs alatoire (open (), read (), ...) n'apparat pas toujours de manire vidente. En effet, les mthodes ftell () et fseek () permettent de se dplacer une position quelconque dans un fichier, ce qui rend possible l'accs alatoire ! En Java, la diffrence est franche : Les classes InputStream et OutputStream et leurs classes drives ne permettent d'accder que sous forme de flux de donnes continus (avec ventuellement un retour en arrire quand c'est possible), au contenu d'un fichier ou d'une source de donne d'un autre type, et la classe RandomAccessFile permet d'accder alatoirement au contenu d'un fichier.

Programmer en java

Page 199

Dao Issiaka- 3me anne SI

Gestion de l'accs aux donnes avec les exceptions

Les exceptions en Java permettent de programmer de manire plus simple et surtout plus maintenable une squence d'instructions devant effectuer des entres/sorties. Ce type de programme effectue habituellement un grand nombre de contrles puisqu'il faut vrifier chaque accs un flux de donnes ou un fichier si tout s'est bien droul. Une programmation n'utilisant pas les exceptions est donc truffe de contrles aprs chaque instruction, ce qui en rduit la lisibilit. En Java, la plupart des mthodes d'entre/sortie dclenche une exception de classe IOException ou de ses drives EOFException, FileNotFoundException, InterruptedIOException ou UTFDataFormatException. Par exemple, une mthode qui va effectuer une lecture l'intrieur d'un fichier respectera gnralement le schma suivant :
import java.io.*; class Classe1 { void lireFichier (String fichier) { try { // Suite d'instructions accdant au fichier et // ne s'occupant pas de la gestion des erreurs // Tentative d'ouvrir un fichier // Lecture dans le fichier } catch (FileNotFoundException e) { // Exception dclenche si le fichier n'existe pas } catch (IOException e) { // Exception dclenche si un autre problme survient // pendant l'accs au fichier } finally { // Le bloc finally est toujours excut ce qui permet d'tre sr // que la fermeture du fichier sera effectue try { // Fermeture du fichier si le fichier a t ouvert } catch (IOException e) { // Exception dclenche si un problme survient pendant la fermeture } } }
Page 200

Programmer en java

Dao Issiaka- 3me anne SI

Manipulation des fichiers

Java permet de manipuler les fichiers situs sur le systme local (par opposition ceux auquel on accde via une URL), grce l'interface FilenameFilter et les classes File et FileDescriptor. On peut ajouter cette liste la classe java.awt.FileDialog, qui permet de choisir interactivement un fichier avec une boite de dialogue.
L'interface java.io.FilenameFilter

Cette interface est utilise pour permettre d'accepter ou de rejeter un fichier issu d'une liste. Une instance d'une classe implmentant cette interface est requise par les mthodes list () de la classe File et setFilenameFilter () de la classe FileDialog.
Mthode
public boolean accept (File dir, String name)

Cette mthode doit renvoyer true si le fichier name se trouvant dans le rpertoire dir est accept.
La classe java.io.File

Cette classe est utilise pour reprsenter un chemin d'accs au systme de fichiers local et effectuer des oprations sur celui-ci (autorisation d'accs en lecture/criture, liste des fichiers d'un rpertoire,...). Ce chemin d'accs peut dsigner un fichier ou un rpertoire. Les mthodes de cette classe peuvent ventuellement dclencher une exception SecurityException, si le gestionnaire de scurit actif leur interdit d'tre excute. Les applets fonctionnant dans un navigateur empchent gnralement notamment tout accs au systme de fichiers local donc n'imaginez pas une applet qui puisse accder aux fichiers du systme dans ce contexte. La description des chemins d'accs (sparateurs, description des disques,...) utilise les conventions du systme sur lequel est excute la Machine Virtuelle.
Champs
public static final String separator public static final char separatorChar

La chane ou le caractre utilis comme sparateur de fichier (gal gnralement / ou \).


public static final String pathSeparator public static final char pathSeparatorChar

La chane ou le caractre utilis comme sparateur de plusieurs chemins d'accs (gal gnralement ; ou :).
Constructeurs
public File (String path)

Programmer en java

Page 201

Dao Issiaka- 3me anne SI

Construit une instance de la classe File, partir d'un chemin d'accs path pouvant tre absolu ou relatif au rpertoire courant. path peut reprsenter un rpertoire ou un fichier suivant l'utilisation que vous voulez faire de cette nouvelle instance.
public File (String dir, String name) public File (File dir, String name)

Ces constructeurs permettent de crer une instance de la classe File, partir d'un rpertoire dir (chemin d'accs absolu ou relatif au rpertoire courant), et d'un nom de fichier ou de rpertoire name accessible partir du rpertoire dir.
Mthodes
public String getName ()

Renvoie le nom du fichier ou du rpertoire d'un chemin d'accs.


public String getPath ()

Renvoie le chemin d'accs d'un objet de classe File.


public String getAbsolutePath ()

Renvoie le chemin d'accs absolu.


public String getParent ()

Renvoie le chemin d'accs du rpertoire parent au chemin d'accs de l'objet de classe File, ou null s'il n'existe pas.
public public public public boolean boolean boolean boolean exists () throws SecurityException isFile () throws SecurityException isDirectory () throws SecurityException isAbsolute ()

Ces mthodes renvoient true, si le chemin d'accs existe, s'il correspond un fichier ou un rpertoire, ou si le chemin d'accs est absolu.
public boolean canRead () throws SecurityException public boolean canWrite () throws SecurityException

Ces mthodes renvoient true, si le chemin d'accs est accessible en lecture ou en criture.
public long lastModified () throws SecurityException

Renvoie la date de dernire modification du fichier. Cette date n'tant pas exprim dans la mme chelle que celle utilise par la classe Date, elle ne peut tre utilise que pour comparer des dates de diffrents fichiers.
public long length () throws SecurityException

Renvoie la taille du chemin d'accs reprsentant un fichier.

Programmer en java

Page 202

Dao Issiaka- 3me anne SI

public boolean delete () throws SecurityException public boolean renameTo (File dest) throws SecurityException

Ces mthodes permettent de supprimer ou de renommer un chemin d'accs, et renvoient true si l'opration s'est effectue correctement.
public boolean mkdir () throws SecurityException public boolean mkdirs () throws SecurityException

Ces mthodes permettent de crer le rpertoire ou les rpertoires reprsents par le chemin d'accs et renvoient true si l'opration s'est effectue correctement.
public String [ ] list () throws SecurityException public String [ ] list (FilenameFilter filter) throws SecurityException

Ces mthodes renvoient un tableau de chanes de caractres dont les lments sont les fichiers et les rpertoires contenus dans le rpertoire reprsent par un chemin d'accs. Les rpertoires . et .. sont exclus de cette liste. La seconde mthode permet d'appliquer le filtre filter pour ne rcuprer que les fichiers et les rpertoires autoriss par la mthode accept () de la classe de l'objet filter implmentant l'interface FilenameFilter.
public int hashCode () public boolean equals (Object obj) public String toString ()

Ces mthodes outrepassent celles de la classe Object, pour renvoyer un code de hash, comparer un chemin d'accs un objet ou renvoyer une chane de caractres gale au chemin d'accs.
La classe java.io.FileDescriptor

Cette classe final reprsente un descripteur de fichier. Une instance de cette classe permet de manipuler un fichier ouvert ou l'entre et les sorties standards. Les mthodes getFD () des classes FileInputStream, FileOutputStream et RandomAccessFile permettent d'obtenir une instance de la classe FileDescriptor et les champs static in, out et err permettant de manipuler l'entre standard, la sortie standard et la sortie standard d'erreurs sont de cette classe.
Champs
public static final FileDescriptor in public static final FileDescriptor out public static final FileDescriptor err

Ces champs reprsentent l'entre standard, la sortie standard ou la sortie standard des erreurs. Les champs de mme nom de la classe System sont construits partir de ces champs. Vous pouvez les utiliser pour accder l'entre et les sorties standards avec d'autres classes de gestion des flux de donnes.
Constructeur
public FileDescriptor ()

Programmer en java

Page 203

Dao Issiaka- 3me anne SI

Mthodes
public boolean valid ()

Gestion des flux de donnes

En Java, les classes dvolues aux flux de donnes permettent d'accder aux donnes soit en lecture grce aux classes qui drivent de la classe abstract InputStream, soit en criture grce aux classes qui drivent de la classe abstract OutputStream. A chaque type de flux de donnes (fichier, chane de caractres, tableau d'octets, pipeline) correspond une classe permettant de le manipuler, mais il existe aussi un ensemble de classes de filtres drives des classes abstract FilterInputStream et FilterOutputStream qui peuvent s'utiliser ensemble pour simplifier ou optimiser l'accs aux flux.
Accs un flux de donnes en lecture

L'accs en lecture un flux de donnes s'effectue grce aux classes qui drivent de la classe InputStream. Ces classes se divisent en deux catgories :

Les classes qui permettent de se lier un type de source de donnes spcifique : o la classe FileInputStream pour accder en lecture un fichier o la classe StringBufferInputStream pour parcourir une chane de caractres sous forme de flux de donnes o la classe ByteArrayInputStream pour parcourir un tableau d'octets sous forme de flux de donnes o la classe PipedInputStream pour accder un flux de donnes sous forme de pipeline o la classe SequenceInputStream pour accder aux donnes de plusieurs flux de donnes les uns aprs les autres.

La cration d'une instance d'une de ces classes permet d'accder sous forme d'un flux la source de donnes laquelle elle est ddie. En particulier, la cration d'un objet de classe FileInputStream permet d'ouvrir un fichier et d'en lire le contenu. En regardant les constructeurs de ces classes vous verrez qu'ils prennent en paramtre une instance de la classe reprsentant le type de sources de donnes qu'il manipule, comme le rsume le tableau suivant : Classes Paramtres des constructeurs
o o o

FileInputStream

Chemin d'accs un fichier (classe String) Fichier dcrit par une instance de la classe File Descripteur de fichier (classe FileDescriptor) Chane de caractres (classe String) Tableau d'octets (de type byte []) Aucun pour crer un pipeline d'entre
Page 204

StringBufferInputStream

ByteArrayInputStream PipedInputStream
Programmer en java

Dao Issiaka- 3me anne SI

Sortie d'un pipeline (classe PipedOutputStream) Une numration de flux de donnes de classe
InputStream

o SequenceInputStream o

Deux flux de donnes de classe InputStream

Une fois que vous avez cr une instance d'une de ces classes, vous pouvez appeler les mthodes de la classe InputStream, puisque toutes ces classes en hritent, comme dans l'application suivante qui permet d'crire sur la sortie standard les n premiers caractres d'un fichier. Recopiez-la dans un fichier LectureFichier.java, que vous compilez avec l'instruction javac LectureFichier.java pour ensuite l'excuter avec java ou Java Runner, grce l'instruction java LectureFichier nomFichier nombreCaracteres (par exemple java LectureFichier LectureFichier.java 100) :
import java.io.*; public class LectureFichier { // Mthode lance l'appel de l'instruction : // java LectureFichier nomFichier nombreCaracteres public static void main (String [ ] args) { try { // Ouverture du fichier pass en paramtre dans la ligne de commande InputStream fluxFichier = new FileInputStream (args [0]); // Lecture des n premiers octets du fichier. n est pass en paramtre byte contenuFichier [ ] = new byte [Integer.parseInt (args [1])]; fluxFichier.read (contenuFichier); // Ecriture sur la sortie standard des octets lus convertis // en une chane de caractres System.out.println (new String (contenuFichier, 0)); // Fermeture du fichier fluxFichier.close (); } catch (IOException e) { // Exception dclenche si un problme survient pendant l'accs au fichier System.out.println (e); } } }

L'accs aux trois autres types de sources de donnes restantes (l'entre standard, les sockets et un fichier via une URL) s'effectue diffremment :

Programmer en java

Page 205

Dao Issiaka- 3me anne SI

L'entre standard est accessible soit directement par le champ static in de la classe System, qui est de classe InputStream, soit par le champ static in de la classe FileDescriptor. Ce dernir champ tant lui-mme de classe FileDescriptor, la lecture sur l'entre standard peut dmarrer en crant une instance de classe FileInputStream, avec l'instruction new FileInputStream (FileDescriptor.in). L'accs en lecture aux sockets et un fichier accessible via une URL s'effectue grce la mthode getInputStream () des classes Socket et URLConnection, qui renvoie une instance d'une classe drive de InputStream.

Cette architecture est trs pratique : elle permet de crer par exemple des mthodes de traitement qui peuvent accder n'importe quel flux de donnes via une rfrence de classe InputStream qui leur est pass en paramtre. Mais les mthodes de lecture de cette classe paraissent d'un intrt trs limit : elle permettent de lire un ou plusieurs octets, c'est tout ! C'est l qu'intervient la seconde catgorie de classes drivant de InputStream, afin d'enrichir les mthodes de lecture des flux de donnes.

Les classes de filtre sur un flux de donnes qui drivent de la classe FilterInputStream : o La classe BufferedInputStream pour accder un flux de donnes en utilisant une zone mmoire tampon (buffer) o La classe DataInputStream pour lire dans un flux de donnes des donnes d'un des types primitifs de Java ou des chanes de caractres o La classe LineNumberInputStream pour permettre de compter les lignes d'un flux de donnes o La classe PushBackInputStream pour permettre d'accder un flux de donnes avec la possibilit de revenir en arrire d'un octet.

Contrairement aux classes ddies un type de source de donnes, les constructeurs de ces classes prennent tous en paramtre un objet de classe InputStream, qui est le flux de donnes sur lequel elles font une lecture avant d'effectuer des traitements supplmentaires. La classe InputStream tant la super classe de toutes les classes d'accs aux flux de donnes, vous pouvez donc passer en paramtre une instance de n'importe quelle classe qui en drive. Grce ce systme vous pouvez utiliser n'importe quel filtre sur une source de donnes, et mme cumuler les filtres les uns derrire les autres, comme le montre le schma suivant :

figure 11. Utilisation cumule de filtres

L'application suivante utilise ce schma de filtres pour numroter les lignes lues dans un fichier. Recopiez la dans un fichier NumerotationLigne.java, que vous compilez
Programmer en java Page 206

Dao Issiaka- 3me anne SI

avec l'instruction javac NumerotationLigne.java pour ensuite l'excuter avec java ou Java Runner, grce l'instruction java NumerotationLigne nomFichier (par exemple java NumerotationLigne NumerotationLigne.java) :
import java.io.*; public class NumerotationLigne { // Mthode lance l'appel de l'instruction : // java LectureFichier nomFichier public static void main (String [ ] args) { try { // Ouverture du fichier pass en paramtre dans la ligne de commande // avec un filtre utilisant un buffer InputStream fluxFichier = new BufferedInputStream ( new FileInputStream (args [0])); // Numrotation des lignes numeroterLigne (fluxFichier); fluxFichier.close (); } catch (IOException e) { // Exception dclenche si un problme survient pendant l'accs au fichier System.out.println (e); } } public static void numeroterLigne (InputStream flux) throws IOException { // Cration d'un filtre de dcompte des lignes LineNumberInputStream fluxLignes = new LineNumberInputStream (flux); // Ajout d'un filtre pour lire de manire plus pratique les caractres DataInputStream fluxLecture = new DataInputStream (fluxLignes); // Lecture des lignes du flux jusqu' la fin du flux String ligne; for (ligne = fluxLecture.readLine (); ligne != null; ligne = fluxLecture.readLine ()) // Ecriture sur la sortie standard de la ligne lue avec son numro de ligne System.out.println (String.valueOf (fluxLignes.getLineNumber ()) + " : " + ligne); } }

En poursuivant dans cette logique, il est simple de crer et d'utiliser vos propres filtres sur des flux de donnes en drivant vos nouvelles classes de la classe FilterInputStream ou d'une de ses classes drives.
Programmer en java Page 207

Dao Issiaka- 3me anne SI

La classe java.io.InputStream

Cette classe abstract est la super classe de toutes les classes qui permettent d'accder d'un flux de donnes en lecture (voir aussi le paragraphe prcdent).
Mthodes
public abstract int read () throws IOException

Lit un octet dans le flux de donnes. Renvoie -1 si la fin est atteinte.


public int read (byte [ ] tab) throws IOException

Lit tab.length octets dans le tableau tab. Si la fin est atteinte pendant la lecture, tab est remplit avec les octets lus. Renvoie le nombre d'octets lus ou -1 si la fin est atteinte.
public int read (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException

Lit length octets dans le tableau tab, en le remplissant partir de l'indice offset. Si la fin est atteinte pendant la lecture, tab est remplit avec les octets lus. Renvoie le nombre d'octets lus ou -1 si la fin est atteinte.
public long skip (long n) throws IOException

Saute n octets plus loin dans la lecture du flux de donnes. Renvoie le nombre d'octets effectivement sauts.
public int available () throws IOException

Renvoie le nombre d'octets que les mthodes read () peuvent actuellement lire sans bloquer le thread courant.
public void close () throws IOException

Ferme l'accs au flux de donnes.


public synchronized void mark (int readlimit)

Marque la position courante dans le flux de donnes, pour qu'un appel la mthode reset () provoque un retour en arrire cette position. readlimit permet de prciser le nombre d'octets maximum que l'on peut lire avant que la marque soit invalide, c'est--dire la taille maximum du retour en arrire qu'il est possible de faire.
public synchronized void reset () throws IOException

Repositionne la position courante dans le flux de donnes sur la dernire marque positionne par la mthode mark (). Si aucune marque n'a t positionne ou si la marque est invalide, une exception IOException est dclenche.
public boolean markSupported ()

Programmer en java

Page 208

Dao Issiaka- 3me anne SI

Renvoie true si le flux de donnes autorise l'utilisation des mthodes mark () et reset ().
Exemples

Applications LectureFichier, NumerotationLigne, ConcatenationFichiers et EchoServeur.


La classe java.io.FileInputStream

Cette classe qui drive de la classe InputStream permet d'ouvrir et d'accder un fichier en lecture, sous forme de flux de donnes.
Constructeurs
public FileInputStream (String path) throws SecurityException, FileNotFoundException public FileInputStream (File file) throws SecurityException, FileNotFoundException

Ces constructeurs permettent de crer une instance de classe FileInputStream partir du chemin d'accs un fichier path ou d'une instance de classe File.
public FileInputStream (FileDescriptor fdObj) throws SecurityException

Construit une instance de classe FileInputStream partir d'un descripteur de fichier fdObj.
Mthodes
public int read () throws IOException public int read (byte [ ] tab) throws IOException public int read (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException public long skip (long n) throws IOException public int available () throws IOException public void close () throws IOException

Mthodes de la classe InputStream outrepasses pour qu'elles s'appliquent la lecture d'un fichier.
public final FileDescriptor getFD () throws IOException

Permet d'obtenir un descripteur de fichier.


protected void finalize () throws IOException

Mthode de la classe Object outrepasse pour que le fichier ouvert la cration d'une instance de la classe FileInputStream soit ferm avant que le Garbage Collector n'intervienne pour dtruire cet objet. Le moment o intervient le Garbage Collector n'tant gnralement pas prvisible, il vaut mieux fermer soi-mme le fichier avec la mthode close (), pour viter d'en bloquer l'accs d'autres programmes.

Programmer en java

Page 209

Dao Issiaka- 3me anne SI

Exemples

Applications LectureFichier, NumerotationLigne et ConcatenationFichiers.


La classe java.io.StringBufferInputStream

Cette classe qui drive de la classe InputStream permet d'accder une chane de caractres en lecture, sous forme de flux de donnes.
Champs
protected String buffer protected int pos protected int count

Constructeur
public StringBufferInputStream (String s)

Construit une instance de classe StringBufferInputStream partir de la chane de caractres s.


Mthodes
public synchronized int read () public synchronized int read (byte [ ] tab, int offset, int length) throws IndexOutOfBoundsException public synchronized long skip (long n) public synchronized int available () public synchronized void reset ()

Mthodes de la classe InputStream outrepasses pour qu'elles s'appliquent l'accs une chane de caractres.
Exemple

Applet PaperBoardClient.
La classe java.io.ByteArrayInputStream

Cette classe qui drive de la classe InputStream permet d'accder un tableau d'octets en lecture, sous forme de flux de donnes.
Champs
protected byte [ ] buf protected int pos protected int count

Constructeurs
public ByteArrayInputStream (byte [ ] buf)

Construit une instance de classe ByteArrayInputStream partir du tableau d'octets buf.


public ByteArrayInputStream (byte [ ] buf, int offset, int length)

Programmer en java

Page 210

Dao Issiaka- 3me anne SI

Construit une instance de classe ByteArrayInputStream partir du tableau d'octets buf, o length octets seront lus partir de l'indice offset.
Mthodes
public synchronized int read () throws IndexOutOfBoundsException public synchronized int read (byte [ ] tab, int offset, int length) throws IndexOutOfBoundsException public synchronized long skip (long n) public synchronized int available () public synchronized void reset ()

Mthodes de la classe InputStream outrepasses pour qu'elles s'appliquent l'accs un tableau d'octets.
La classe java.io.PipedInputStream

Cette classe qui drive de la classe InputStream permet d'accder un pipeline en lecture, sous forme de flux de donnes.
Constructeurs
public PipedInputStream () public PipedInputStream (PipedOutputStream src) throws IOException

Mthodes
public void connect (PipedOutputStream src) throws IOException

Cre une connexion avec la sortie du pipeline src.


public synchronized int read () throws IOException public synchronized int read (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException public void close () throws IOException

Mthodes de la classe InputStream outrepasses pour qu'elles s'appliquent l'accs un pipeline.


La classe java.io.SequenceInputStream

Cette classe qui drive de la classe InputStream permet d'accder en lecture un ensemble de flux de donnes les uns aprs les autres.
Constructeurs
public SequenceInputStream (InputStream s1, InputStream s2)

Construit une instance de classe SequenceInputStream partir des flux de donnes s1 et s2. Les mthodes read () de cette classe liront le contenu des flux s1 et s2 l'un la suite de l'autre, comme s'il forme un seul flux.
public SequenceInputStream (Enumeration e)

Construit une instance de classe SequenceInputStream partir d'une numration de flux de donnes e. Les mthodes read () de cette classe liront le contenu de tous les
Programmer en java Page 211

Dao Issiaka- 3me anne SI

flux numrs par e, comme s'il forme un seul flux. Chacun des objets numrs par e doit donc tre de classe InputStream ou d'une de ses classes drives.
Mthodes
public int read () throws IOException public int read (byte [ ] buf, int pos, int length) throws IOException, IndexOutOfBoundsException public void close () throws IOException

Mthodes de la classe InputStream outrepasses pour qu'elles s'appliquent l'accs un ensemble de flux de donnes.
Exemple

Application ConcatenationFichiers.
La classe java.io.FilterInputStream

Cette classe qui drive de la classe InputStream est la super classe de toutes les classes utilises pour filtrer la lecture d'un flux de donnes. Vous pouvez utiliser les classes BufferedInputStream, DataInputStream, LineNumberInputStream ou PushBackInputStream qui en drivent mais aussi crer vos propres classes de filtre drivant de cette classe.
Champ
protected InputStream in

Le flux de donnes sur lequel la lecture est faite. Utilisez ce champ dans vos classes drives pour lire des donnes sur le flux filtrer.
Constructeur
protected FilterInputStream (InputStream in)

Le constructeur de cette classe est protected ce qui vous empche de l'instancier (cette classe n'a de toute faon aucun effet sur le flux de donnes ). Il est utilis par les classes drives.
Mthodes
public int read () throws IOException public int read (byte [ ] tab) throws IOException public int read (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException public long skip (long n) throws IOException public int available () throws IOException public void close () throws IOException public synchronized void mark (int readlimit) public synchronized void reset () throws IOException public boolean markSupported ()

Mthodes de la classe InputStream outrepasses pour qu'elles s'appliquent l'accs un flux de donnes filtr en lecture.

Programmer en java

Page 212

Dao Issiaka- 3me anne SI

Voici un exemple d'une classe de filtre drive de FilterInputStream qui a pour effet de mettre en majuscule toutes les lettres qui sont lus sur un flux de donnes :
class ToUpperCaseInputStream extends FilterInputStream { // Constructeur : appel du constructeur de la super classe public ToUpperCaseInputStream (InputStream flux) { super (flux); } public int read () throws IOException { // Lecture sur le flux d'un byte int car = in.read (); // Si la fin du fichier n'est pas atteinte et si le caractre // lu est une minuscule renvoyer la majuscule correspondante if ( car != -1 && Character.isLowerCase ((char)car)) return Character.toUpperCase ((char)car); return car; } public int read (byte tab [], int offset, int length) throws IOException { // Lecture sur le flux : read () renvoie le nombre d'octets lus int nbreOctetsLus = in.read (tab, offset, length); // Conversion de toutes les minuscules lues en majuscules for (int i = 0; i < nbreOctetsLus; i++) if (Character.isLowerCase ((char)tab [offset + i])) tab [offset + i] = (byte)Character.toUpperCase ((char)tab [offset + i]); return nbreOctetsLus; } }

Si dans l'application NumerotationLigne vous remplacez la ligne :


DataInputStream fluxLecture = new DataInputStream (fluxLignes);

par les lignes :


DataInputStream fluxLecture = new DataInputStream ( new ToUpperCaseInputStream (fluxLignes));

vous pourrez vous rendre compte du rsultat. Bien sr ce filtre ne peut s'appliquer qu' des fichiers textes.
La classe java.io.BufferedInputStream

Cette classe qui drive des classes FilterInputStream et InputStream permet de lire sur un flux de donnes en utilisant une zone mmoire tampon (buffer). Cette classe se charge de lire sur le flux de donnes un grande nombre d'octets qu'elle garde dans
Programmer en java Page 213

Dao Issiaka- 3me anne SI

un buffer. Tous les appels la mthode read () ultrieurs sur une instance de cette classe renvoient du coup le contenu de ce buffer tant qu'il y reste des octets lire. Ceci vite de faire une lecture physique sur le flux de donnes chaque appel de la mthode read () c'est pourquoi ce filtre est trs souvent utilis.
Champs
protected protected protected protected protected byte [ ] buf int count int pos int markpos int marklimit

Constructeurs
public BufferedInputStream (InputStream in) public BufferedInputStream (InputStream in, int size)

Ces constructeurs permettent de crer une instance de la classe BufferedInputStream dont la lecture sera effectue sur le flux de donnes in. size est la taille utilise pour crer le buffer (gal 2048 par dfaut).
Mthodes
public synchronized int read () throws IOException public synchronized int read (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException public synchronized long skip (long n) throws IOException public synchronized int available () throws IOException public synchronized void mark (int readlimit) public synchronized void reset () throws IOException public boolean markSupported ()

Mthodes de la classe FilterInputStream outrepasses pour qu'elles s'appliquent ce filtre.


Exemples

Applications NumerotationLigne, ConcatenationFichiers et PaperBoardServer. Applet PaperBoardClient.


L'interface java.io.DataInput

Cette interface implmente par les classes DataInputStream et RandomAccessFile dclare un ensemble de mthodes qui permettent de lire partir d'un flux de donnes ou d'un fichier des donnes de diffrents types : Soit un ensemble d'octets grce aux mthodes readFully (), soit une donne binaire reprsentant un type primitif Java, soit une chane de caractres.
Mthodes
public void readFully (byte [ ] tab) throws IOException

Cette mthode doit permettre de lire tab.length octets dans le tableau tab. Une exception EOFException est dclenche si la fin du fichier est atteinte, et une exception IOException est dclenche en cas d'autre erreur.
Programmer en java Page 214

Dao Issiaka- 3me anne SI

public void readFully (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException

Cette mthode doit permettre de lire length octets dans le tableau tab, en le remplissant partir de l'indice offset. Une exception EOFException est dclenche si la fin du fichier est atteinte, et une exception IOException est dclenche en cas d'autre erreur.
public public public public public public public public public public boolean readBoolean () throws IOException byte readByte () throws IOException int readUnsignedByte () throws IOException short readShort () throws IOException int readUnsignedShort () throws IOException char readChar () throws IOException int readInt () throws IOException long readLong () throws IOException float readFloat () throws IOException double readDouble () throws IOException

Ces mthodes doivent permettre de lire une valeur boolenne, un octet, un octet non sign (cod sur 8 bits et compris en 0 et 255), un short, un short non sign, un int, un long, un float ou un double. Une exception EOFException est dclenche si la fin du fichier est atteinte, et une exception IOException est dclenche en cas d'autre erreur.
public String readLine () throws IOException

Cette mthode doit permettre de lire tous les caractres jusqu'au premier symbole de retour la ligne. Elle manipule des caractres cods sur 8 bits et non sur 16 bits (Unicode). Renvoie la chane de caractres lue sans le caractre de retour la ligne la fin, ou null si la fin du fichier est atteinte.
public String readUTF () throws IOException

Cette mthode doit permettre de lire une chane de caractres qui est code au format UTF. Renvoie la chane de caractres lue ou null si la fin du fichier est atteinte.
public int skipBytes (int n) throws IOException

Cette mthode doit permettre de sauter n octets. Une exception EOFException est dclenche si la fin du fichier est atteinte, et une exception IOException est dclenche en cas d'autre erreur.
La classe java.io.DataInputStream

Cette classe qui drive des classes FilterInputStream et InputStream implmente l'interface DataInput, ce qui permet de lire partir d'un flux de donnes autres chose que des octets.
Constructeur
public DataInputStream (InputStream in)

Programmer en java

Page 215

Dao Issiaka- 3me anne SI

Construit une instance de la classe DataInputStream dont la lecture sera effectue sur le flux de donnes in.
Mthodes
public final void read (byte [ ] tab) throws IOException public final void read (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException

Mthodes de la classe FilterInputStream outrepasses pour qu'elles s'appliquent ce filtre.


public final void readFully (byte [ ] tab) throws IOException public final void readFully (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException public final boolean readBoolean () throws IOException public final byte readByte () throws IOException public final int readUnsignedByte () throws IOException public final short readShort () throws IOException public final int readUnsignedShort () throws IOException public final char readChar () throws IOException public final int readInt () throws IOException public final long readLong () throws IOException public final float readFloat () throws IOException public final double readDouble () throws IOException public final String readLine () throws IOException public final String readUTF () throws IOException public final static String readUTF (DataInput in) throws IOException public final int skipBytes (int n) throws IOException

Implmentation des mthodes de l'interface DataInput.


Exemple

Applications NumerotationLigne et PaperBoardServer. Applet PaperBoardClient.


La classe java.io.LineNumberInputStream

Cette classe qui drive des classes FilterInputStream et InputStream permet de compter le nombre de lignes lors de la lecture d'un flux de donnes. Une ligne se termine par le caractre '\n'. L'application NumerotationLigne utilise cette classe de filtre.
Constructeur
public LineNumberInputStream (InputStream in)

Construit une instance de la classe LineNumberInputStream dont la lecture sera effectue sur le flux de donnes in. Le numro de ligne est initialis 0.
Mthodes
public int read () throws IOException public int read (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException
Programmer en java Page 216

Dao Issiaka- 3me anne SI

public public public public

long skip (long n) throws IOException int available () throws IOException void mark (int readlimit) void reset () throws IOException

Mthodes de la classe FilterInputStream outrepasses pour qu'elles s'appliquent ce filtre.


public int getLineNumber () public void setLineNumber (int lineNumber)

Ces mthodes permettent d'interroger ou de modifier le numro de ligne courant.


Exemple

Application NumerotationLigne.
La classe java.io.PushBackInputStream

Cette classe qui drive des classes FilterInputStream et InputStream permet de simuler un retour en arrire d'un octet pendant la lecture d'un flux de donnes. La mthode unread () qui est utilise pour revenir en arrire d'un octet prend en paramtre l'octet renvoyer la lecture suivante. Cette classe est surtout utilise pour les analyseurs lexicaux et syntaxiques.
Champ
protected int pushBack

Constructeur
public PushbackInputStream (InputStream in)

Mthodes
public int read () throws IOException public int read (byte [ ] bytes, int offset, int length) throws IOException, IndexOutOfBoundsException public int available () throws IOException public boolean markSupported ()

Mthodes de la classe FilterInputStream outrepasses pour qu'elles s'appliquent ce filtre.


public void unread (int ch) throws IOException

Permet de simuler un retour en arrire d'un octet. L'octet ch est le prochain octet qui sera renvoy par un appel une mthode read (). Cette mthode dclenche une exception de classe IOException si deux appels unread () sont effectus la suite sans appel une des mthodes read () entre temps.
La classe java.io.StreamTokenizer

Cette classe permet d'numrer partir d'un flux de donnes un ensemble de souschanes ou de nombres spares en spcifiant diffrents dlimiteurs de manire plus
Programmer en java Page 217

Dao Issiaka- 3me anne SI

riche que la classe java.util.StringTokenizer. Cette classe peut tre utilise par exemple pour crire un compilateur. Seuls les caractres dont le code est compris entre 0 et 255 sont utilisables.
Champs
public public public public static static static static final final final final int int int int TT_EOF TT_EOL TT_NUMBER TT_WORD

Ces constantes reprsentent le type d'une sous-chane lue : la fin du flux de donnes, la fin d'une ligne, un nombre ou un mot.
public int ttype

Ce champ mmorise le type de la dernire sous-chane lue (avec pour valeur TT_EOF, TT_EOL, TT_NUMBER ou TT_WORD). Voir aussi la description des mthodes qui suivent.
public String sval public double nval

Ces champs mmorisent le dernier nombre (si ttype = TT_NUMBER) ou le dernier mot lu (si ttype = TT_WORD).
Constructeur
public StreamTokenizer (InputStream in)

Construit une instance de la classe StreamTokenizer avec comme flux de donnes d'entre in.
Mthodes
public void wordChars (int low, int high)

Permet d'ajouter tous les caractres dont le code est compris entre low et high l'ensemble des caractres utiliss pour construire un mot. La lecture d'un mot s'arrte quand un des caractres utiliss comme espace ou un caractre ordinaire sont lus. Quand un mot est lu, le champ ttype est gal TT_WORD et le champ sval contient le mot lu.
public void whitespaceChars (int low, int high)

Permet d'ajouter tous les caractres dont le code est compris entre low et high l'ensemble des caractres utiliss comme espace.
public void commentChar (int ch)

Permet d'ajouter le caractre de code ch l'ensemble des caractres dlimitant le dbut d'un commentaire de fin de ligne.
public void ordinaryChar (int ch) public void ordinaryChars (int low, int high)

Programmer en java

Page 218

Dao Issiaka- 3me anne SI

Permet d'ajouter le caractre de code ch ou tous les caractres dont le code est compris entre low et high l'ensemble des caractres ordinaires. Un caractre ordinaire n'appartient ni l'ensemble des caractres utiliss pour construire un mot ou un nombre, ni l'ensemble des caractres utiliss comme espace ou comme dlimiteurs de commentaire. Quand un caractre ordinaire est lu, le champ ttype a pour valeur ce caractre.
public void quoteChar (int ch)

Permet d'ajouter le caractre de code ch l'ensemble des caractres utiliss pour entourer une chane de caractres constante. Quand une chane de caractres constante est lue, le champ ttype est gal au dlimiteur et le champ sval contient la chane lue sans les dlimiteurs.
public void parseNumbers ()

Permet de spcifier que les nombres doivent tre lus en tant que tels, c'est--dire que l'appel de cette mthode mmorise que les chiffres 0 9, les caractres '.' et '-' appartiennent l'ensemble des caractres utiliss pour construire un nombre. Quand un nombre est lu, le champ ttype est gal TT_NUMBER et le champ nval contient le nombre lu.
public void resetSyntax ()

Remet zro la syntaxe dfinie avec les mthodes prcdentes.


public void eolIsSignificant (boolean flag)

Permet de spcifier que les caractres de fin de ligne sont significatifs ou non. Si flag est gal true, le champ ttype vaudra TT_EOL chaque fois qu'une fin de ligne est lue, sinon les caractres de fin de ligne seront considrs comme un espace.
public void slashStarComments (boolean flag)

Permet de spcifier si les commentaires Java /* ... */ sont significatifs ou non.


public void slashSlashComments (boolean flag)

Permet de spcifier si les commentaires Java de fin de ligne // ... sont significatifs ou non.
public void lowerCaseMode (boolean flag)

Permet de spcifier si tous les mots lus sont convertis en minuscules ou non.
public int nextToken () throws IOException

Lit dans le flux d'entre la sous-chane suivante en respectant la syntaxe dfinie grce aux mthodes prcdentes. Renvoie la valeur du champ ttype.
public void pushBack ()

Programmer en java

Page 219

Dao Issiaka- 3me anne SI

Permet de revenir d'une sous-chane en arrire une fois.


public int lineno ()

Renvoie le numro de ligne courant.


public String toString ()

Mthode de la classe Object, outrepasse pour qu'elle renvoie une description de la dernire sous-chane lue.
Exemple

Applet PaperBoardClient.
Accs un flux de donnes en criture De manire similaire l'accs un flux de donnes en lecture, l'accs un flux de donnes en criture s'effectue grce aux classes qui drivent de la classe OutputStream. Ces classes elles aussi se divisent en deux catgories :

Les classes qui permettent de se lier un type de source de donnes spcifique : o la classe FileOutputStream pour accder en criture un fichier o la classe ByteArrayOutputStream pour crire dans un tableau d'octets sous forme de flux de donnes o la classe PipedOutputStream pour accder un flux de donnes sous forme de pipeline

La cration d'une instance d'une de ces classes permet d'accder sous forme d'un flux la source de donnes laquelle elle est ddie. En particulier, la cration d'un objet de classe FileOutputStream permet d'ouvrir un fichier et d'y crire. En regardant les constructeurs de ces classes vous verrez qu'ils prennent en paramtre une instance de la classe reprsentant le type de sources de donnes qu'il manipule, comme le rsume le tableau suivant : Classes Paramtres des constructeurs
o o o

FileOutputStream

Chemin d'accs un fichier (classe String) Fichier dcrit par une instance de la classe File Descripteur de fichier (classe FileDescriptor) Aucun pour crer un tableau d'octets par dfaut Taille minimum du tableau d'octets Aucun pour crer un pipeline de sortie Entre d'un pipeline (classe PipedInputStream)

ByteArrayOutputStream

o o

PipedOutputStream

o o

Une fois que vous avez cr une instance d'une de ces classes, vous pouvez appeler les mthodes de la classe OutputStream, puisque toutes ces classes en hritent.
Programmer en java Page 220

Dao Issiaka- 3me anne SI

L'accs aux trois autres types de sources de donnes restantes (les sorties standards, les sockets et un fichier via une URL) s'effectue diffremment :
o

Les sorties standard et d'erreur sont accessibles soit directement par les champs static out et err de la classe System, qui sont de classe PrintStream, soit par les champs static out et err de la classe FileDescriptor. Ces dernirs champs tant eux-mme de classe FileDescriptor, l'criture sur les sorties standard peut dmarrer en crant une instance de classe FileOutputStream, par exemple avec l'instruction new FileOutputStream (FileDescriptor.out). L'accs en criture aux sockets et un fichier accessible via une URL s'effectue grce la mthode getOutputStream () des classes Socket et URLConnection, qui renvoie une instance d'une classe drive de InputStream.

Comme pour la classe InputStream, les mthodes d'criture de la classe OutputStream paraissent d'un intrt trs limit : elle permettent d'crire un ou plusieurs octets, c'est pourquoi il existe aussi une seconde catgorie de classes drivant de OutputStream, afin d'enrichir les mthodes d'criture sur les flux de donnes.

Les classes de filtre sur un flux de donnes qui drivent de la classe FilterOutputStream : o La classe BufferedOutputStream pour crire sur un flux de donnes en utilisant une zone mmoire tampon (buffer) o La classe DataOutputStream pour crire dans un flux de donnes des donnes d'un des types primitifs de Java ou des chanes de caractres o La classe PrintStream pour d'crire au format texte les types primitifs Java

Contrairement aux classes ddies un type de source de donnes, les constructeurs de ces classes prennent tous en paramtre un objet de classe OutputStream, qui est le flux de donnes sur lequel elles effectuent des traitements supplmentaires avant d'y crire. La classe OutputStream tant la super classe de toutes les classes d'criture sur les flux de donnes, vous pouvez donc passer en paramtre une instance de n'importe quelle classe qui en drive.

L'application suivante utilise les classes FileInputStream, SequenceInputStream, FileOutputStream et BufferedOutputStream pour effectuer la concatnation de plusieurs fichiers dans un fichier destination. Recopiez la dans un fichier ConcatenationFichiers.java, que vous compilez avec l'instruction javac ConcatenationFichiers.java pour ensuite l'excuter avec java ou Java Runner, grce l'instruction java ConcatenationFichiers nomFichier1 ... nomFichierN fichierDest (par exemple java ConcatenationFichiers ConcatenationFichiers.java NumerotationLigne.java resultat.java) :
import java.io.*; import java.util.Vector; public class ConcatenationFichiers { // Mthode lance l'appel de l'instruction : // java ConcatenationFichiers nomFichier1 ... nomFichierN nomFichierDest public static void main (String [ ] args)
Page 221

Programmer en java

Dao Issiaka- 3me anne SI

{ try { Vector ensembleFichiers = new Vector (); // Ajout ensembleFichiers de tous les flux de donnes avec buffer // correspondant chaque fichier d'entre pass en paramtres // (sauf le dernier paramtre) for (int i = 0; i < args.length - 1; i++) ensembleFichiers.addElement (new BufferedInputStream ( new FileInputStream (args [i]))); // Cration d'un ensemble de flux d'entre InputStream fluxEntree = new SequenceInputStream (ensembleFichiers.elements ()); // Ouverture en criture avec un buffer du fichier // pass en dernier paramtre dans la ligne de commande OutputStream fluxDestination = new BufferedOutputStream ( new FileOutputStream (args [args.length -1])); byte donnees [ ] = new byte [1000]; int nbreOctetsLus; // Lecture puis criture des donnes while ((nbreOctetsLus = fluxEntree.read (donnees)) != -1) fluxDestination.write (donnees, 0, nbreOctetsLus); // Fermeture des flux fluxDestination.close (); fluxEntree.close (); } catch (IOException e) { // Exception dclenche si un problme survient pendant l'accs aux fichiers System.out.println (e); } } } La classe java.io.OutputStream Cette classe abstract est la super classe de toutes les classes qui permettent d'crire

sur un flux de donnes en lecture (voir aussi le paragraphe prcdent).


Mthodes
public abstract void write (int b) throws IOException

Ecrit un octet sur le flux de donnes.


public void write (byte [ ] tab) throws IOException

Ecrit les octets du tableau tab sur le flux de donnes.


public void write (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException Ecrit length octets du tableau tab sur le flux de donnes, partir de l'indice offset. public void flush () throws IOException
Page 222

Programmer en java

Dao Issiaka- 3me anne SI

Ecrit physiquement sur le flux de donnes quand une zone tampon (buffer) est utilise.
public void close () throws IOException

Ferme l'accs au flux de donnes.


Exemple

Application ConcatenationFichiers et EchoServeur.

La classe java.io.FileOutputStream

Cette classe qui drive de la classe OutputStream permet d'ouvrir un fichier et d'y crire, sous forme de flux de donnes.
Constructeurs
public FileOutputStream (String path) throws SecurityException, FileNotFoundException public FileOutputStream (File file) throws SecurityException, FileNotFoundException Ces constructeurs permettent de crer une instance de classe FileOutputStream partir du chemin d'accs un fichier path ou d'une instance de classe File. Si le

fichier n'existe pas il est cr.


public FileOutputStream (FileDescriptor fdObj) throws SecurityException Construit une instance de classe FileInputStream partir d'un descripteur fdObj.

de fichier

Mthodes
public void write (int b) throws IOException public void write (byte [ ] tab) throws IOException public void write (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException public void close () throws IOException Mthodes de la classe OutputStream outrepasses pour qu'elles s'appliquent

l'criture dans un fichier.


public final FileDescriptor getFD () throws IOException

Permet d'obtenir un descripteur de fichier.


protected void finalize () throws IOException Mthode de la classe Object outrepasse pour que le fichier ouvert la cration d'une instance de la classe FileOutputStream soit ferm avant que le Garbage Collector

n'intervienne pour dtruire cet objet. Le moment o intervient le Garbage Collector n'tant gnralement pas prvisible, il vaut mieux fermer soi-mme le fichier avec la mthode close (), pour viter d'en bloquer l'accs d'autres programmes.

Exemple

Application ConcatenationFichiers.

La classe java.io.PipedOutputStream

Cette classe qui drive de la classe OutputStream permet d'accder un pipeline en criture, sous forme de flux de donnes.
Constructeurs
public PipedOutputStream (PipedInputStream snk) throws IOException public PipedOutputStream ()

Mthodes
public void connect (PipedInputStream snk) throws IOException Cre une connexion avec l'entre du pipeline snk. public void write (int b) throws IOException public void write (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException public void close () throws IOException

Programmer en java

Page 223

Dao Issiaka- 3me anne SI

Mthodes de la classe OutputStream outrepasses pour qu'elles s'appliquent l'criture sur un pipeline.

La classe java.io.ByteArrayOutputStream

Cette classe qui drive de la classe OutputStream permet d'crire dans un tableau d'octets, sous forme de flux de donnes. Ce tableau est cr par la classe et automatiquement agrandi s'il est plein.
Champs
protected byte [ ] buf protected int count

Constructeurs
public ByteArrayOutputStream () public ByteArrayOutputStream (int size)

Ces constructeurs permettent de crer une instance de classe ByteArrayOutputStream, dont le tableau sera au minimum de size octets (gal 32 par dfaut).
Mthodes
public synchronized void write (int b) public synchronized void write (byte [ ] tab, int offset, int length) throws IndexOutOfBoundsException Mthodes de la classe OutputStream outrepasses pour qu'elles s'appliquent

l'criture dans un tableau d'octets.


public int size ()

Renvoie le nombre courant d'octets crits dans le tableau.


public synchronized void reset () Remet l'index courant dans le tableau 0 sans allouer un public synchronized byte [ ] toByteArray () public String toString ()

nouveau tableau.

Renvoie un tableau d'octets copie des octets crits dans le tableau interne. Mthode de la classe Object, outrepasse pour qu'elle renvoie les octets crits dans le tableau sous forme de chane de caractres.
public String toString (int hibyte)

Renvoie les octets crits dans le tableau sous forme de chane de caractres, dont chaque caractre Unicode a hibyte pour partie haute.
public synchronized void writeTo (OutputStream out) throws IOException Ecrit sur le flux de donnes out les octets crits dans le tableau. La classe java.io.FilterOutputStream Cette classe qui drive de la classe OutputStream est la super classe de toutes

les classes utilises pour filtrer l'criture sur un flux de donnes. Vous pouvez utiliser les classes BufferedOutputStream, DataOutputStream ou PrintStream qui en drivent mais aussi crer vos propres classes de filtre drivant de cette classe (voir aussi la classe ToUpperCaseInputStream comme exemple de filtre).
Champ
protected OutputStream out

Constructeur
public FilterOutputStream (OutputStream out)

Mthodes
public void write (int b) throws IOException public void write (byte [ ] tab) throws IOException public void write (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException public void flush () throws IOException
Page 224

Programmer en java

Dao Issiaka- 3me anne SI

public void close () throws IOException

Mthodes de la classe OutputStream outrepasses pour qu'elles s'appliquent l'accs un flux de donnes filtr en criture.

La classe java.io.BufferedOutputStream

Cette classe qui drive des classes FilterOutputStream et OutputStream permet d'crire sur un flux de donnes en utilisant une zone mmoire tampon (buffer). Lors d'un appel la mthodes write (), les octets sont stocks dans le buffer. Le buffer est crit finalement sur le flux de donnes une fois qu'il est plein ou lors d'un appel la mthode flush (). Ceci vite de faire une criture physique sur le flux de donnes chaque appel de la mthode write () c'est pourquoi ce filtre est trs souvent utilis.
Champs
protected byte [ ] buf protected int count

Constructeurs
public BufferedOutputStream (OutputStream out) public BufferedOutputStream (OutputStream out, int size)

Ces constructeurs permettent de crer une instance de la classe BufferedOutputStream dont l'criture sera effectue sur le flux de donnes out. size est la taille utilise pour crer le buffer (gal 512 par dfaut).
Mthodes
public synchronized void write (int b) throws IOException public synchronized void write (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException public synchronized void flush () throws IOException Mthodes de la classe FilterOutputStream outrepasses pour qu'elles s'appliquent

ce filtre.
Exemple

Application ConcatenationFichiers et PaperBoardServer. Applet PaperBoardClient.

L'interface java.io.DataOutput

Cette interface implmente par les classes DataOutputStream et RandomAccessFile dclare un ensemble de mthodes qui permettent d'crire dans un flux de donnes ou dans un fichier des donnes de diffrents types : Soit un ensemble d'octets grce aux mthodes write (), soit une donne binaire reprsentant un type primitif Java, soit une chane de caractres. Les donnes crites grce ces mthodes sont lisibles grce aux mthodes de l'interface DataInput, quelque soit le systme sur lequel les donnes ont t crites. Le codage binaire des nombres tant souvent diffremment d'un systme l'autre, ceci permet de crer des flux de donnes portables.
Mthodes
public void write (int b) throws IOException

Cette mthode doit permettre d'crire un octet.


public void write (byte [ ] tab) throws IOException

Cette mthode doit permettre d'crire les octets du tableau tab.


public void write (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException Cette mthode doit permettre d'crire length octets du tableau tab, partir de l'indice offset. public void writeBoolean (boolean v) throws IOException public void writeByte (int v) throws IOException public void writeShort (int v) throws IOException
Page 225

Programmer en java

Dao Issiaka- 3me anne SI

public public public public public

void void void void void

writeChar (int v) throws IOException writeInt (int v) throws IOException writeLong (long v) throws IOException writeFloat (float v) throws IOException writeDouble (double v) throws IOException

Ces mthodes doivent permettre d'crire une valeur boolenne, un octet, un short, un caractre Unicode, un int, un long, un float ou un double.
public void writeBytes (String s) throws IOException Cette mthode doit permettre d'crire la chane de caractres s. Elle crit

les caractres

en les codant sur 8 bits et non sur 16 bits (Unicode).


public void writeChars (String s) throws IOException Cette mthode doit permettre d'crire la chane de caractres s, comme une

suite de

caractres Unicode.
public void writeUTF (String s) throws IOException

Cette mthode doit permettre d'crire au format UTF la chane de caractres s.

La classe java.io.DataOutputStream

Cette classe qui drive des classes FilterOutputStream et OutputStream implmente l'interface DataOutput, ce qui permet d'crire sur un flux de donnes autres chose que des octets.
Champ
protected int written

Constructeur
public DataOutputStream (OutputStream out) Construit une instance de la classe DataOutputStream sur le flux de donnes out.

dont l'criture sera effectue

Mthodes
public synchronized void write (int b) throws IOException public synchronized void write (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException public final void writeBoolean (boolean v) throws IOException public final void writeByte (int v) throws IOException public final void writeShort (int v) throws IOException public final void writeChar (int v) throws IOException public final void writeInt (int v) throws IOException public final void writeLong (long v) throws IOException public final void writeFloat (float v) throws IOException public final void writeDouble (double v) throws IOException public final void writeBytes (String s) throws IOException public final void writeChars (String s) throws IOException public final void writeUTF (String str) throws IOException Implmentation des mthodes de l'interface DataOutput. La mthode write (byte [ ] tab) est implmente par la classe FilterOutputStream. public void flush () throws IOException Mthodes de la classe FilterOutputStream outrepasses pour qu'elles s'appliquent

ce filtre.
public final int size ()

Renvoie le nombre d'octets crits sur le flux de donnes depuis la cration du filtre.

La classe java.io.PrintStream

Cette classe qui drive des classes FilterOutputStream et OutputStream permet d'crire au format texte les types primitifs Java. Elle est trs souvent utilise via le champ System.out qui est justement de classe PrintStream.
Page 226

Programmer en java

Dao Issiaka- 3me anne SI

Contrairement aux mthodes des autres classes crivant sur un flux de donnes, les mthodes de la classe PrintStream ne dclenchent jamais d'exceptions de classe IOException. Si une erreur survient pendant l'criture sur le flux de donnes, un champ private prend la valeur true et la mthode checkError () renvoie cette valeur. Ce systme qui peut paratre peu contraignant pour l'utilisateur de la classe PrintStream et laisser passer des erreurs plus facilement, comporte malgr tout un avantage majeur : il permet par exemple d'crire sur la sortie standard avec le champ System.out sans tre oblig d'utiliser un bloc try ... catch.

Constructeurs
public PrintStream (OutputStream out) public PrintStream (OutputStream out, boolean autoflush) Ces constructeurs permettent de crer une instance de la classe PrintStream dont l'criture sera effectue sur le flux de donnes out. autoflush permet de prciser si un appel la mthode flush () doit tre effectu chaque retour la ligne (gal false par dfaut).

Mthodes
public void public void throws public void public void write (int b) write (byte [ ] tab, int offset, int length) IndexOutOfBoundsException flush () close () de la classe FilterOutputStream outrepasses pour qu'elles

Mthodes ce filtre.

s'appliquent

public boolean checkError () Appelle la mthode flush () et renvoie true

si une erreur est survenue pendant un

appel aux autres mthodes de cette classe.


public public public public public public public public public void print (Object obj) synchronized void print (String s) synchronized void print (char [ ] tab) void print (boolean b) void print (char c) void print (int i) void print (long l) void print (float f) void print (double d)

Ces mthodes permettent d'crire au format texte un objet, une chane de caractre, un tableau de caractres, une valeur boolenne, un caractre, un int, un long, un float ou un double, sur le flux de donnes. Le texte crit pour l'objet obj est la chane de caractre renvoye par l'appel obj.toString ().
public public public public public public public public public synchronized synchronized synchronized synchronized synchronized synchronized synchronized synchronized synchronized void void void void void void void void void println println println println println println println println println (Object obj) (String s) (char [ ] tab) (boolean b) (char c) (int i) (long l) (float f) (double d)

Ces mthodes effectuent les mmes oprations que le groupe prcdent, puis crivent un retour la ligne sur le flux de donnes.
public void println ()

Programmer en java

Page 227

Dao Issiaka- 3me anne SI

Ecrit un retour la ligne sur le flux de donnes. Cette classe offre l'quivalent des fonctions printf () du C, mais ne comporte pas toute la richesse des formats de donnes disponibles avec printf (). Pour information, une mthode printf () quivalente celle du C et autorisant une liste d'arguments variable a t ajoute classe PrintStream de Java 5.0.

Exemples

Les applications Banque, LectureFichier, NumerotationLigne, ConcatenationFichiers, TestExpression et PaperBoardServer utilisent le champ System.out et la mthode println (). Applet PaperBoardClient.

Gestion de l'accs alatoire aux fichiers

Java fournit la classe RandomAccessFile pour accder alatoirement au contenu d'un fichier en lecture ou en criture (voir aussi le dbut de ce chapitre).
La classe java.io.RandomAccessFile Cette classe qui implmente les interfaces DataInput et DataOuput, permet d'accder alatoirement un fichier en mode lecture/criture, ou uniquement en mode lecture. Constructeurs
public RandomAccessFile (String path, String mode) throws SecurityException, IOException, IllegalArgumentException public RandomAccessFile (File file, String mode) throws SecurityException, IOException, IllegalArgumentException

Ces constructeurs permettent d'ouvrir le fichier reprsent par son chemin d'accs path ou par une instance de la classe File. Si mode est gal "rw" (read/write) il est possible d'crire ou de lire dans le fichier ouvert et le fichier est cr s'il n'existe pas. Si mode est gal "r" (read), le fichier est accessible uniquement en lecture et par consquent l'utilisation des mthodes d'criture write...() de cette classe dclenchera une exception de classe IOException.
Mthodes
public final FileDescriptor getFD () throws IOException

Permet d'obtenir un descripteur de fichier.


public long getFilePointer () throws IOException

Renvoie la position courante dans le fichier.


public void seek (long pos) throws IOException

Dplace la position courante en pos dans le fichier.


public long length () throws IOException
Programmer en java Page 228

Dao Issiaka- 3me anne SI

Renvoie la taille courante du fichier.


public void close () throws IOException

Ferme l'accs au fichier.


public abstract int read () throws IOException

Lit un octet dans le flux de donnes. Renvoie -1 si la fin est atteinte.


public int read (byte [ ] tab) throws IOException

Lit tab.length octets dans le tableau tab. Si la fin est atteinte pendant la lecture, tab est remplit avec les octets lus. Renvoie le nombre d'octets lus ou -1 si la fin est atteinte.
public int read (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException

Lit length octets dans le tableau tab, en le remplissant partir de l'indice offset. Si la fin est atteinte pendant la lecture, tab est remplit avec les octets lus. Renvoie le nombre d'octets lus ou -1 si la fin est atteinte.
public int skipBytes (int n) throws IOException

Mthode de l'interface DataInput implmente pour qu'elle dplace de n octets la position courante dans le fichier. n peut tre positif ou ngatif (pour revenir en arrire). Renvoie n.
public final void readFully (byte [ ] tab) throws IOException public final void readFully (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException public final boolean readBoolean () throws IOException public final byte readByte () throws IOException public final int readUnsignedByte () throws IOException public final short readShort () throws IOException public final int readUnsignedShort () throws IOException public final char readChar () throws IOException public final int readInt () throws IOException public final long readLong () throws IOException public final float readFloat () throws IOException public final double readDouble () throws IOException public final String readLine () throws IOException public final String readUTF () throws IOException

Implmentation des autres mthodes de l'interface DataInput.


public void write (int b) throws IOException public void write (byte [ ] tab) throws IOException public void write (byte [ ] tab, int offset, int length) throws IOException, IndexOutOfBoundsException public final void writeBoolean (boolean v) throws IOException public final void writeByte (int v) throws IOException public final void writeShort (int v) throws IOException public final void writeChar (int v) throws IOException
Programmer en java Page 229

Dao Issiaka- 3me anne SI

public public public public public public public

final final final final final final final

void void void void void void void

writeInt (int v) throws IOException writeLong (long v) throws IOException writeFloat (float v) throws IOException writeDouble (double v) throws IOException writeBytes (String s) throws IOException writeChars (String s) throws IOException writeUTF (String str) throws IOException

Implmentation des mthodes de l'interface DataOutput.

Programmer en java

Page 230

Dao Issiaka- 3me anne SI

Les accs au rseau


Accs via une URL L'architecture client-serveur Accs via les sockets Accs via les datagrams

Ce chapitre dcrit le package java.net de Java 1.0 qui rassemble les classes permettant de grer les accs rseau via une URL ou par les sockets.
Accs via une URL

Les accs au rseau peuvent se faire plusieurs niveaux en Java. Le niveau le plus simple permet d'accder un fichier sur le rseau grce son URL (Uniformed Resource Locator) : Contrairement au chemin d'accs classique un fichier dont la notation varie d'un systme l'autre (c:\fichier.txt, /usr/unCompte/fichier.txt), une URL permet de dsigner un fichier de manire uniforme quelque que soit le systme qui hberge ce fichier. Mme si vous ne la connaissiez pas sous ce nom, l'adresse d'un site Internet est une URL : http://www.javasoft.com/index.html, http://www.eteks.com/coursjava/net10.html#AccesURL sont des exemples d'URL. De quoi est compose une URL ?

Une chane reprsentant le protocole utiliser pour accder au fichier (http, ftp, file, mailto,...), suivi du symbole :. Le nom de l'hte qui fournit le service recherch (www.yahoo.fr). Cet hte correspond une machine. Eventuellement un numro de port sur la machine de l'hte prcd du symbole :. Le chemin d'accs au fichier recherch sur l'hte. Les rpertoires ventuels de ce chemin d'accs sont spars par le symbole /. Pour les fichiers HTML, le nom du fichier peut tre suivi d'une rfrence une ancre l'intrieur du fichier prcd du symbole #.

Une URL peut reprsenter un fichier mais aussi de manire plus gnrale une ressource. Par exemple, une ressource peut tre un programme renvoyant une image ou le rsultat d'un accs une base de donnes. La plupart des programmes auxquels on accde sur un site Internet via une URL utilise le modle CGI (Common Gateway Interface). Ce standard dfinit comment appeler un programme et lui transmettre ses paramtres. Par exemple, http://www.hit-parade.com/hp.asp?site=a15740 est un programme CGI appel avec la valeur a15740 pour le paramtre site. Ce programme renvoie l'image du site hit-parade.com.

Programmer en java

Page 231

Dao Issiaka- 3me anne SI

Java permet d'accder au fichier ou la ressource reprsents par une URL sous forme de flux de donnes, grce aux deux classes URL et URLConnection.
La classe java.net.URL

Cette classe final permet de manipuler une URL sous forme d'un objet constant. Les constructeurs de cette classe pouvant ventuellement dclencher une exception de classe MalformedURLException, la cration d'une nouvelle instance de classe URL doit tre programme dans un bloc try ... catch. L'objet cr ne garantit pas que le fichier existe mais seulement que l'URL mmorise par l'objet est correctement forme et que le protocole spcifi est gr par la Machine Virtuelle Java. Les objets de cette classe sont utiliss pour accder sous forme de flux de donnes au fichier correspondant, mais aussi par certaines mthodes de la classe Applet pour obtenir l'URL d'un document HTML, lire une image ou un fichier son.
Constructeurs
public URL (String protocol, String host, int port, String file) throws MalformedURLException public URL (String protocol, String host, String file) throws MalformedURLException

Ces constructeurs permettent de crer un objet de classe URL partir du protocole protocol, l'hte host, le port port et le chemin d'accs file d'une URL.
public URL (String spec) throws MalformedURLException

Construit une instance de classe URL partir de la chane de caractres spec reprsentant une URL.
public URL (URL context, String spec) throws MalformedURLException

Construit une instance de classe URL partir d'une URL existante context et de la chane de caractres spec. Si spec dcrit entirement une URL (avec protocole, hte, fichier,...) , l'URL context est ignore et l'objet cr correspond l'URL spec. Sinon, context est utilis comme base complte par les informations fournies dans spec, pour construire le nouvel objet de classe URL (spec peut par exemple dsign un fichier dans un sous rpertoire diffrent).
Mthodes
public public public public public String getProtocol () String getHost () int getPort () String getFile () String getRef ()

Ces mthodes permettent d'interroger le protocole, l'hte, le port, le chemin d'accs au fichier et la rfrence mmorise dans une instance de la classe URL. Si le port n'a pas t prcis en paramtre du constructeur, la valeur -1 est renvoye.
public boolean sameFile (URL other)

Programmer en java

Page 232

Dao Issiaka- 3me anne SI

Renvoie true si other dsigne la mme URL que l'objet sur lequel est invoque cette mthode. Les rfrences mmorises par les objets ne sont pas prises en compte pour la comparaison.
public String toExternalForm ()

Renvoie une chane de caractres correspondant l'URL mmorise par un objet de classe URL.
public final InputStream openStream () throws IOException

Ouvre en lecture la connexion avec une URL, et renvoie une instance de la classe InputStream pour accder aux donnes sous forme de flux de donnes.
public final Object getContent () throws IOException

Renvoie un objet correspondant au contenu du fichier reprsent par un objet de classe URL. Par exemple, si le fichier est une image, cette mthode renverra une instance d'une classe drive de la classe Image.
public URLConnection openConnection () throws IOException

Ouvre une connexion avec une URL, et renvoie une instance de la classe URLConnection qui permet d'obtenir toute sorte de renseignements (dates, en-tte,...) sur le fichier correspondant l'URL.
public static synchronized void setURLStreamHandlerFactory (URLStreamHandlerFactory fac) throws SecurityException

Si le gestionnaire de scurit l'autorise, cette mthode permet de positionner un gestionnaire de cration de flux de donnes pour chacun des protocoles reconnus. Cette mthode static ne peut tre appele qu'une seule fois. Par dfaut, la Machine Virtuelle Java reconnat un certain nombre de protocoles (voir l'exemple qui suit).
public int hashCode () public boolean equals (Object obj) public String toString ()

Ces mthodes outrepassent celles de la classe Object, pour renvoyer un code de hash, comparer un objet de classe URL un objet ou renvoyer une chane de caractres correspondant l'URL. L'application suivante permet de tester si la Machine Virtuelle Java accepte ou non les 4 protocoles les plus communment utiliss : http, ftp, file et mailto. Recopiez-la dans un fichier TestProtocole.java, que vous compilez avec l'instruction javac TestProtocole.java pour ensuite l'excuter avec java ou Java Runner, grce l'instruction java TestProtocole :
import java.net.*; public class TestProtocole {
Programmer en java Page 233

Dao Issiaka- 3me anne SI

public static void main (String [] args) { // Tableau avec 4 URL tester String urlTest [] = {"http://www.eteks.com/index.html", "ftp://www.eteks.com/index.html", "file://C//java/bin/java.exe", "mailto:puybaret@imaginet.fr"}; for (int i = 0; i < urlTest.length; i++) try { // Cration d'une URL URL url = new URL (urlTest [i]); System.out.println ("URL : " + url + " correctement form\u00e9e\n" + " et protocole " + url.getProtocol () + " reconnu."); } catch (MalformedURLException e) { // URL incorrect ou protocole inconnu System.out.println ("URL : " + urlTest [i] + " incorrect\n" + " ou protocole non reconnu\n" + "(Exception " + e + ")."); } } }

Autre exemple

Applets HelloFromNet et BoutonsNavigation.


La classe java.net.URLConnection

Cette classe abstract gre la connexion avec une URL. Une instance d'une classe drivant de cette classe peut tre obtenue grce la mthode openConnection () de la classe URL. Les mthodes de cette classe permettent de crer un flux de donnes pour lire et/ou d'crire dans le fichier dsign par une URL, mais aussi d'obtenir toute sorte d'information sur ce fichier (sa date de dernire modification, sa taille, son type,...).
Champs
protected protected protected protected protected protected protected URL url boolean doInput boolean doOutput boolean allowUserInteraction boolean useCaches long ifModifiedSince boolean connected

Ces champs protected sont utiliss par les classes drives de la classe URLConnection.
Constructeur
protected URLConnection (URL url)

Mthodes
public URL getURL ()

Programmer en java

Page 234

Dao Issiaka- 3me anne SI

Renvoie l'URL avec laquelle la connexion est faite.


public InputStream getInputStream () throws IOException public OutputStream getOutputStream () throws IOException

Ces mthodes renvoient un flux de donnes en lecture ou en criture partir d'une connexion une URL. Une exception de classe UnknownServiceException (drivant de la classe IOException) est dclenche si le protocole interdit l'accs en lecture ou en criture cette URL.
public int getContentLength ()

Renvoie la taille du fichier avec lequel la connexion est faite ou 0 si cette taille n'est pas connue.
public String getContentType () public String getContentEncoding ()

Renvoie le type du contenu et son codage ou null si ces renseignements ne sont pas connus
public Object getContent () throws IOException

Renvoie un objet correspondant au contenu du fichier.


public long getDate () public long getLastModified () public long getExpiration ()

Renvoie la date laquelle le fichier a t envoy, sa date de dernire modification et sa date d'expiration ou 0 si ces renseignements ne sont pas connus.
public public public public public String getHeaderField (String name) int getHeaderFieldInt (String name, int default) long getHeaderFieldDate (String name, long default) String getHeaderFieldKey (int n) String getHeaderField (int n)

Ces mthodes renvoient les renseignements correspondant aux cls contenues dans l'entte d'un fichier
public public public public boolean boolean boolean boolean getDoInput () getDoOutput () getUseCaches () getAllowUserInteraction ()

Ces mthodes renvoient true, s'il est possible de lire ou d'crire sur une connexion, si la connexion utilise le cache ou si elle autorise d'interagir avec l'utilisateur (pour lui demander par exemple un mot de passe). Par dfaut, une connexion est ouverte en lecture.
public long getIfModifiedSince ()

Renvoie la dure de validit du fichier sur la connexion est faite.

Programmer en java

Page 235

Dao Issiaka- 3me anne SI

public String getRequestProperty (String key)

Renvoie la valeur associe la cl key par lequel une requte est reconnue.
public abstract void connect () throws IOException

Les classes drives de la classe URLConnection doivent implmenter cette mthode pour raliser la connexion avec une URL.
public public public public public public void void void void void void setDoInput (boolean doinput) setDoOutput (boolean dooutput) setUseCaches (boolean usecaches) setAllowUserInteraction (boolean allowuserinteraction) setIfModifiedSince (long ifmodifiedsince) setRequestProperty (String key, String value)

Ces mthodes permettent d'autoriser l'accs en lecture ou en criture un fichier, l'utilisation du cache,... Elles ne peuvent pas tre appeles quand la connexion est dj ouverte.
boolean getDefaultUseCaches () void setDefaultUseCaches (boolean defaultusecaches) static boolean getDefaultAllowUserInteraction () static void setDefaultAllowUserInteraction (boolean defaultallowuserinteraction) public static String getDefaultRequestProperty (String key) public static void setDefaultRequestProperty (String key, String value) protected static String guessContentTypeFromName (String fname) protected static String guessContentTypeFromStream (InputStream is) throws IOException public static synchronized void setContentHandlerFactory (ContentHandlerFactory fac) throws SecurityException public public public public

Si le gestionnaire de scurit l'autorise, cette mthode permet de positionner un gestionnaire de cration d'objets reprsents dans un fichier suivant leur type mime, diffrent de celui fourni par dfaut. Cette mthode static ne peut tre appele qu'une seule fois.
public String toString ()

Mthode de la classe Object outrepasse pour renvoyer une chane de caractres dcrivant la connexion. Voici un exemple simple d'applet qui lit le texte contenu dans le fichier accessible l'URL http://www.eteks.com/classes/hello.txt pour l'afficher l'cran :

et le programme Java correspondant ( copier dans un fichier dnomm HelloFromNet.java et invoqu partir d'un fichier HTML) :
import import import import java.applet.Applet; java.awt.Graphics; java.net.*; java.io.*;
Page 236

Programmer en java

Dao Issiaka- 3me anne SI

public class HelloFromNet extends Applet { String texteLu; // Mthode appele par le systme l'initialisation de l'applet public void init () { try { // Cration de l'URL http://www.eteks.com/classes/hello.txt URL urlFichierHello = new URL ("http", "www.eteks.com", "/classes/hello.txt"); // Ouverture d'une connexion et rcupration d'un flux d'entre URLConnection connexion = urlFichierHello.openConnection (); InputStream fluxFichier = connexion.getInputStream (); // Lecture du contenu du flux d'entre byte contenuFichier [ ] = new byte [connexion.getContentLength ()]; int octetsLus = fluxFichier.read (contenuFichier); texteLu = new String (contenuFichier, 0, 0, octetsLus); // Fermeture de la connexion fluxFichier.close (); } catch (Exception e) { texteLu = "Probleme..."; } } // Mthode appele par le systme pour mettre jour le dessin de l'applet public void paint (Graphics gc) { if (texteLu != null) // Affichage du texte lu gc.drawString(texteLu, 10, 20); } }

La classe java.net.URLEncoder

L'unique mthode encode () de cette classe est utile si vous voulez crer un formulaire en Java et en envoyer les rsultats au serveur pour tre trait par exemple par un programme CGI. Cette mthode transforme une chane de caractres au format x-www-form-urlencoded, c'est--dire que tous les espaces sont remplacs par le signe + et tous les caractres diffrents des lettres de l'alphabet, des chiffres et du caractre _ par leur code hexadcimal prcd du symbole %.
Mthode
public static String encode (String s)

Vous n'aurez normalement pas utiliser les interfaces et les classes qui suivent, car la Machine Virtuelle Java fournit et gre automatiquement un certain nombre de protocoles et la
Programmer en java Page 237

Dao Issiaka- 3me anne SI

cration d'objet en fonction du contenu d'un fichier. Ces classes sont utilises indirectement par les mthodes de la classes URLConnection.
L'interface java.net.URLStreamHandlerFactory

Cette interface est implmente par les classes dsirant grer l'accs sous forme de flux de donnes un ou plusieurs protocoles. Elle est utilise comme paramtre de la mthode setURLStreamHandlerFactory () de la classe URL, pour modifier le gestionnaire par dfaut.
Mthode
public URLStreamHandler createURLStreamHandler (String protocol)

Cette mthode doit renvoyer un objet dont la classe drive de la classe abstract URLStreamHandler ou null si le protocole protocol est refus ou n'est pas reconnu par ce gestionnaire. L'objet renvoy doit pouvoir crer un flux de donnes partir du protocole protocol et d'une URL.
La classe java.net.URLStreamHandler

Cette classe abstract est la super classe de toutes les classes qui gre la cration d'un flux de donnes partir d'un protocole donn et d'une URL. La Machine Virtuelle Java fournit un ensemble de classes pour un certain nombre de protocoles. Ces classes sont utilises par dfaut si la mthode setURLStreamHandlerFactory () de la classe URL n'a pas t appele pour changer de gestionnaire de cration de flux de donnes.
Constructeur
public URLStreamHandler ()

Mthodes
protected abstract URLConnection openConnection (URL url) throws IOException

Cette mthode doit ouvrir un connexion avec l'URL url et renvoyer une instance d'une classe drivant de la classe abstract URLConnection pour permettre d'accder l'URL sous forme de flux de donnes.
protected void parseURL (URL url, String spec, int start, int limit)

Analyse la chane de caractres spec reprsentant une URL entre les caractres start et limit (exclu), pour complter l'instance url de la classe URL. Cette mthode analyse la chane spec en respectant la syntaxe du protocole http, et donc s'attend ce que start dsigne le caractre suivant le symbole : du protocole, et limit le caractre # prcdant la rfrence une ancre. Outrepassez cette mthode si vous voulez qu'elle analyse diffremment la chane spec.
protected String toExternalForm (URL url)

Renvoie une chane de caractres correspondant l'URL mmorise par url.


protected void setURL (URL url, String protocol, String host,
Programmer en java Page 238

Dao Issiaka- 3me anne SI

int port, String file, String ref)

Permet de modifier le protocole protocol, l'hte host, le port port, le chemin d'accs au fichier file et la rfrence ref mmoriss par l'objet url.
L'interface java.net.ContentHandlerFactory

Cette interface est implmente par les classes dsirant grer le contenu d'un fichier suivant leur type mime (par exemple image/gif ou text/plain). Elle est utilise comme paramtre de la mthode setContentHandlerFactory () de la classe URLConnection, pour modifier le gestionnaire par dfaut.
Mthode
public ContentHandler createContentHandler (String mimetype)

Cette mthode doit renvoyer un objet dont la classe drive de la classe abstract ContentHandler. Cet objet doit pouvoir crer un objet correspondant au contenu d'un fichier de type mime mimetype.
La classe java.net.ContentHandler

Cette classe abstract est la super classe de toutes les classes qui gre la cration d'un objet correspondant au contenu d'un fichier d'un type mime donn. La Machine Virtuelle Java fournit un ensemble de classes pour certains types mime. Ces classes sont utilises par dfaut si la mthode setContentHandlerFactory () de la classe URLConnection n'a pas t appele pour changer de gestionnaire de cration d'objet.
Constructeur
public ContentHandler ()

Mthode
public abstract Object getContent (URLConnection urlc) throws IOException

Cette mthode doit renvoyer un objet correspondant au contenu du fichier avec lequel la connexion urlc a t tablie.
L'architecture client-serveur

Grce une URL, l'accs un fichier ou une ressource est gr de manire simple : que le fichier soit sur un disque local ou sur Internet, il vous suffit de respecter les rgles de construction d'une URL et le tour est jou. Mais Java permet aussi de grer des accs rseau plus complexe, pour raliser par exemple un dialogue entre deux ordinateurs d'un rseau. Ce dialogue est bas sur l'architecture clientserveur, dont voici un rappel des grands principes.
Principe

Comme la programmation oriente objet, l'architecture client-serveur est une technologie informatique trs utilise actuellement. Elle est surtout connue dans le monde des SGBD (Systme de Gestion de Base de Donnes),
Programmer en java Page 239

Dao Issiaka- 3me anne SI

mais elle s'applique aussi d'autres domaines comme Internet, les terminaux X utiliss sous UNIX (que l'on appelle aussi serveurs X). Son principe est assez simple mais ce sont des exemples qui vous permettront de mieux comprendre comment cette architecture s'applique concrtement. Comme son nom l'indique, le client-serveur implique qu'il y ait au moins deux acteurs en jeu, un client et un serveur, qui communiquent entre eux, souvent travers un rseau. Un serveur est un programme ou par extension une machine programme pour rendre toujours le mme service, suite une requte qui lui est adresse. Un client est un programme ou par extension une machine qui demande un serveur un service, en lui adressant une requte. Gardez-bien toujours en tte ce mot service, car c'est souvent en pensant qui rend service l'autre que vous arriverez dterminer qui est le client du serveur dans une architecture clientserveur.
Exemples d'utilisation

figure 12. Architecture client-serveur sur Internet

Internet que vous utilisez en ce moment, est un bon exemple d'architecture client-serveur : Les sites que vous consultez sont souvent appels aussi des serveurs, car les programmes qui les grent rendent toujours le mme service au client qu'est votre navigateur. Quel service ? Le programme d'un serveur est en attente que vous lui demandiez une page du site que vous voulez visualiser. Quand votre requte lui parvient, il vous renvoie cette page. Votre navigateur de son ct est un client du serveur car il lui demande une page qu'il visualise une fois tlcharge. Le client-serveur est souvent utilis pour accder de grandes bases de donnes utilises par plusieurs utilisateurs. La base de donnes est stocke sur une machine utilise comme serveur. Le programme sur ce serveur a pour mission de rpondre des requtes SQL que lui adressent des clients. Les requtes SQL que le serveur reoit lui permettent de modifier ou d'interroger la base de donnes qu'il gre, et de renvoyer au client la rponse attendue. Le client est gnralement une machine de type PC dont le programme est utilis pour mettre en page les rponses reues du serveur.

Programmer en java

Page 240

Dao Issiaka- 3me anne SI

Le principale avantage de cette architecture est qu'elle permet de sparer compltement le serveur qui gnralement gre le stockage de donnes, du client qui cherche y accder. Ainsi, dans le cas d'Internet, il est possible d'avoir des navigateurs qui tournent sous diffrents systmes et mme des logiciels de navigation diffrents sur un mme systme. Tous ces navigateurs sont des clients du serveur d'un site Internet auquel ils peuvent accder simultanment. A l'oppos, le serveur d'un site Internet peut fonctionner sur n'importe quel systme, que vous n'avez d'ailleurs pas connatre. Ce qu'il compte, c'est qu'il rponde correctement vos requtes, quand vous voulez voir une page hberge sur ce site. La cl de vote qui permet ce systme de fonctionner sans que le client et le serveur n'aient savoir comment ils fonctionnent l'un l'autre est l'utilisation d'un protocole commun. Ce protocole tablit la norme que doit respecter le client et le serveur pour communiquer entre eux : comment tablir une communication, comment un client doit envoyer une requte un serveur et comment un serveur doit rpondre la requte du client.
Protocoles

Deux types de protocoles peuvent tre utiliss sur Internet :

TCP (Transport Control Protocol) : Sans que vous ayez le savoir, ce protocole est utilis par d'autres protocoles de plus haut niveau comme HTTP (HyperText Transfer Protocol) et FTP (File Transfer Protocol). Ce protocole permet d'tablir une connexion entre deux machines (un client et un serveur) : Une fois la connexion tablie, les programmes client et serveur peuvent s'changer des donnes, et ce protocole garantit que les donnes mises d'une machine arriveront sur l'autre, et dans l'ordre o elles ont t mises. Ainsi suite une requte, le transfert d'un fichier peut tre effectu en tant assur de son intgrit l'arrive. Les classes URL et URLConnection utilisent TCP implicitement et permettent un client d'accder ne manire simple un fichier ou une ressource d'un serveur Internet. Ces classes sont gnralement suffisantes pour les communications utilisant les protocoles comme HTTP ou FTP. Mais Java permet aussi de programmer des communications quelconques entre un client et un serveur en utilisant TCP, grce aux classes Socket et ServerSocket. UDP (User Datagram Protocol) : A l'oppos de TCP, ce protocole est utilis pour transmettre des donnes entre deux machines sans garantir que ces donnes arriveront destination et dans l'ordre o elles ont t mises. Ces donnes sont envoyes par paquets appels aussi des datagrammes. Ce protocole vite la contrainte d'avoir tablir et maintenir une connexion entre les deux machines. Il peut tre utile par exemple pour un serveur envoyant les tics d'une horloge sur requte d'un client. Si un datagramme contenant une heure donne ne parvient pas au client ou son acheminement est retard, il est inutile de s'en inquiter car au tic suivant le serveur renverra un nouveau datagramme contenant l'heure actualise. Si ces datagrammes arrivent dans le dsordre, il suffira au client de ne pas tenir compte des datagrammes contenant une heure obsolte. Les classes DatagramSocket et DatagramPacket permet d'utiliser UDP pour programmer ce type de communication entre un client et un serveur.

Programmer en java

Page 241

Dao Issiaka- 3me anne SI

Port

Les serveurs des sites auxquels vous vous connectez sur Internet sont accessibles grce un mnmonique qui est le nom de la machine hte (par exemple java.sun.com, www.yahoo.fr). Chaque mnmonique est associ un identifiant numrique reprsentant la machine hte qui hberge un serveur. Cet identifiant est un nombre 32 bits appel adresse IP que l'on note gnralement sous la forme d'une suite de 4 nombres spars par des points (par exemple 194.51.83.2) : certains navigateurs affichent dans la barre d'tat l'adresse IP de l'hte d'un site, quand vous essayez de vous connectez ce site. Chaque machine relie Internet possde une adresse IP diffrente qui permet de la dsigner de manire unique sur le rseau Internet. Tous les systmes d'exploitation permettent de faire fonctionner plusieurs programmes en mme temps sur une machine. Si plusieurs serveurs sont hbergs sur une mme machine, ils vont devoir partager l'accs physique au rseau sur cette machine. Un deuxime niveau d'identification est donc ncessaire pour dsigner le programme avec lequel vous voulez vous connecter sur une machine donne. A chaque programme dsirant communiquer sur Internet est associ un port unique, qui est un nombre 16 bits compris entre 0 et 65535. Les ports dont le nombre est compris entre 0 et 1023 sont rservs des services particuliers et ne doivent pas tre utiliss par les serveurs que vous programmez. Globalement, un programme est identifi sur Internet par l'adresse IP de la machine sur lequel il fonctionne et le numro du port auquel il est associ.
Accs via les sockets

Chaque extrmit d'une connexion entre un client et un serveur est appele un socket. Un socket est une reprsentation logique du point de branchement d'un programme au rseau. Pour programmer une architecture client serveur utilisant le protocole TCP (Transport Control Protocol), il vous faut raliser, grce aux classes ServerSocket et Socket qui suivent, un programme faisant office de serveur sur une machine hte et un autre utilis comme client sur une autre machine. Pour vous permettre de tester les programmes serveur et client sur la mme machine, le client peut essayer de se connecter la machine localhost qui reprsente la machine locale.

figure 13. Utilisation des sockets en Java

Programmer en java

Page 242

Dao Issiaka- 3me anne SI

Comme le montre la figure prcdente, le programme serveur doit crer une instance de la classe ServerSocket en prcisant le numro de port sur lequel il attend les demandes de connexion des programmes clients. Le serveur appelle ensuite la mthode accept () de cette classe pour se mettre en attente de demande de connexion. Une fois qu'un client s'est connect, une instance de la classe Socket est renvoye. Le serveur peut alors grce au mthodes de cette classe obtenir des flux de donnes en lecture et en criture pour communiquer avec le programme client. Le programme client de son ct se connecte un programme serveur en crant une instance de la classe Socket, en prcisant l'adresse Internet de la machine hte et le numro de port sur lequel le serveur attend les demandes de connexions. Comme pour le programme serveur, une fois qu'il a obtenu une instance de cette classe, il peut obtenir des flux de donnes en lecture et en criture. Chacun des programmes serveurs et clients pouvant envoyer et lire des donnes, tout est alors prt pour communiquer des donnes dans les deux sens entre les programmes. Pour un fonctionnement correct, il suffit que quand le client crit sur le flux de donnes de sortie de son socket, le serveur soit en lecture sur le flux de donnes d'entre de son socket et inversement.
La classe java.net.InetAddress

Cette classe final permet de manipuler l'adresse Internet d'une machine hte. Elle est utilise par les classes ServerSocket, Socket et DatagramPacket.
Mthodes
public static synchronized InetAddress getByName (String host) throws UnknownHostException

Renvoie une instance de la classe InetAddress reprsentant l'adresse Internet de la machine host.
public static synchronized InetAddress [ ] getAllByName (String host) throws UnknownHostException

Renvoie toutes les adresses Internet de la machine host.


public static InetAddress getLocalHost () throws UnknownHostException

Renvoie une instance de la classe InetAddress reprsentant l'adresse Internet de la machine locale. Trs pratique pour tester sur une mme machine les programmes client et serveur. Equivalent getByName (null) ou getByName ("localhost").
public String getHostName ()

Renvoie le nom de la machine hte.


public byte [ ] getAddress ()

Programmer en java

Page 243

Dao Issiaka- 3me anne SI

Renvoie l'adresse IP mmorise par une instance de la classe InetAddress. Le tableau renvoy contient les 4 nombres d'une adresse IP qui sont spares par des points (par exemple 194.51.83.2).
public int hashCode () public boolean equals (Object obj) public String toString ()

Ces mthodes outrepassent celles de la classe Object, pour renvoyer un code de hash, comparer un objet de classe InetAddress un objet ou renvoyer une chane de caractres dcrivant une adresse Internet.
Exemples

Applets EchoClient et PaperBoardClient.


La classe java.net.Socket

Cette classe final permet de manipuler un socket. Vous pouvez en obtenir une instance de deux manires diffrentes, suivant que vous ralisez le programme client ou le serveur :

Quand un programme client essaye de se connecter un serveur, il doit crer une instance de la classe Socket grce l'un des constructeurs de cette classe (par exemple new Socket ("www.eteks.com", 26197)). Chacun de ses constructeurs prend comme paramtres l'adresse Internet de la machine hte du serveur et le numro de port sur lequel le serveur est en attente de connexion avec un client. Quand un programme serveur en attente sur la mthode accept () reoit une demande de connexion avec un programme client, cette connexion est cre puis accept () renvoie une instance de la classe Socket.

Une fois obtenue une instance de la classe Socket, il est possible d'obtenir ct client comme ct serveur un flux de donnes d'entre et un flux de donnes de sortie, grce aux mthodes getInputStream () et getOutputStream (). Ces mthodes renvoient des instances de classes drivant des classes InputStream et OutputStream dont les mthodes permettent de de lire et d'envoyer des donnes entre le client et le serveur.
Constructeurs
public Socket (String host, int port) throws UnknownHostException, IOException public Socket (String host, int port, boolean stream) throws IOException

Ces constructeurs permettent de crer une instance de la classe Socket et d'obtenir pour un programme client une connexion avec le programme serveur de la machine host en attente sur le port port. Si stream (gal true par dfaut) est gale false, un socket de datagrammes est cr.
public Socket (InetAddress address, int port) throws IOException public Socket (InetAddress address, int port, boolean stream) throws IOException

Programmer en java

Page 244

Dao Issiaka- 3me anne SI

Ces constructeurs fonctionnent comme les deux premiers, mais prennent comme premier paramtre une instance de la classe InetAddress.
Mthodes
public InputStream getInputStream () throws IOException public OutputStream getOutputStream () throws IOException

Ces mthodes permettent d'obtenir un flux de donnes en lecture ou un flux de donnes en criture, pour communiquer avec le socket distant.
public synchronized void close () throws IOException

Ferme la connexion avec le socket distant.


public InetAddress getInetAddress () public int getPort ()

Ces mthodes renvoient l'adresse Internet et le port du socket distant auquel le socket est connect.
public int getLocalPort ()

Renvoie le port local sur lequel le socket est connect.


public static synchronized void setSocketImplFactory (SocketImplFactory fac) throws IOException, SecurityException

Si le gestionnaire de scurit l'autorise, cette mthode permet de positionner un gestionnaire de cration de sockets, diffrent de celui fourni par dfaut. Cette mthode static ne peut tre appele qu'une seule fois.
public String toString ()

Mthode de la classe Object outrepasse pour renvoyer une chane de caractres dcrivant le socket.
Exemples

Applications EchoServer et PaperBoardServer. Applets EchoClient et PaperBoardClient.


La classe java.net.ServerSocket

Cette classe final est utilise par un programme serveur pour grer l'attente de demande de connexion d'un programme client sur un port de la machine hte du serveur.
Constructeurs
public ServerSocket (int port) throws IOException public ServerSocket (int port, int count) throws IOException

Programmer en java

Page 245

Dao Issiaka- 3me anne SI

Ces constructeurs permettent de crer un socket de serveur en attente sur le port port. Pour autoriser la connexion anonyme d'un client, utilisez un port est gal 0. count (gal 50 par dfaut) permet de spcifier le nombre maximum de demande de connexions en attente que le serveur termine d'excuter la mthode accept ().
Mthodes
public Socket accept () throws IOException

Attend la demande de connexion d'un programme client, et renvoie un socket une fois la connexion tablie.
public void close () throws IOException

Ferme le socket du serveur.


public InetAddress getInetAddress () public int getLocalPort ()

Ces mthodes renvoient l'adresse Internet et le port local sur lequel le socket du serveur est connect.
public static synchronized void setSocketFactory (SocketImplFactory fac) throws IOException

Si le gestionnaire de scurit l'autorise, cette mthode permet de positionner un gestionnaire de cration de socket de serveur, diffrent de celui fourni par dfaut. Cette mthode static ne peut tre appele qu'une seule fois.
public String toString ()

Mthode de la classe Object outrepasse pour renvoyer une chane de caractres dcrivant le serveur.
Exemples

Applications EchoServer et PaperBoardServer.


Le client serveur d'cho

Ce premier exemple de client serveur se dcompose en deux programmes : une application pour le serveur et une applet pour le client. Vous pouvez tester cet exemple sur votre ordinateur car l'applet se connecte sur le serveur de la machine locale, o vous pouvez lancer l'application serveur. Cet exemple ralise une opration trs simple d'cho : le serveur ne fait que renvoyer en l'tat les donnes que le client lui envoie, jusqu' ce qu'il rencontre un retour chariot. Il faut lancer l'application du serveur avant de lancer l'applet du client. Voici le programme du serveur. Recopiez-le dans un fichier EchoServer.java, que vous compilez avec l'instruction javac EchoServer.java pour ensuite l'excuter avec java ou Java Runner, grce l'instruction java EchoServer : :

Programmer en java

Page 246

Dao Issiaka- 3me anne SI

import java.net.*; import java.io.*; public class EchoServer { public static void main (String args []) { try { // Cration d'un serveur sur le port 13267 ServerSocket server = new ServerSocket (13267); // Attente de la connexion d'un client Socket socket = server.accept (); System.out.println ("Connexion sur le socket : " + socket); // Rcupration des flux d'entrs et de sortie InputStream fluxEntree = socket.getInputStream (); OutputStream fluxSortie = socket.getOutputStream (); char caractereLu; // Renvoie de chaque caractre lu au client // jusqu' ce que ce caractre soit un retour chariot while ((caractereLu = (char)fluxEntree.read ()) != '\n') fluxSortie.write (caractereLu); server.close (); } catch (IOException e) { System.out.println (e); } } }

Une fois programm le serveur, il faut raliser un programme client. Celui-ci est une applet simple qui envoie au serveur tous les caractres saisis au clavier et affiche les caractres lus partir du serveur sous la forme d'une chane de caractres ( mettre dans un fichier EchoClient.java) :
import import import import java.applet.Applet; java.awt.*; java.net.*; java.io.*;

public class EchoClient extends Applet { String texteLu = ""; InputStream fluxEntree; OutputStream fluxSortie; // Mthode appele par le systme l'initialisation de l'applet public void init () { try { // Rcupration de l'adresse de l'hte local InetAddress adresse = InetAddress.getLocalHost (); // Ouverture d'une connexion sur le port 13267 de cet hte Socket socket = new Socket (adresse, 13267);
Programmer en java Page 247

Dao Issiaka- 3me anne SI

// Rcupration des flux d'entrs et de sortie fluxEntree = socket.getInputStream (); fluxSortie = socket.getOutputStream (); } catch (IOException e) { texteLu = "Probleme de connexion"; } } // Mthode appele par le systme pour mettre jour le dessin de l'applet public void paint (Graphics gc) { gc.drawString (texteLu, 10, 20); } // Mthode appele par le systme quand une touche du clavier est enfonce public boolean keyDown (Event evt, int key) { if (fluxSortie != null) try { // Envoie au serveur du caractre lu puis relecture fluxSortie.write(key); char caractereLu = (char)fluxEntree.read (); // Ajout du caractre et redessin de l'applet texteLu += caractereLu; repaint(); } catch (IOException e) { } return true; } }

Voici un exemple de code HTML qui vous permettre d'appeler cette applet ( mettre par exemple dans un fichier EchoClient.html et excuter avec appletviewer ou Applet Runner, grce l'instruction appletviewer EchoClient.html) :
<applet code="EchoClient" width=200 height=30> </applet>

Le paper board Internet

Ce deuxime exemple de client serveur beaucoup plus labor se dcompose toujours en deux programmes : une application pour le serveur et une applet pour le client. Chaque utilisateur visualisant cette applet peut partager un dessin qu'il dessine avec la souris, avec toutes les autres personnes connectes au serveur. Pour saisir un lment de dessin, il suffit de dplacer la souris en maintenant son bouton enfonc. Pour permettre plusieurs connexions simultanes de clients au serveur, ce dernier lance un thread grant chaque connexion. Chacun de ces threads a pour mission d'attendre les requtes de chacun des clients. Quatre types diffrents de requtes sont gres :

Programmer en java

Page 248

Dao Issiaka- 3me anne SI

AJOUT : Le client envoie cette requte pour indiquer au serveur que l'utilisateur de l'applet client a saisi une nouvelle suite de points (polyline), avec la souris. Cette requte est suivie d'une liste de valeurs entires reprsentant les couples x y de chacun des points de la polyline. Le serveur ajoute cette liste l'ensemble des polylines qu'il a dj reues. LISTE : Le client envoie cette requte pour demander au serveur l'ensemble des polylines actuellement enregistres sur le serveur. Le serveur lui renvoie chacune des listes de points spare par des tabulations (caractre '\t'). Envoye intervalle rgulier, cette requte permet chacun des clients du serveur de mettre jour sa zone d'affichage en affichant toutes les polylines qu'ont saisies l'ensemble des utilisateurs de l'applet client connecte au serveur. CONNEXION : Le client envoie cette requte pour demander le nombre actuelle de clients connects au serveur. Ce dernier renvoie ce nombre. FIN : Le client envoie cette requte pour indiquer au client son intention de se dconnecter du serveur.

L'applet du client ne peut fonctionner que si le serveur du paper board est en marche sur www.eteks.com. Si l'applet ci-dessous vous indique au moins une connexion, tout est OK ! Si vous tes connects Internet via un proxy, il est possible que cela ne puisse pas fonctionner. Trouvez d'autres personnes pour se connecter au serveur et partagez vos dessins : Plus on est de fous, plus on rit !....

Voici le programme du serveur qui tourne sur www.eteks.com (A mettre dans un fichier PaperBoardServer.java, et excut avec java ou Java Runner) :
import java.net.*; import java.io.*; import java.util.*; public class PaperBoardServer implements Runnable { public static int port = 26197; public static String requeteFin = "FIN"; public static String requeteListe = "LISTE"; public static String requeteAjout = "AJOUT"; public static String requeteConnexion = "CONNEXION"; private static ServerSocket serveur; public static void main (String args []) { if (lancerServeur () == null) System.exit (-1); } // lancerServeur () peut tre appele par une servlet // pour viter de lancer une Machine Virtuelle supplmentaire // sur le serveur o est hberg le site public static ServerSocket lancerServeur () { if (serveur == null) try { // Cration d'un serveur sur le port 26197

Programmer en java

Page 249

Dao Issiaka- 3me anne SI

serveur = new ServerSocket (port); // Lancement d'un thread d'attente de connexion new Thread (new PaperBoardServer ()).start (); } catch (IOException e) { System.out.println (e); return null; } return serveur; } public void run () { try { // Boucle sans fin d'attente de connexion while (true) { // Attente de la connexion d'un client Socket socket = serveur.accept (); // Dmarrage d'un nouveau thread pour grer la connexion new ThreadSocket (socket).start (); } } catch (IOException e) { System.out.println (e); } finally { try { // Fermeture du serveur serveur.close (); serveur = null; } catch (IOException e) { System.out.println (e); } } } } class ThreadSocket extends Thread { static private Vector listePolylines = new Vector (100); static private int connexions; private Socket socket; public ThreadSocket (Socket socket) { this.socket = socket; } public void run () { try {
Programmer en java Page 250

Dao Issiaka- 3me anne SI

// Rcupration des flux d'entrs et de sortie DataInputStream fluxEntree = new DataInputStream ( new BufferedInputStream (socket.getInputStream ())); PrintStream fluxSortie = new PrintStream ( new BufferedOutputStream (socket.getOutputStream ()), true); // Augmentation du nombre de connexions au serveur connexions++; String chaineLue; // Lecture sur le flux d'entre tant que la requte FIN n'est pas arrive while ( (chaineLue = fluxEntree.readLine ()) != null && !chaineLue.equals (PaperBoardServer.requeteFin)) { if (chaineLue.startsWith (PaperBoardServer.requeteListe)) { // Si la liste des polylines est demande, elles sont // renvoyes spares par des tabulations for (Enumeration e = listePolylines.elements (); e.hasMoreElements (); ) fluxSortie.print (e.nextElement ().toString () + '\t'); fluxSortie.write ('\n'); } else if (chaineLue.equals (PaperBoardServer.requeteConnexion)) { // Renvoi du nombre de connexions au serveur fluxSortie.print (String.valueOf (connexions)); fluxSortie.write ('\n'); } else if (chaineLue.startsWith (PaperBoardServer.requeteAjout)) { // Si le vecteur arrive saturation, il est vide // (ceci pour viter que le dessin ne devienne trop dense) if (listePolylines.size () == listePolylines.capacity ()) listePolylines.removeAllElements (); // La nouvelle polyline reue est ajoute la liste listePolylines.addElement ( chaineLue.substring (PaperBoardServer.requeteAjout.length ())); } } fluxEntree.close (); fluxSortie.close (); socket.close (); } catch (IOException e) { System.out.println (e); } connexions--; } }

Une fois programm le serveur, il faut raliser un programme client. Celui-ci est l'applet cidessus qui envoie au serveur les polylines saisies par l'utilisateur, et demande au serveur

Programmer en java

Page 251

Dao Issiaka- 3me anne SI

toutes les secondes la liste courante de toutes les polylines que celui-ci mmorise ( mettre dans un fichier PaperBoardClient.java) :
import import import import import java.applet.Applet; java.awt.*; java.net.*; java.io.*; java.util.*;

public class PaperBoardClient extends Applet implements Runnable { private String message; private Socket socket; private DataInputStream fluxEntree; private PrintStream fluxSortie; private Vector private Polygon private int listePolylines = new Vector (100); polylineCourante; connexions;

// Mthode appele par le systme l'affichage de l'applet public void start () { setBackground (Color.white); try { // Rcupration de l'adresse de l'hte www.eteks.com InetAddress adresse = InetAddress.getByName ("www.eteks.com"); // Ouverture d'une connexion sur le port 26197 de cet hte socket = new Socket (adresse, PaperBoardServer.port); // Rcupration des flux d'entrs et de sortie fluxEntree = new DataInputStream ( new BufferedInputStream (socket.getInputStream ())); fluxSortie = new PrintStream ( new BufferedOutputStream (socket.getOutputStream ()), true); // Lancement d'un thread qui interroge intervalle rgulier // la liste des polylines enregistres sur le serveur new Thread (this).start (); } catch (IOException e) { message = "Probleme de connexion avec le serveur"; } } // Mthode appele par le systme la disparition de l'applet public void stop () { try { // Envoi d'une requte FIN et fermeture des flux fluxSortie.println (PaperBoardServer.requeteFin); fluxSortie.close (); fluxEntree.close (); socket.close (); } catch (IOException e)
Programmer en java Page 252

Dao Issiaka- 3me anne SI

{ } fluxSortie = null; } public void run () { try { while (fluxSortie != null) { // Envoi d'une requte CONNEXION pour rcuprer le // nombre de clients connects au serveur fluxSortie.print (PaperBoardServer.requeteConnexion); fluxSortie.write ('\n'); message = fluxEntree.readLine () + " connexions"; // Envoi d'une requte LISTE pour rcuprer // la liste de toutes les polylines du serveur fluxSortie.print (PaperBoardServer.requeteListe); fluxSortie.write ('\n'); String liste = fluxEntree.readLine (); // Vidange de la liste pour la remettre jour listePolylines.removeAllElements (); StreamTokenizer tokens = new StreamTokenizer ( new StringBufferInputStream (liste)); tokens.parseNumbers (); tokens.ordinaryChar ('\t'); tokens.whitespaceChars (' ', ' '); // Dcodage de la liste de points while (tokens.nextToken () != StreamTokenizer.TT_EOF) { Polygon polyline = new Polygon (); // Rcupration des couples de valeurs (x,y) // d'une polyline jusqu' la prochaine tabulation while (tokens.ttype != '\t') { int x = (int)tokens.nval; tokens.nextToken (); int y = (int)tokens.nval; tokens.nextToken (); polyline.addPoint (x, y); } // Ajout de la polyline la liste listePolylines.addElement (polyline); } repaint (); // Arrte le thread pendant 1 s avant de lancer // une nouvelle demande de mise jour Thread.sleep (1000); } } catch (InterruptedException e) { } catch (IOException e) { }
Programmer en java Page 253

Dao Issiaka- 3me anne SI

} // Mthode appele par le systme pour mettre jour le dessin de l'applet public void paint (Graphics gc) { if (message != null) gc.drawString (message, 10, 20); // Dessin de toutes les polylines // et de la polyline courante si elle existe for (Enumeration e = listePolylines.elements (); e.hasMoreElements (); ) drawPolyline (gc, (Polygon)e.nextElement ()); if (polylineCourante != null) drawPolyline (gc, polylineCourante); } private void drawPolyline (Graphics gc, Polygon polyline) { for (int i = 1; i < polyline.npoints; i++) gc.drawLine (polyline.xpoints [i - 1], polyline.ypoints [i - 1], polyline.xpoints [i], polyline.ypoints [i]); } // Les mthodes mouseDown (), mouseDrag (), mouseUp () sont // appeles par le systme l'enfoncement du bouton de la souris, // au dplacement du pointeur, et au relchement du bouton public boolean mouseDown (Event evt, int x, int y) { polylineCourante = new Polygon (); polylineCourante.addPoint (x, y); return true; } public boolean mouseDrag (Event evt, int x, int y) { polylineCourante.addPoint (x, y); paint (getGraphics ()); return true; } public boolean mouseUp (Event evt, int x, int y) { polylineCourante.addPoint (x, y); // Construction d'une requte AJOUT avec la liste des points // de la nouvelle polyline fluxSortie.print (PaperBoardServer.requeteAjout); for (int i = 0; i < polylineCourante.npoints; i++) fluxSortie.print (String.valueOf (polylineCourante.xpoints [i]) + ' ' + polylineCourante.ypoints [i] + ' '); fluxSortie.write ('\n'); listePolylines.addElement (polylineCourante); paint (getGraphics ()); return true; } }

Programmer en java

Page 254

Dao Issiaka- 3me anne SI

Vous pouvez tester ventuellement ce programme sur votre machine locale en lanant le serveur PaperBoardServer, et en remplaant dans l'applet PaperBoardClient le nom du site Internet "www.eteks.com" par "localhost". Ce programme est inspir du Groupboard disponible l'adresse http://www.groupboard.com/. Vous n'aurez normalement pas utiliser la classe et l'interface qui suivent, utilises par la Machine Virtuelle Java pour raliser l'implmentation des sockets.
La classe java.net.SocketImpl

Cette classe abstract permet de grer un socket et la connexion au socket d'un serveur. Elle est utilise pour les sockets ct client comme ct serveur. Elle comporte des champs et des mthodes protected qui sont utilises pour raliser les services des mthodes des classes prcdentes Socket et ServerSocket.
Champs
protected protected protected protected FileDescriptor fd InetAddress address int port int localport

Constructeur
public SocketImpl ()

Mthodes
protected abstract void create (boolean stream) throws IOException protected abstract void connect (String host, int port) throws IOException protected abstract void connect (InetAddress address, int port) throws IOException protected abstract void bind (InetAddress host, int port) throws IOException protected abstract void listen (int count) throws IOException protected abstract void accept (SocketImpl s) throws IOException protected abstract InputStream getInputStream () throws IOException protected abstract OutputStream getOutputStream () throws IOException protected abstract int available () throws IOException protected abstract void close () throws IOException protected FileDescriptor getFileDescriptor () protected InetAddress getInetAddress () protected int getPort () protected int getLocalPort () public String toString ()

L'interface java.net.SocketImplFactory

Cette interface est implmente par les classes dsirant grer la cration de sockets. Elle est utilise comme paramtre des mthodes setSocketImplFactory () de la classe Socket et setSocketFactory () de la classe ServerSocket, pour modifier le gestionnaire par dfaut.
Mthode
public SocketImpl createSocketImpl ()

Programmer en java

Page 255

Dao Issiaka- 3me anne SI

Cette mthode doit renvoyer un objet dont la classe drive de la classe abstract SocketImpl.
Accs via les datagrammes

Pour programmer une architecture client serveur utilisant le protocole UDP (User Datagram Protocol), il faut utiliser les classes DatagramPacket reprsentant un paquet de donnes (ou datagramme) recevoir ou envoyer, et DatagramSocket utilis pour recevoir et envoyer des datagrammes. Contrairement au protocole TCP, le protocole UDP ne maintient pas de connexion permanente entre deux machines. Chaque datagramme est indpendant l'un de l'autre : il comporte un tableau de donnes, l'adresse Internet et le port de la machine laquelle il est destin.
La classe java.net.DatagramPacket

Cette classe final reprsente un datagramme. Le premier constructeur est utilis pour crer un datagramme recevoir, le second pour crer un datagramme envoyer une machine.
Constructeurs
public DatagramPacket (byte ibuf [ ], int ilength)

Construit une instance de la classe DatagramPacket utilis pour recevoir un datagramme dont les paquets de donnes de longueur ilength seront stockes dans le tableau ibuf. Si le datagramme reu est plus long que ilength, les donnes restantes ne sont pas recopies dans ibuf.
public DatagramPacket (byte ibuf [ ], int ilength, InetAddress iaddr, int iport)

Construit une instance de la classe DatagramPacket utilis pour envoyer un paquet de donnes ibuf de longueur ilength, au port iport d'une machine d'adresse Internet iaddr.
Mthodes
public InetAddress getAddress ()

Renvoie l'adresse Internet de la machine dont provient ou auquel est destin ce datagramme.
public int getPort ()

Renvoie le port de la machine dont provient ou auquel est destin ce datagramme.


public byte[] getData () public int getLength ()

Ces mthodes renvoient le tableau o sont stockes les donnes d'un datagramme et la longueur des donnes recevoir (ou reues) ou envoyer.

Programmer en java

Page 256

Dao Issiaka- 3me anne SI

La classe java.net.DatagramSocket

Cette classe permet de recevoir et envoyer des datagrammes, grce aux mthodes receive () et send ().
Constructeurs
public DatagramSocket () throws SocketException

Construit une instance de la classe DatagramSocket. Le port utilis pour recevoir ou envoyer des datagrammes est le premier disponible sur la machine locale.
public DatagramSocket (int port) throws SocketException

Construit une instance de la classe DatagramSocket. Le port port sur la machine locale est utilis pour recevoir ou envoyer des datagrammes.
Mthodes
public int getLocalPort ()

Renvoie le port de la machine locale sur lequel l'envoi ou la rception de datagrammes s'effectue.
public void synchronized receive (DatagramPacket packet) throws IOException

Permet de recevoir un paquet de donnes dans le datagramme packet. Cette mthode met en attente le thread courant jusqu' rception d'un datagramme.
public void send (DatagramPacket packet) throws IOException

Permet d'envoyer le datagramme packet.


public synchronized void close ()

Ferme le socket.
protected synchronized void finalize ()

Programmer en java

Page 257

Dao Issiaka- 3me anne SI

Les applications et les applets


Les applications Java Les applets L'intgration des applets dans les navigateurs Transformer une applet en application

Ce chapitre dcrit les applications Java et le package java.applet de Java 1.0 qui rassemble les classes permettant de programmer une applet Java et de l'intgrer dans un navigateur.
Les applications Java

Comme il est dcrit au premier chapitre, l'environnement Java vous permet de dvelopper principalement deux types de programmes : des applications Java ou des applets Java. Les applications sont comparables tout programme crit dans un autre langage. Le point d'entre d'une application Java est la mthode main () de la classe donne en argument la commande java et respectant la dclaration suivante :
public static void main (String [ ] args)

Comme n'importe quelle classe ClasseExec qui dfinit cette mthode peut tre excute par la Machine Virtuelle Java, vous pouvez ajouter une mthode main () une ou plusieurs classes utilises dans un mme programme. Ceci permet de tester individuellement chacune de ces classes. Attention, cette mthode est static et la Machine Virtuelle Java ne cre donc aucune instance de la classe ClasseExec. Les arguments passs aprs le nom de la classe, comme dans la ligne de commande java ClasseExec arg0 arg1 sont mmoriss dans le tableau args (args [0] mmorise la chane arg0). La mthode main () peut tre suivie d'une clause throws pour citer toutes les classes d'exceptions qu'elle n'intercepte pas. Ceci est pratique quand vous voulez crire de petits programmes de test sans vous soucier du traitement de certaines exceptions. De manire comparable au C, le point d'entre d'un programme Java, est la mthode static main () dfinie par la classe passe en argument l'interprteur Java. La Machine Virtuelle Java rend la main au systme une fois termine l'excution de la mthode main (), si et seulement si plus aucun thread n'est vivant, except pour les threads en tche de fond (daemon).
Programmer en java Page 258

Dao Issiaka- 3me anne SI

Vous pouvez aussi utiliser la mthode exit () de la classes System tout moment pour forcer la Machine Virtuelle rendre la main. Pour sa propre gestion, la bibliothque AWT cre un ensemble de threads aussitt qu'elle est utilise. Comme ces thread ne sont pas des daemons, il faut donc se servir de la mthode exit () pour forcer la fin d'un programme utilisant AWT.
Les applets Caractristiques

Les applets sont des applications spciales qui fonctionnent diffremment des applications Java. En voici les principales caractristiques :

La classe d'une applet doit obligatoirement driver de la classe Applet, tre public et avoir un constructeur sans paramtre public (ventuellement celui fourni par dfaut). Une applet de classe ClasseApplet est lance grce la balise (tag) <APPLET CODE=ClasseApplet ...> dfinie dans un fichier HTML. Diffrents paramtres peuvent tre passs une applet grce aux balise <PARAM NAME="Param" VALUE="ValueParam"> inclus aprs la balise <APPLET ...>. Une instance de la classe de l'applet demande est cre pour chaque balise <APPLET ...>. Une applet n'a pas un unique point d'entre comme pour les applications : les mthodes outrepasses init (), start (), stop () et destroy () d'une classe d'applet ClasseApplet sont appeles respectivement la cration de l'applet ClasseApplet, son affichage, son effacement et sa destruction. Une applet est une portion de fentre graphique : entendez par l que l'affichage d'informations d'une applet est en mode graphique et pas en mode texte : On n'utilise pas la mthode println () dans une applet pour afficher du texte, mais plutt la mthode graphique drawString (). Comme pour une image, une applet s'affiche dans une zone de taille dfinie par la balise <APPLET ...> de la page HTML dans laquelle elle est excute. La classe Applet drive de la classe Panel et non de la classe Window, ce qui implique que les applets ne peuvent bnficier de services que l'on retrouve sur les fentres isoles (menus, icone, titre,...). La classe Applet et celles du package java.applet dfinissent des mthodes utiles dans un navigateur Internet (chargement d'un fichier HTML, rcupration de l'URL courante et des paramtres passes l'applet,...). Pour viter toute intrusion dans le systme o fonctionne le navigateur, le gestionnaire de scurit (SecurityManager) dfini par la Machine Virtuelle du navigateur est trs restrictif : o Aucun accs au systme de fichiers local. o Possibilit d'accder uniquement l'hte sur lequel est hberge le fichier de la classe de l'applet. o Les fentres cres par une applet (de classe drive de la classe Window) comportent un bandeau indiquant que la fentre a t cre par l'applet. o Impossibilit de lancer des applications locales. o Impossibilit de dfinir des mthodes native et d'utiliser des librairies du systme. o Accs limit au proprits du systme de la Machine Virtuelle.

appletviewer et certains navigateurs permettent de modifier les paramtres du gestionnaire de scurit, pour autoriser certaines oprations. Mais si vous voulez
Programmer en java Page 259

Dao Issiaka- 3me anne SI

raliser des applets accessibles publiquement sur Internet, concevez les en considrant que le niveau de scurit des navigateurs utiliss pour excuter vos applets sera son maximum. Certaines caractristiques qui prcdent s'adressent l'utilisation d'applet dans des pages HTML affiches par un navigateur. Si vous utilisez appletviewer (ou Applet Runner sous Mac OS 9), la commande appletviewer pageweb.html crera une fentre isole pour chaque applet dfinie par la balise <APPLET ...> du fichier pageweb.html. On rencontre habituellement deux types d'applet :

Des applets dans lesquelles on dessine directement un dessin ou un texte en outrepassant la mthode paint () de la classe Component, comme l'applet HelloWorld dcrite au premier chapitre, dont le rsultat donne ceci : Des applets qui sont utilises comme container pour y inclure diffrents composants, en appelant la mthode add () de la classe Container, comme l'applet AppletBouton dcrite au chapitre suivant, dont le rsultat donne ceci :

La classe java.applet.Applet

La classe Applet appartient au package java.applet, et drive des classes Panel, Container, Component, du package java.awt. Ces dernires classes dfinissent beaucoup de mthodes utiles la gestion de fentres graphiques auxquelles la classe Applet ajoute des mthodes propres la gestion des applets.
Constructeur
public Applet ()

Mthodes
public void init ()

Cette mthode est appele automatiquement une fois au chargement du fichier HTML dans lequel une applet est appele. C'est le point d'entre principal de l'applet (comparable la mthode main () des applications). Outrepassez cette mthode dans votre classe d'applet, pour initialiser votre applet.
public void start ()

Cette mthode est appele chaque fois qu'une applet est visualise dans un navigateur ou dans appletviewer. Si vous devez effectuer des oprations chaque visualisation de votre applet, outrepassez cette mthode dans votre classe d'applet.
public void stop ()

Cette mthode est appele chaque fois qu'une applet est efface dans un navigateur ou dans appletviewer (la page HTML o est visualise l'applet n'est plus la page courante). Si par exemple votre applet utilise un thread qui tourne continuellement, c'est l'endroit idal pour l'arrter, en outrepassant cette mthode dans votre classe d'applet, comme dans l'exemple du chronomtre. En effet, n'oubliez pas que si le thread n'est pas arrt, il effectuera des oprations dont le rsultat peut tre inutile, puisque la page HTML n'est plus affiche dans le navigateur.
Programmer en java Page 260

Dao Issiaka- 3me anne SI

public void destroy ()

Cette mthode est appele quand le fichier HTML dans lequel une applet est appele est supprim de la mmoire du navigateur. Si vous devez librer certaines ressources utilises par votre applet, outrepassez cette mthode dans votre classe d'applet.
public String getAppletInfo ()

Cette mthode renvoie une chane de caractres d'information sur une applet. Outrepasser cette mthode pour renvoyer une chane indiquant les renseignements concernant votre applet (Copyright, version,...) .
public String [ ][ ] getParameterInfo ()

Cette mthode renvoie un tableau de chanes de caractres correspondant aux paramtres qu'il est possible d'utiliser sur une applet. Outrepasser cette mthode pour renvoyer la liste des paramtres accepter par votre applet. Le tableau doit tre un ensemble de tableaux de 3 chanes fournissant pour chaque paramtre son nom, le type de valeur attendue et sa description, comme par exemple : {"param", "0-10", "Description de param"}.
public void resize (int width, int height) public void resize (Dimension d)

Permet de changer les dimensions d'une applet.


public URL getDocumentBase ()

Renvoie l'URL du fichier HTML dans lequel l'applet est incluse.


public URL getCodeBase ()

Renvoie l'URL du rpertoire du fichier .class partir duquel l'applet a t charge (cette URL est construite grce l'attribut CODEBASE du tag APPLET).
public String getParameter (String name)

Cette mthode permet de rcuprer la valeur ValueParam du paramtre name de l'applet donn par la balise <PARAM NAME="name" VALUE="ValueParam">. null est renvoy si le paramtre name n'existe pas.
public AppletContext getAppletContext ()

Renvoie l'instance de la classe AppletContext, reprsentant le contexte dans lequel l'applet tourne (fourni par le navigateur ou par appletviewer).
public boolean isActive ()

Renvoie true si une applet est active. Une applet devient active l'appel de sa mthode start ().
public void showStatus (String msg)

Programmer en java

Page 261

Dao Issiaka- 3me anne SI

Cette mthode affiche le message msg dans la fentre d'tat du navigateur (en gnral, cette fentre est une barre d'tat situe en bas des fentres des navigateurs).
public Image getImage (URL url) public Image getImage (URL url, String name)

Ces mthodes permettent d'obtenir l'image l'URL url ou l'image name relative url. L'image n'est effectivement charge qu' sa premire utilisation (voir le chargement des images). Les images peuvent tre aux formats GIF anim ou non, ou JPEG.
public public public public AudioClip AudioClip void play void play getAudioClip (URL url) getAudioClip (URL url, String name) (URL url) (URL url, String name)

Ces mthodes permettent d'obtenir ou de jouer directement le fichier son l'URL url ou le fichier son name relatif url.
public final void setStub (AppletStub stub)

Permet de donner l'applet une instance stub de la classe implmentant AppletStub. Cette mthode est appele par le navigateur ou par appletviewer pour lier l'applet aux fonctionnalits fournies par les interfaces AppletContext, AppletStub et AudioClip. Les mthodes start () et stop () des classes Applet et Thread n'ont aucun lien entre elles. Une applet n'est pas un thread, mais par contre, il est vrai que la plupart des navigateurs cre un thread pour chaque applet d'une page HTML.
Exemples

Vous avez l'embarras du choix dans la liste des applets fournie dans la table des matires !
L'intgration des applets dans les navigateurs

La plupart des mthodes de la classe Applet font appel aux mthodes des interfaces suivantes. Les classes implmentant ces interfaces sont fournies avec les navigateurs ou avec appletviewer.
L'interface java.awt.AppletContext

L'interface AppletContext reprsente le contexte dans lequel l'applet tourne.


Mthodes
public AudioClip getAudioClip (URL url) public Image getImage (URL url) public void showStatus (String status)

Voir la classe Applet.


public Applet getApplet (String name) public Enumeration getApplets ()

Programmer en java

Page 262

Dao Issiaka- 3me anne SI

Ces mthodes renvoient soit une applet en fonction de son nom (donn par la valeur de NAME dans la balise <APPLET ...>), soit une numration de toutes les applets du contexte dans lequel une applet tourne. Par exemple, une fois que vous avez trouv une applet, il est possible de communiquer avec elle (voir l'exemple qui suit).
public void showDocument (URL url) public void showDocument (URL url, String target)

Ces mthodes permettent de charger dans le navigateur ou dans appletviewer un nouveau document l'adresse url. target peut tre gal une des valeurs suivantes :
"_self" : le document est charg dans le frame courant. "_parent" : le document est charg dans le frame parent. "_top" : le document est charg dans le frame de niveau le plus lev. "_blank" : le document est charg dans une nouvelle fentre sans nom. Une autre chane "Titre" : le document est charg dans le cadre (frame) dnomm Titre.

showDocument ()

est utilis typiquement pour charger un document quand un utilisateur clique sur un bouton dfini dans une applet.

Exemples

Applets PlayApplet et BoutonsNavigation.


L'interface java.applet.AppletStub

L'interface AppletStub est utilise pour intgrer une applet dans un navigateur ou dans appletviewer.
Mthodes
public public public public public boolean isActive () URL getDocumentBase () URL getCodeBase () String getParameter (String name) AppletContext getAppletContext ()

Voir la classe Applet pour la dfinition de ces mthodes.


public void appletResize (int width, int height)

Cette mthode est appele par les mthodes resize () de la classe Applet pour redimensionner une applet dans la fentre d'un navigateur. Voici un exemple d'utilisation des mthodes getParameter () et getApplet (), qui permet de retrouver une applet appletControlee dont le nom est donn en paramtre. Une fois trouve cette applet, on lui associe un bouton qui appelle alternativement les mthodes start () ou stop () de l'applet appletControlee pour la dmarrer ou l'arrter. Ici, l'applet de la classe Observable est reprise pour illustrer cet exemple :

Programmer en java

Page 263

Dao Issiaka- 3me anne SI

et le programme Java correspondant ( copier dans un fichier dnomm PlayApplet.java et invoqu partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; public class PlayApplet extends Applet { private Applet appletControlee = null; private Button boutonDemarrerArreter; public void init () { String nomApplet = getParameter ("Applet"); String action = getParameter ("Action"); if (nomApplet != null) try { Applet applet; do // Recherche de l'applet dont le nom gale nomApplet if ( (applet = getAppletContext () .getApplet (nomApplet)) == null || !applet.isActive ()) // Si l'applet recherche n'existe pas, attendre 1 seconde // (l'applet n'est peut-tre pas encore charge) Thread.sleep (1000); else appletControlee = applet; while (appletControlee == null); // L'applet a t trouve, ajouter un bouton pour la contrler add (boutonDemarrerArreter = new Button (action)); // Si le paramtre action indique de dmarrer l'applet au dpart, // arrter l'applet pour l'utilisateur puisse la dmarrer if (action.equals ("D\u00e9marrer")) appletControlee.stop (); } catch (InterruptedException e) { } } // Mthode appele quand on clique sur le bouton public boolean action (Event event, Object arg) { if (event.target == boutonDemarrerArreter) { // Arrter ou dmarrer l'applet suivant le nom du bouton if ("Arr\u00eater".equals (arg)) appletControlee.stop (); else { appletControlee.start (); appletControlee.validate (); } // Changer le nom du bouton et le rafficher boutonDemarrerArreter.setLabel ("Arr\u00eater".equals (arg) ? "D\u00e9marrer" : "Arr\u00eater");
Programmer en java Page 264

Dao Issiaka- 3me anne SI

boutonDemarrerArreter.invalidate (); validate (); return true; } return super.action (event, arg); } }

Si vous consultez le source de ce fichier HTML , vous pourrez voir comment utiliser l'applet PlayApplet avec ses paramtres. Le paramtre de nom Applet vous permettant d'indiquer quel est le nom de la classe de l'applet que vous voulez contrler :
<APPLET CODE="ObservateurCalcul" CODEBASE="../classes" NAME="calcul" ALT="ObservateurCalcul" WIDTH=250 HEIGHT=30 ALIGN=middle> </APPLET> <APPLET CODE="PlayApplet" CODEBASE="../classes" ALT="PlayApplet" WIDTH=80 HEIGHT=30 ALIGN=middle> <PARAM NAME="Applet" VALUE="calcul"> <PARAM NAME="Action" VALUE="D&eacute;marrer"> </APPLET>

L'applet PlayApplet n'a pas qu'un intrt didactique : elle permet de contrler sans les modifier, des applets qui utilisent des threads crs dans la mthode start () et arrts dans la mthode stop (). Quand, comme dans certains exemples de ce manuel, vous utilisez des applets gourmandes en temps de calcul, ceci permet de proposer l'utilisateur que ces applets aient leur threads qui ne fonctionnent qu' sa demande (malheureusement la mthode getParameter () ne fonctionne pas avec les premires versions de certains navigateurs sous Windows).
L'interface java.applet.AudioClip

L'interface AudioClip permet de jouer les fichiers sons chargs. Le seul type de son reconnu sous Java 1.0 et 1.1 est le type de fichier Sun .au (law, 8000 Hz, mono). Si vous voulez convertir des fichiers existants dans ce format, il existe des outils de conversion disponibles en shareware ou en freeware sur Internet. Il est possible de mixer plusieurs sons ensemble (si vous excutez les mthodes play () ou loop () ensemble sur diffrents sons, les diffrents sons seront mlangs).
Mthodes
public void play ()

Cette mthode dmarre le son de l'objet AudioClip. A chaque fois, que cette mthode est appele, le son redmarre.
public void loop ()

Dmarre le son et le joue en boucle.


public void stop ()

Arrte le son. N'oubliez pas d'arrter de jouer un son dans la mthode stop () d'une applet, si ce son ne doit tre jou qu'avec cette applet et surtout s'il est jou en boucle.
Programmer en java Page 265

Dao Issiaka- 3me anne SI

Voici un exemple d'utilisation de l'interface AudioClip, qui joue le son correspondant la note d'un octave de piano sur lequel on clique (il faut bien sr une carte son sur votre ordinateur !):

et le programme Java correspondant ( copier dans un fichier dnomm Piano.java et invoqu partir d'un fichier HTML) :
import java.applet.*; import java.awt.*; public class Piano extends Applet { AudioClip [ ] octave = new AudioClip [12]; String [ ] notes = {"do.au", "dodiese.au", "re.au", "rediese.au", "mi.au", "fa.au", "fadiese.au", "sol.au", "soldiese.au", "la.au", "ladiese.au", "si.au"}; Rectangle [ ] rectNotes = new Rectangle [12]; boolean [ ] notesBlanches = {true, false, true, false, true, true, false, true, false, true, false, true}; public void init () { // Chargement des 12 fichiers de notes for (int i = 0; i < notes.length; i++) octave [i] = getAudioClip (getCodeBase (), notes [i]); // Changement de la couleur de fond setBackground (Color.white); } // Mthode appele par la Machine Virtuelle quand l'applet change de taille public void reshape (int newx, int newy, int largeur, int hauteur) { int largeurBlanche = largeur / 7; int largeurNoire = largeurBlanche / 2; // Calcul des rectangles reprsentant les 12 notes (noires ou blanches) for (int x = 0, i = 0; i < notes.length; x += notesBlanches [i++] ? largeurBlanche : 0) if (notesBlanches [i]) rectNotes [i] = new Rectangle (x, 0, largeurBlanche - 1, hauteur 1); else rectNotes [i] = new Rectangle (x - largeurNoire / 2, 0, largeurNoire - 1, 2 * hauteur / 3); // Rappel de la mthode de la super classe super.reshape (newx, newy, largeur, hauteur); } // Mthode appele par la Machine Virtuelle quand l'applet doit tre dessine public void paint (Graphics gc) { gc.setColor (Color.black);
Programmer en java Page 266

Dao Issiaka- 3me anne SI

// Dessin des blanches for (int i = 0; i < notes.length; i++) if (notesBlanches [i]) gc.drawRect (rectNotes [i].x, rectNotes [i].y, rectNotes [i].width, rectNotes [i].height); // Dessin des noires for (int i = 0; i < notes.length; i++) if (!notesBlanches [i]) gc.fillRect (rectNotes [i].x, rectNotes [i].y, rectNotes [i].width, rectNotes [i].height); } // Mthode recherchant la note la position private AudioClip rechercherNote (int x, int { // Recherche d'abord parmi les noires puis // rectangles des noires sont au-dessus de for (int i = 0; i < notes.length; i++) if ( !notesBlanches [i] && rectNotes [i].inside (x, y)) return octave [i]; for (int i = 0; i < notes.length; i++) if (rectNotes [i].inside (x, y)) return octave [i]; return null; } (x,y) y) les blanches car les ceux des blanches

// Mthode appele par la Machine Virtuelle // quand le bouton de la souris est enfonc public boolean mouseDown (Event evt, int x, int y) { AudioClip note = rechercherNote (x, y); if (note != null) note.play (); return true; } }

Les mthodes paint () et reshape () sont dcrites dans le chapitre suivant. Les mthodes utilises dans la mthode paint () ainsi que la mthode outrepasse mouseDown () sont dcrites dans le chapitre sur la gestion de l'interface utilisateur. Bien que le seul format reconnu actuellement rduise la taille (et la qualit) des fichiers sons, ceux-ci sont trs gourmands en octets. Rien que l'applet Piano qui utilise douze (petits) fichiers sons de 6 K en moyenne, doit charger 72 K pour fonctionner. Donc faites attention la taille de vos sons, si vous voulez utiliser vos applets sur Internet.
Transformer une applet en application

Il est partiellement possible de crer une classe d'applet qui puisse aussi fonctionner comme application isole, en dfinissant une mthode main () qui cre une fentre dans laquelle l'applet est ajoute (voir l'exemple de la classe Frame). Les mthodes suivantes de la classe Applet sont en fait des appels indirects aux classes qui implmentent les interfaces AppletContext, AppletStub et AudioClip. Ces classes fournies

Programmer en java

Page 267

Dao Issiaka- 3me anne SI

par les navigateurs ou Appletviewer, sont lies une applet aprs sa cration grce la mthode setStub () de la classe Applet : interface AppletStub getCodeBase () interface AppletStub getParameter () interface AppletStub getAppletContext () interface AppletStub isActive () interface AppletStub getImage () interface AppletContext getAudioClip () interface AppletContext showStatus () interface AppletContext play () interface AudioClip
getDocumentBase ()

Si vous utilisez dans votre applet une de ces mthodes, pour viter le dclenchement d'exception il vous faut crer la ou les classes qui implmentent les mthodes des interfaces correspondantes, mme si leur implmentation ne fait rien (seule la mthode getImage () est aussi disponible dans la classe Toolkit). Une instance de la classe implmentant AppletStub est associe chaque applet grce la mthode setStub (), une instance de la classe implmentant AppletContext est associe chaque fentre de navigateur et une instance de la classe implmentant AudioClip est associe chaque son.

Programmer en java

Page 268

Dao Issiaka- 3me anne SI

Les composants de l'interface utilisateur


Les composants Java La classe java.awt.Component Les composants prdfinis Comment a marche ?

Les composants Java

Le package java.awt (Abstract Window Toolkit) est le plus riche des packages Java. Il dfinit toutes les classes permettant de construire et de grer l'interface utilisateur. Les classes les plus importantes de ce package sont celles qui permettent de crer les diffrents composants d'une interface utilisateur. Les composants se rpartissent en trois catgories :
1. Les composants prdfinis sur lesquels l'utilisateur agit directement pour communiquer avec le programme (dans d'autres environnements comme Windows, on les appelle des contrles). Voici la liste de ceux fournis avec le package java.awt :

Les boutons (de classe Button) : un programme dclenche une action quand l'utilisateur clique sur un bouton (on entend par cliquer enfoncer et relcher le bouton de la souris avec le pointeur toujours positionn sur le bouton). Les boites cocher (de classe Checkbox) : ce sont des composants ayant deux tats possibles (coch ou non coch), qui permettent de proposer l'utilisateur d'activer ou dsactiver une option par simple clic. Les boutons radios (de classe Checkbox associs un ensemble de classe CheckboxGroup). A un moment donn, un seul bouton radio ne peut tre choisi parmi ceux de l'ensemble auquel il appartient. Ceci permet de proposer l'utilisateur un choix parmi plusieurs options. Les composants de classe Choice (appels aussi Combo box ou Drop down list dans d'autres environnements) : Ce type de composant propose l'utilisateur de faire un choix parmi un certains nombres de chanes de caractres affiches dans une liste droulante. Cette liste apparat quand l'utilisateur clique sur la flche associe au composant et disparat une fois que celui-ci clique sur une des chanes de la liste. Les listes (de classe List) : ce sont des composants qui permettent par simple clic, de slectionner ou de

Programmer en java

Page 269

Dao Issiaka- 3me anne SI

dselectionner une ou plusieurs chanes de caractres affiches dans une liste.Contrairement au composant de classe Choice, la liste reste toujours affiche. Les chanes slectionnes sont affiches en inverse vido. Les labels (de classe Label) : Ce sont les composants les plus simples ; un label permet d'afficher une chane de caractres (titre, message, information dcrivant un composant juxtapos,...). Les zones de saisies de texte (composant avec une seule ligne TextField ou avec plusieurs lignes TextArea) : Ces composants permettent l'utilisateur de saisir une chane de caractres. Les ascenseurs (de classe Scrollbar) : ces composants sont utiliss en association avec un autre composant (en gnral un container), quand la zone d'affichage de celui-ci est trop petite pour contenir tout ce qu'il peut afficher. L'ascenseur (horizontal et/ou vertical) permet alors l'utilisateur de dplacer la zone d'affichage sur d'autres portions du composant (comme on bouge des jumelles pour voir diffrents dtails d'un paysage).
2. Les composants drivs de la classe Canvas : Si les composants prdfinis ne satisfont pas un de vos besoins, vous devez utiliser cette classe comme super classe pour crer vos propres composants que vous dessinez en utilisant les mthodes de la classe Graphics. 3. Les containers : Contrairement aux autres composants, les containers sont utiliss pour contenir d'autres composants de n'importe quelle catgorie ou pour afficher directement des dessins fabriqus avec les mthodes de la classe Graphics. Les containers se subdivisent en deux sous catgories qui hritent toutes deux de la classe abstract Container : o Les containers de type fentre (de classe Window ou ses drives) : Les fentres sont des zones d'affichage indpendantes les unes des autres. Parmi les fentres, on distingue les boites de dialogue (de classe Dialog) comportant un cadre et un titre, et les fentres de classe Frame comportant un cadre, un titre, un menu ventuel, un pointeur de souris propre,... (et correspondant aux fentres que vous avez l'habitude d'utiliser). o Les containers de classe Panel : Ce type de containers est une zone d'affichage occupant tout ou partie d'une fentre. Notamment, la classe Applet drive de Panel et permet d'afficher des composants ou un dessin dans une fentre d'un navigateur.

Toutes les classes de composants cites ci-dessus drivent directement ou indirectement d'une unique classe : la classe Component. Cette classe dcrit tous les comportements communs tous les composants. Voici la hirarchie des classes qui drivent de la classe Component :
java.awt.Component o java.awt.Button o java.awt.Canvas
Page 270

Programmer en java

Dao Issiaka- 3me anne SI

o o o

o o o o

java.awt.Checkbox java.awt.Choice java.awt.Container java.awt.Panel java.applet.Applet java.awt.Window java.awt.Dialog java.awt.FileDialog java.awt.Frame java.awt.Label java.awt.List java.awt.Scrollbar java.awt.TextComponent java.awt.TextArea java.awt.TextField

Quand vous recherchez les mthodes disponibles sur une classe drive de Component, n'oubliez pas de consulter toutes les super classes dont elle hrite, pour connatre l'ensemble complet de ses fonctionnalits.

Tous ces composants prennent l'aspect de ceux du systme sur lequel la Machine Virtuelle fonctionne. Et les menus dans tout a ?! Les menus et sous-menus d'une fentre sont des instances des classes drivant de la classe abstract MenuComponent qui n'a pas de lien d'hritage avec la classe Component, c'est pourquoi ils sont traits dans le paragraphe sur les menus. Contrairement d'autres systmes (Windows, Mac OS,...), il n'existe pas en Java de concept de fichier ressource utilis pour dcrire et crer l'interface utilisateur, et spar du programme qui s'en sert. Vous devez crer vous-mme tous les composants et les ajouter au container qui les contient. Par contre, leur disposition (position et taille) peut tre gre automatiquement par un layout associ chaque container.
La classe java.awt.Component

Cette classe abstract est la super classe de toutes les classes de composants cites ci-dessus, et implmente l'interface ImageObserver. Elle comporte un trs grand nombre de mthodes, qui sont souvent outrepasses par les classes drives de Component. Si vous devez crer une applet ou un programme avec une interface graphique, vous utiliserez les classes de composants ou vous crerez de nouvelles classes qui en drivent (de la classe Applet notamment). Comme vous aurez outrepasser ces mthodes ou vous les invoquerez directement ou indirectement, il vous faut bien matriser l'utilit de la plupart d'entre elles.
Mthodes
public Container getParent () public ComponentPeer getPeer () public Toolkit getToolkit ()

Ces mthodes permettent d'obtenir le composant parent (par exemple le container auquel appartient un bouton), le peer d'un composant et le kit d'outils (Toolkit) grant la cration des composants l'cran.
Programmer en java Page 271

Dao Issiaka- 3me anne SI

public public public public

boolean boolean boolean boolean

isValid () isVisible () isShowing () isEnabled ()

Ces mthodes permettent de savoir si un composant est valide, s'il est visible, s'il est affich et s'il est utilisable. Un composant est invalide, quand son image l'cran ne correspond pas aux valeurs de ses champs, par exemple quand on change sa taille et que l'image du composant n'a pas encore mis jour. Tous les composants sont visibles par dfaut sauf les fentres dont la classe est Window ou ses drives. Attention, pour un composant qui n'est pas une fentre, visible n'implique pas que l'objet est l'cran, cela veut dire qu'il faudra l'afficher quand son container sera cr l'cran Un composant est affich quand il est cran, c'est--dire qu'il est visible ET que son container est l'cran. Un composant est utilisable (enabled), quand l'utilisateur peut s'en servir ; un composant qui n'est pas utilisable (disabled) est gnralement gris.
public Point location () public Dimension size () public Rectangle bounds ()

Ces mthodes renvoient la position, la taille et le rectangle englobant d'un composant. Les coordonnes sont exprimes dans le systme de coordonnes du parent du composant, sachant que le point (0,0) est en haut gauche et que l'axe des y descend vers le bas.
public synchronized void enable () public synchronized void disable () public void enable (boolean cond)

Vous pouvez rendre utilisable ou inutilisable un composant grce ces mthodes. Un composant inutilisable (disabled) est gnralement gris.
public synchronized void show () public synchronized void hide () public void show (boolean cond)

Ces mthodes permettent d'afficher ou d'effacer un composant. Ces mthodes sont surtout utilises pour afficher ou effacer une fentre l'cran.
public public public public public public public Color getForeground () synchronized void setForeground (Color c) Color getBackground () synchronized void setBackground (Color c) Font getFont () synchronized void setFont (Font f) synchronized ColorModel getColorModel ()

Utilisez ces mthodes pour obtenir ou modifier la couleur d'un composant, sa couleur de fond et la police de caractres qu'il utilise pour afficher son texte (voir aussi la classe Graphics).
public void move (int x, int y) public void resize (int width, int height) public void resize (Dimension d)
Programmer en java Page 272

Dao Issiaka- 3me anne SI

public synchronized void reshape (int x, int y, int width, int height)

Ces mthodes sont utilises pour dplacer et modifier la taille d'un composant. Gnralement, on ne les appelle pas directement pour placer un composant dans un container : ces composants sont disposs automatiquement par le layout associ au container. Par contre, vous devez donner une dimension aux fentres que vous crez. Si vous voulez utiliser les nouvelles dimensions d'un composant comme dans l'applet Piano, outrepassez la mthode reshape () car les trois autres mthodes appellent cette mthode.
public Dimension preferredSize () public Dimension minimumSize ()

Ces mthodes renvoient la taille prfre et la taille minimum d'un composant, pour que son affichage se fasse correctement. Ces mthodes sont appeles par certaines classes de layout, pour connatre les dimensions correctes d'un composant.
public void layout ()

L'implmentation de cette mthode ne fait rien dans la classe Component. Elle est outrepasse notamment par la classe Container, pour disposer les composants appartenant un container.
public void validate ()

Si un composant est invalide (son image l'cran ne correspond pas aux valeurs de ses champs), cette mthode appelle layout (). Elle est outrepasse dans la classe Container pour mettre jour tous les composants d'un container invalide.
public void invalidate ()

Marque un composant et ses parents comme tant invalide. Ainsi, un appel validate () pourra mettre jour ces composants invalides.
public Graphics getGraphics ()

Permet de d'obtenir un contexte graphique pour un composant, pour y effectuer des dessins. Cette mthode renvoie null si le composant n'a pas encore t affich.
public FontMetrics getFontMetrics (Font font)

Permet de rcuprer les renseignements concernant une police de caractre (hauteur, largeur,...).
public void paint (Graphics gc)

Cette mthode est appele quand le dessin d'un composant doit tre mis jour ( la premire visualisation d'un composant, quand il change de taille, quand une portion d'un composant cache par une fentre est raffiche,...). L'implmentation de la mthode paint () de la classe Component ne fait rien. Quand vous crez de nouvelles classes de composants (drives d'une des classes Canvas, Applet, Frame,...), vous devez outrepasser cette mthode pour dessiner le composant avec les mthodes de la classe Graphics, si vous ne voulez pas vous en servir comme container.
Programmer en java Page 273

Dao Issiaka- 3me anne SI

Les composants Java n'utilisent pas le double-buffering (systme utilisant une image cache, copie de l'image d'un composant l'cran). C'est dire que, par dfaut, chaque fois qu'un composant a besoin d'tre redessin (mme si ce dessin n'a pas chang), la mthode paint () de sa classe est appele et toutes les instructions de cette mthode sont excutes. Ceci implique deux inconvnients majeurs :

Si le dessin est inchang (comme par exemple, quand un composant cach par une fentre est raffiche), toutes les instructions de paint () sont rexcutes et ceci peut prendre un certain temps. L'utilisateur voit le dessin se fabriquer l'cran, ce qui peut tre gnant si notamment, vous voulez faire des animations.

Par contre, l'avantage est que moins de mmoire est utilise pour l'affichage d'un composant (pas de besoin de mmoriser une image copie du composant l'cran). Le chapitre sur les images, dcrit comment simuler un effet de double-buffering, en crant une image dans laquelle vous dessinez avant de la copier l'cran.
public void update (Graphics gc)

Cette mthode est appele indirectement par les mthodes repaint (). La mthode update () remplit d'abord le composant avec sa couleur de fond avant d'appeler paint (). Si le dessin ralis par les instructions de la mthode paint () occupe la totalit de la surface du composant, outrepassez la mthode update () en appelant directement paint (), ceci vitera que le fond soit rempli inutilement.
public void paintAll (Graphics gc)

Redessine un composant et pour un container tous les composants lui appartenant.


public void repaint () public void repaint (long millisec) public void repaint (int x, int y, int width, int height) public void repaint (long millisec, int x, int y, int width, int height)

Redessine un composant. Ces mthodes provoque indirectement un appel update (), soit le plus rapidement possible, soit aprs au moins millisec millisecondes. x, y, width et height dlimite la zone redessiner.
public void print (Graphics gc)

Imprime le composant. L'implmentation de print () de la classe Component appelle paint ().


public void printAll (Graphics gc)

Imprime un composant et pour un container tous les composants lui appartenant.


public synchronized boolean inside (int x, int y)

Vrifie si le point de coordonnes (x,y) appartient la boite englobante du composant.


Programmer en java Page 274

Dao Issiaka- 3me anne SI

public Component locate (int x, int y)

L'implmentation de cette mthode renvoie le composant lui-mme si le point de coordonnes (x,y) appartient sa boite englobante. Elle est outrepasse dans la classe Container pour rechercher le composant situ au point de coordonnes (x,y) d'un container.
public public public public Image createImage (int width, int height) Image createImage (ImageProducer producer) boolean prepareImage (Image image, ImageObserver observer) boolean prepareImage (Image image, int width, int height, ImageObserver observer) public int checkImage (Image image, ImageObserver observer) public int checkImage (Image image, int width, int height, ImageObserver observer) public boolean imageUpdate (Image img, int flags, int x, int y, int width, int height)

Ces mthodes permettent de manipuler les images. Voir le chapitre sur les images pour plus de dtails. La mthode imageUpdate () est l'implmentation de la mthode de l'interface ImageObserver.
public public public public public public public public public public public public public public void deliverEvent (Event evt) boolean postEvent (Event evt) boolean handleEvent (Event evt) boolean mouseDown (Event evt, int x, int y) boolean mouseDrag (Event evt, int x, int y) boolean mouseUp (Event evt, int x, int y) boolean mouseMove (Event evt, int x, int y) boolean mouseEnter (Event evt, int x, int y) boolean mouseExit (Event evt, int x, int y) boolean keyDown (Event evt, int key) boolean keyUp (Event evt, int key) boolean action (Event evt, Object what) boolean gotFocus (Event evt, Object what) boolean lostFocus (Event evt, Object what)

Ces mthodes sont utilises pour la gestion vnementielle des composants (voir le chapitre sur la gestion de l'interface utilisateur).
public void requestFocus ()

Permet un composant de lancer une requte pour obtenir le focus. Si le focus lui est accord, la mthode gotFocus () sera appele.
public void nextFocus ()

Donne le focus au composant suivant parmi ceux de la liste des composants d'un container.
public void addNotify ()

Cette mthode est outrepasse par les classes drives de Component pour crer le peer d'un composant, qui est sa reprsentation l'cran. Elle est appele indirectement par les mthodes qui grent l'affichage des composants.

Programmer en java

Page 275

Dao Issiaka- 3me anne SI

public synchronized void removeNotify ()

Cette mthode est appele pour supprimer le peer d'un composant.


protected String paramString () public String toString ()

Ces mthodes sont utilises pour fabriquer une chane de caractres dcrivant le composant (toString () outrepasse la mthode de la classe Object et appelle la mthode paramString () qui est outrepasse par les classes drives de Component).
public void list () public void list (PrintStream out) public void list (PrintStream out, int indent)

Imprime sur System.out ou sur out, la chane de caractres dcrivant le composant.


Les composants prdfinis La classe java.awt.Button

Cette classe qui drive de la classe Component, est la classe du package java.awt qui permet de crer et de manipuler des boutons. Une fois cr un objet de classe Button, vous devez l'ajouter un container avec la mthode add () de la classe Container, pour le visualiser.
Constructeurs
public Button () public Button (String label)

Ces constructeurs permettent de crer un bouton avec ou sans label (texte affich dans le bouton).
Mthodes
public synchronized void addNotify ()

Cette mthode outrepasse la mthode addNotify () de la classe Component pour crer le peer d'un bouton.
public String getLabel () public void setLabel (String label)

Ces mthodes permettent d'interroger ou de modifier le label d'un bouton.


protected String paramString ()

Mthode de la classe Component, outrepasse pour renvoyer une chane de caractres dcrivant le bouton.
Exemples

Applets PlayApplet, AppletButton, TraitementTexte, MessageBoxApplet, BorderBuilder, ShowMenu et MiseAJourHorloge.


Programmer en java Page 276

Dao Issiaka- 3me anne SI

La classe java.awt.Checkbox

Cette classe qui drive de la classe Component, est la classe du package java.awt qui permet de crer et de manipuler des boites cocher et les boutons radios. Une fois cr un objet de classe Checkbox, vous devez l'ajouter un container avec la mthode add () de la classe Container, pour le visualiser. Une bote cocher ou un bouton radio ont deux tats (coch ou non) reprsents par une valeur boolean (true ou false). Pour qu'un objet de classe Checkbox soit un bouton radio, il doit tre associ une instance de CheckboxGroup.
Constructeurs
public Checkbox () public Checkbox (String label)

Ces constructeurs permettent de crer une boite cocher avec ou sans label (texte affich ct de la boite cocher). Par dfaut, la boite cocher n'est pas coche.
public Checkbox (String label, CheckboxGroup group, boolean state)

Ce constructeur permet de construire une boite cocher, ou un bouton radio si group est diffrent de null. Si state est gal true la boite cocher est coche, ou le bouton radio est le bouton coch parmi tous les boutons radios qui appartiennent au groupe group.
Mthodes
public synchronized void addNotify ()

Cette mthode outrepasse la mthode addNotify () de la classe Component pour crer le peer d'une boite cocher ou d'un bouton radio.
public String getLabel () public void setLabel (String label)

Ces mthodes permettent d'interroger ou de modifier le label d'une boite cocher ou d'un bouton radio.
public boolean getState () public void setState (boolean state)

Ces mthodes permettent d'interroger ou de modifier l'tat (coch ou non) d'une boite cocher ou d'un bouton radio.
public CheckboxGroup getCheckboxGroup () public void setCheckboxGroup (CheckboxGroup group)

Ces mthodes permettent d'interroger ou de modifier le groupe auquel appartient un bouton radio.
protected String paramString ()

Mthode de la classe Component, outrepasse pour renvoyer une chane de caractres dcrivant le composant.
Programmer en java Page 277

Dao Issiaka- 3me anne SI

Exemple

Applet DrawIt.
La classe java.awt.CheckboxGroup

Cette classe est la classe du package java.awt qui permet de grer un ensemble de boutons radios. Parmi tous les boutons radios (de classe Checkbox) associs une instance de CheckboxGroup, au plus un seul peut tre coch.
Constructeur
public CheckboxGroup ()

Mthodes
public Checkbox getCurrent () public synchronized void setCurrent (Checkbox box)

Ces mthodes permettent d'interroger ou de modifier le bouton radio qui est actuellement coch.
public String toString ()

Exemple

Applet DrawIt.
La classe java.awt.Choice

Cette classe qui drive de la classe Component, est la classe du package java.awt qui permet de crer des composants proposant un choix parmi une liste droulante. Une fois cr un objet de classe Choice, vous devez l'ajouter un container avec la mthode add () de la classe Container, pour le visualiser. A chaque choix de la liste est associ un indice, compris entre 0 et le nombre de choix - 1.
Constructeur
public Choice ()

Mthodes
public synchronized void addNotify ()

Cette mthode outrepasse la mthode addNotify () de la classe Component pour crer le peer d'une instance de la classe Choice.
public int countItems ()

Renvoie le nombre de choix possibles dans le composant.


public String getItem (int index)

Renvoie la chane de caractres correspondante au choix d'indice index.


public synchronized void addItem (String item)
Programmer en java Page 278

Dao Issiaka- 3me anne SI

Permet d'ajouter en fin de liste un nouveau choix gal la chane de caractres item.
public String getSelectedItem () public int getSelectedIndex ()

Ces mthodes renvoient soit la chane de caractres soit l'indice du choix courant.
public synchronized void select (int index) throws IllegalArgumentException public void select (String str)

Ces mthodes permettent de dsigner le choix courant du composant, soit en donnant son indice index, soit en donnant sa valeur str.
protected String paramString ()

Mthode de la classe Component, outrepasse pour renvoyer une chane de caractres dcrivant le composant.
Exemple

Applet CalculetteSimple.
La classe java.awt.List

Cette classe qui drive de la classe Component, est la classe du package java.awt qui permet de crer des listes permettant de slectionner un ou plusieurs choix parmi plusieurs chanes de caractres. Une fois cr un objet de classe List, vous devez l'ajouter un container avec la mthode add () de la classe Container, pour le visualiser. A chaque choix de la liste est associ un indice, compris entre 0 et le nombre de choix - 1. Il est possible de dfinir le nombre de lignes qu'une liste peut afficher en mme temps, sans utiliser l'ascenseur associe la liste, mais ce nombre de lignes et la taille du composant dpendent aussi du layout utilis.
Constructeur
public List ()

Ce constructeur construit une liste dont le nombre de lignes affiches n'est pas dtermin, et qui n'autorise pas la slection multiple.
public List (int rows, boolean multipleSelections)

Ce constructeur construit une liste dont le nombre de lignes affiches est gal rows, et qui autorise la slection multiple si multipleSelections est gal true.
Mthodes
public synchronized void addNotify ()

Cette mthode outrepasse la mthode addNotify () de la classe Component pour crer le peer d'une liste.
public synchronized void removeNotify ()
Programmer en java Page 279

Dao Issiaka- 3me anne SI

Cette mthode outrepasse la mthode removeNotify () de la classe Component pour supprimer le peer d'une liste.
public int countItems ()

Renvoie le nombre de choix possibles dans la liste.


public String getItem (int index)

Renvoie la chane de caractres correspondante au choix d'indice index.


public synchronized void addItem (String item)

Permet d'ajouter en fin de liste un nouveau choix gal la chane de caractres item.
public synchronized void addItem (String item, int index)

Permet d'insrer l'indice index un nouveau choix gal la chane de caractres item (si index est gal -1, item est ajout en fin de liste).
public synchronized void replaceItem (String newValue, int index)

Remplace la chane de caractres l'indice index par newValue.


public synchronized void clear ()

Supprime toutes les chanes de caractres de la liste.


public synchronized void delItem (int index) public synchronized void delItems (int start, int end)

Supprime le choix l'indice index, ou tous les choix compris entre les indices start et end.
public synchronized String getSelectedItem () public synchronized int getSelectedIndex ()

Ces mthodes renvoient soit la chane de caractres slectionne soit son indice (en cas de slection multiple seule la premire est renvoye).
public synchronized String [ ] getSelectedItems () public synchronized int [ ] getSelectedIndexes ()

Ces mthodes renvoient soit un tableau des chanes de caractres slectionnes soit un tableau de leur indice.
public synchronized void select (int index) public synchronized void deselect (int index)

Ces mthodes permettent de slectionner ou de dslectionner une chane de caractres en donnant son indice index.
public synchronized boolean isSelected (int index)

Programmer en java

Page 280

Dao Issiaka- 3me anne SI

Renvoie true si la chane de caractres d'indice index est slectionne.


public int getRows ()

Renvoie le nombre de lignes visibles dans la liste.


public boolean allowsMultipleSelections ()

Renvoie true si une liste autorise la slection multiple.


public void setMultipleSelections (boolean v)

Permet d'autoriser ou non la slection multiple dans une liste.


public int getVisibleIndex ()

Renvoie l'indice de la chane de caractres qui a t rendue visible lors d'un prcdent appel la mthode makeVisible ().
public void makeVisible (int index)

Force la chane de caractres d'indice index tre visible l'cran.


public public public public Dimension Dimension Dimension Dimension preferredSize (int rows) preferredSize () minimumSize (int rows) minimumSize ()

Mthodes de la classe Component, outrepasses pour renvoyer la taille prfre ou la taille minimum d'une liste.
protected String paramString ()

Mthode de la classe Component, outrepasse pour renvoyer une chane de caractres dcrivant la liste. Voici un programme Java simple utilisant une liste : c'est celui de l'applet donnant la liste des caractres Unicode compris entre '\u0080' et '\u00ff'( copier dans un fichier dnomm Unicode.java et invoqu partir d'un fichier HTML)
import java.awt.*; import java.applet.*; public class Unicode extends Applet { public void init () { // Utilisation d'un layout grille 1 x 1 qui permet // la liste d'occuper tout l'espace de l'applet setLayout (new GridLayout (1, 1)); // Changement de police de caractres setFont (new Font("Courier", Font.PLAIN, 12));

Programmer en java

Page 281

Dao Issiaka- 3me anne SI

// Cration d'une liste affichant les caractres // Unicode compris entre '\u0080' et '\u00ff' List listeCaracteres = new List (); for (short i = 0x0080; i <= 0x00ff; i++) listeCaracteres.addItem ( "\\u00" + Integer.toHexString (i) + " " + new Character ((char)i)); // Ajout de la liste au container add (listeCaracteres); } }

Autre exemple

Applet ListePolices.
La classe java.awt.Label

Cette classe qui drive de la classe Component, est la classe du package java.awt qui permet de crer et de manipuler des labels. Une fois cr un objet de classe Label, vous devez l'ajouter un container avec la mthode add () de la classe Container, pour le visualiser.
Champs
public final static int LEFT public final static int CENTER public final static int RIGHT

Constantes utilises pour l'alignement du texte dans le composant.


Constructeurs
public Label () public Label (String label) public Label (String label, int alignment)

Ces constructeurs permettent de crer un label avec ou sans texte, et en prcisant ventuellement l'alignement du texte dans le composant (gal LEFT, CENTER ou RIGHT).
Mthodes
public synchronized void addNotify ()

Cette mthode outrepasse la mthode addNotify () de la classe Component pour crer le peer d'un label.
public int getAlignment () public void setAlignment (int alignment) throws IllegalArgumentException

Ces mthodes permettent d'interroger ou de modifier l'alignement du texte dans un label (gal LEFT, CENTER ou RIGHT).
public String getText () public void setText (String label)

Ces mthodes permettent d'interroger ou de modifier le texte d'un label.

Programmer en java

Page 282

Dao Issiaka- 3me anne SI

protected String paramString ()

Mthode de la classe Component, outrepasse pour renvoyer une chane de caractres dcrivant le label.
Exemples

Applets CalculetteSimple, TraitementTexte, MessageBoxApplet, MiseAJourHorloge, ListePolices et Nuancier.


La classe java.awt.TextComponent

Cette classe qui drive de la classe Component, est la super classe des classes de composants TextField et TextArea qui permettent de crer des zones de saisies de texte. Cette classe regroupe l'ensemble des mthodes communes ces deux classes. Comme elle n'a pas de constructeur public, vous ne pouvez crer d'instance de cette classe.
Mthodes
public synchronized void removeNotify ()

Cette mthode outrepasse la mthode removeNotify () de la classe Component pour supprimer le peer d'une zone de saisie.
public void setText (String t) public String getText ()

Ces mthodes permettent d'interroger ou de modifier le texte d'une zone de saisie.


public boolean isEditable ()

Renvoie true si le texte d'une zone de saisie est ditable.


public void setEditable (boolean t)

Permet de spcifier si le texte d'une zone de saisie est ditable ou non.


public String getSelectedText () public int getSelectionStart () public int getSelectionEnd ()

Ces mthodes permettent d'interroger le texte en cours de slection dans une zone de saisie ou l'indice du dbut et de la fin du texte slectionn.
public void select (int selStart, int selEnd) public void selectAll ()

Ces mthodes permettent de slectionner une partie du texte de la zone de saisie (comprise entre les indices selStart et selEnd) ou tout le texte de la zone de saisie.
protected String paramString ()

Programmer en java

Page 283

Dao Issiaka- 3me anne SI

Mthode de la classe Component, outrepasse pour renvoyer une chane de caractres dcrivant la zone de saisie.
La classe java.awt.TextField

Cette classe qui drive des classes TextComponent et Component, est la classe du package java.awt qui permet de crer et de manipuler des zones de saisies de texte d'une seule ligne. Une fois cr un objet de classe TextField, vous devez l'ajouter un container avec la mthode add () de la classe Container, pour le visualiser. Il est possible d'utiliser les zones de saisie de cette classe pour la saisie de mots de passe en prcisant un caractre qui masque les caractres saisis. Toutes les mthodes permettant de manipuler le texte de la zone de saisie sont dans la classe TextComponent.
Constructeurs
public public public public TextField TextField TextField TextField () (int cols) (String text) (String text, int cols)

Ces constructeurs permettent de crer une zone de saisie avec ou sans un texte de dpart, et en prcisant ventuellement le nombre de colonnes que doit occuper la zone de saisie.
Mthodes
public synchronized void addNotify ()

Cette mthode outrepasse la mthode addNotify () de la classe Component pour crer le peer d'une zone de saisie d'une seule ligne.
public boolean echoCharIsSet ()

Renvoie true si un caractre de masque est positionn.


public char getEchoChar () public void setEchoCharacter (char c)

Ces mthodes permettent d'interroger ou de modifier le caractre de masque en cours d'utilisation.


public int getColumns ()

Renvoie le nombre de colonnes occupes par la zone de saisie.


public public public public Dimension Dimension Dimension Dimension preferredSize (int cols) preferredSize () minimumSize (int cols) minimumSize ()

Mthodes de la classe Component, outrepasses pour renvoyer la taille prfre ou la taille minimum d'une zone de saisie.
protected String paramString ()

Programmer en java

Page 284

Dao Issiaka- 3me anne SI

Mthode de la classe Component, outrepasse pour renvoyer une chane de caractres dcrivant la zone de saisie. L'applet CalculetteSimple qui suit est un exemple simple de l'utilisation des classes TextField, Label et Choice. Elle permet d'afficher le rsultat d'une opration simple (+, -, * et /) entre deux oprandes. Cet exemple montre au passage comment convertir une chane de caractres en un nombre d'un type primitif grce la mthode valueOf () de la classe Float (les classes Integer, Long et Double fournissent aussi des mthodes similaires de conversion).

et le programme Java correspondant ( copier dans un fichier dnomm CalculetteSimple.java et invoqu partir d'un fichier HTML) :
import java.awt.*; import java.applet.*; public class CalculetteSimple extends Applet { TextField operande1 = new TextField ("2000"); TextField operande2 = new TextField ("1000"); Choice choixOperateur = new Choice (); Label labelResultat = new Label ("3000 public void init () { // Ajout des oprateurs choixOperateur.addItem (" choixOperateur.addItem (" choixOperateur.addItem (" choixOperateur.addItem ("

");

la liste + "); - "); * "); / ");

// Ajout des composants l'applet add (operande1); add (choixOperateur); add (operande2); add (labelResultat); } // Mthode appele par la machine virtuelle quand on effectue // une action sur un des composants public boolean action (Event event, Object eventArg) { try { // Rcupration des valeurs saisies dans les deux champs de saisies // La mthode static valueOf () de la classe Float est utilise pour // convertir le texte saisi en un nombre. Cette mthode dclenche une // exception de classe NumberFormatException si la chane de caractres // convertir n'est pas un nombre float valeur1 = Float.valueOf (operande1.getText ()).floatValue (); float valeur2 = Float.valueOf (operande2.getText ()).floatValue (); float resultat = 0; // Calcul suivant l'oprateur choisi switch (choixOperateur.getSelectedItem ().charAt (1))
Programmer en java Page 285

Dao Issiaka- 3me anne SI

{ case '+' : resultat break; case '-' : resultat break; case '*' : resultat break; case '/' : resultat break; } labelResultat.setText (" = " + resultat); } catch (NumberFormatException e) { // Exception si un des deux oprandes n'est pas un nombre labelResultat.setText (" (Calcul impossible)"); } return true; } } = valeur1 + valeur2; = valeur1 - valeur2; = valeur1 * valeur2; = valeur1 / valeur2;

Autre exemple

Applet ListePolices.
La classe java.awt.TextArea

Cette classe qui drive des classes TextComponent et Component, est la classe du package java.awt qui permet de crer et de manipuler des zones de saisies de texte de plusieurs lignes. Une fois cr un objet de classe TextArea, vous devez l'ajouter un container avec la mthode add () de la classe Container, pour le visualiser. Il est possible d'utiliser les zones de saisie de cette classe pour la saisie de mots de passe en prcisant un caractre qui masque les caractres saisis. Toutes les mthodes permettant de manipuler le texte de la zone de saisie sont dans la classe TextComponent. Un exemple plus complet utilisant la classe TextArea est donn au chapitre suivant.
Constructeurs
public public public public TextArea TextArea TextArea TextArea () (int rows, int cols) (String text) (String text, int rows, int cols)

Ces constructeurs permettent de crer une zone de saisie avec ou sans un texte de dpart, et en prcisant ventuellement le nombre de colonnes et de lignes que doit occuper la zone de saisie.
Mthodes
public synchronized void addNotify ()

Cette mthode outrepasse la mthode addNotify () de la classe Component pour crer le peer d'une zone de saisie de plusieurs lignes.
public void insertText (String str, int pos)
Programmer en java Page 286

Dao Issiaka- 3me anne SI

Permet d'insrer la chane de caractres str la position pos dans le texte de la zone de saisie.
public void appendText (String str)

Permet d'ajouter la chane de caractres str la fin du texte de la zone de saisie.


public void replaceText (String str, int start, int end)

Permet de remplacer par la chane de caractres str la partie du texte de la zone de saisie comprise entre les indices start et end.
public int getRows () public int getColumns ()

Ces mthodes permettent d'interroger le nombre de colonnes ou le nombre de lignes occupes par la zone de saisie.
public public public public Dimension Dimension Dimension Dimension preferredSize (int cols) preferredSize () minimumSize (int cols) minimumSize ()

Mthodes de la classe Component, outrepasses pour renvoyer la taille prfre ou la taille minimum d'une zone de saisie.
protected String paramString ()

Mthode de la classe Component, outrepasse pour renvoyer une chane de caractres dcrivant la zone de saisie.
Exemple

Applet TraitementTexte.
La classe java.awt.Scrollbar

Cette classe qui drive de la classe Component, est la classe du package java.awt qui permet de crer et de manipuler des ascenseurs. Une fois cr un objet de classe Scrollbar, vous devez l'ajouter un container avec la mthode add () de la classe Container, pour le visualiser.
Champs
public final static int HORIZONTAL public final static int VERTICAL

Constantes utilises pour prciser l'orientation d'un ascenseur.


Constructeurs
public Scrollbar () public Scrollbar (int orientation) public Scrollbar (int orientation, int value, int visible,
Programmer en java Page 287

Dao Issiaka- 3me anne SI

int minimum, int maximum )

Ces constructeurs permettent de crer un ascenseur en prcisant ventuellement son orientation gale HORIZONTAL ou VERTICAL (valeur par dfaut). minimum et maximum sont des entiers reprsentant les valeurs logiques minimale et maximale que peut prendre l'ascenseur (par exemple, 0 et 100 ou -500 et 500). On entend par logique que ces valeurs ne sont pas des valeurs en pixels ou reprsentant une grandeur physique de l'ordinateur, ce sont des valeurs arbitraires qui n'ont un sens que dans la logique de votre programme (nombre de lignes, valeurs sur un axe de coordonnes,...). value reprsente la position logique initiale de l'ascenseur (comprise entre minimum et maximum). visible reprsente la taille logique de la portion visible ; par exemple, si un ascenseur verticale est associ un dessin dont vous ne pouvez afficher que le tiers en hauteur, visible sera gal (maximum - minimum) / 3.
Mthodes
public synchronized void addNotify ()

Cette mthode outrepasse la mthode addNotify () de la classe Component pour crer le peer d'un ascenseur.
public int getOrientation ()

Renvoie l'orientation de l'ascenseur ( HORIZONTAL ou VERTICAL).


public int getValue () public void setValue (int value)

Ces mthodes permettent d'interroger ou de modifier la position courante d'un ascenseur. Si value est plus petite que le minimum de l'ascenseur ou plus grande que le maximum de l'ascenseur, ces valeurs prennent respectivement value pour nouvelle valeur (ceci permet de rajouter facilement des "pages").
public int getMinimum () public int getMaximum () public int getVisible ()

Ces mthodes permettent d'interroger le minimum, le maximum et la taille logique de la portion visible d'un ascenseur.
public int getLineIncrement () public void setLineIncrement (int increment)

Ces mthodes permettent d'interroger ou de modifier la valeur increment ajouter ou retrancher la valeur de la position courante, quand l'utilisateur clique sur les flches de l'ascenseur.
public int getPageIncrement () public void setPageIncrement (int increment)

Ces mthodes permettent d'interroger ou de modifier la valeur increment ajouter ou retrancher la valeur de la position courante, quand l'utilisateur clique dans l'ascenseur.
Programmer en java Page 288

Dao Issiaka- 3me anne SI

public void setValues (int value, int visible, int minimum, int maximum)

Modifie la valeur courante, la taille logique de la portion visible, le minimum et le maximum d'un ascenseur.
protected String paramString ()

Mthode de la classe Component, outrepasse pour renvoyer une chane de caractres dcrivant l'ascenseur.
Comment a marche ?

Afin de comprendre l'enchanement des diffrentes mthodes appeles par le navigateur et une applet, l'applet suivante vous montre le comportement d'une applet simple utilisant un bouton, dont voici le programme (simplifi) :
import java.applet.Applet; import java.awt.*; public class AppletButton extends Applet { public void init () { Button bouton = new Button ("OK"); add (bouton); } }

Sous le bouton, une liste affichant l'ensemble des appels aux mthodes a t ajoute.
Le peer d'un composant

Si vous pouvez visualiser cette page sous diffrents systmes, vous verrez que les composants du package java.awt prennent chaque fois l'aspect de ceux du systme sur lequel le navigateur fonctionne. En regardant le programme Java des classes Component ou de ses drives, vous dcouvrirez que toutes ces classes ne comportent aucune instruction spcifique chacun des systmes : par exemple, la classe Button dcrite dans le fichier Button.java, est la mme pour toutes les Machines Virtuelles Java que vous soyez sous Windows, Mac OS, UNIX,... Comment ceci est-il possible alors qu'un bouton n'a pas le mme aspect et est gr diffremment sous chacun de ces systmes ? En fait, chaque composant du package java.awt a son pair (peer en anglais) auquel il est associ. La classe de ce deuxime objet implmente l'interface Peer associe la classe du composant (par exemple l'interface ButtonPeer pour un composant de classe Button). Cet objet est mmoris dans le champ private peer de la classe Component. L'ensemble des interfaces Peer sont dclares dans le package java.awt.peer. Le champ peer d'interface ComponentPeer permet de mmoriser un objet dont la classe implmente cette interface ou une de ses drives comme par exemple ButtonPeer. Pour crer un objet d'interface ButtonPeer, il faut qu'il existe quelque part une classe implmentant cette interface. Si vous effectuez une recherche dans toutes les classes du package java.awt, vous verrez que Java ne fournit aucune classe implmentant ButtonPeer
Programmer en java Page 289

Dao Issiaka- 3me anne SI

!?! Et c'est l qu'est l'astuce : chaque Machine Virtuelle fournit des classes dont l'utilisateur n'a pas connaissance et qui implmentent chacune des interfaces Peer. Ces classes dclarent des mthodes native, dont l'implmentation fait appel aux fonctions du systme sur lequel la Machine Virtuelle fonctionne (comme par exemple la fonction CreateWindow () utilise pour crer un composant sous Windows). Reste une chose : Comment sont lies les classes de composant du package java.awt et les classes de la machine virtuelle implmentant les interfaces Peer ? Par exemple, comment la classe Button fait pour retrouver la classe qui implmente l'interface ButtonPeer, pour pouvoir crer un objet de cette classe ? Il existe une classe Toolkit qui est abstract. En observant cette classe vous verrez qu'il existe toutes les mthodes qui permettent de crer un objet d'interface Peer, et notamment la mthode createButton () qui renvoie un objet d'interface ButtonPeer. Toutes ces mthodes de cration sont abstract. La Machine Virtuelle dfinit une classe drivant de Toolkit qui implmente toutes ces mthodes abstract. Par exemple, la mthode createButton () va tre implmente de manire crer une instance de la classe implmentant ButtonPeer. Le nom de la classe drive de Toolkit est mmorise dans la proprit "awt.toolkit". Grce cette proprit, la mthode static getDefaultToolkit () de la classe Toolkit peut, en appelant System.getProperty ("awt.toolkit"), retrouver le nom de cette classe et l'instancier avec Class.forName (nomClasseDeriveeDeToolkit).newInstance (). Ainsi, aprs avoir obtenu une instance de Toolkit, un bouton cre son pair en appelant createButton (), et le tour est jou ! L'appel aux fonctions de la classe Toolkit, s'effectue dans la mthode addNotify () d'un composant et non dans le constructeur d'un composant. Cette mthode est invoque soit quand on ajoute un composant un container avec la mthode add (), soit pour les fentres dont la classe drive de Window quand on appelle la mthode show (). La mthode show () appelle addNotify () pour la fentre et pour tous les composants qui lui ont t ajouts. En conclusion, les classes de composants du package java.awt sont en fait des reprsentations logiques des composants et leur objet peer est une reprsentation l'cran du composant. Pour mieux visualiser le raisonnement prcdent, la figure suivante montre l'enchanement des mthodes appeles pour crer un bouton :

Programmer en java

Page 290

Dao Issiaka- 3me anne SI

figure 14. Etapes de la cration d'un bouton

Si vous ne matrisez pas encore la notion d'interface ou le fonctionnement des composants d'une interface utilisateur, vous risquez srement de trouver fumeuse l'explication prcdente. Aprs avoir crit quelques programmes Java, votre curiosit vous amnera peut-tre y revenir. De toute faon, ce raisonnement a t construit en consultant le code source de Java alors n'hsitez pas faire de mme pour plus de renseignements. Ce systme comporte deux inconvnients importants :

Vous ne pouvez pas modifier l'aspect d'un composant prdfini car c'est le peer de ces composants qui gre leur dessin. Donc, si par exemple, vous voulez crer un bouton affichant un dessin la place d'un texte, ne crez pas une classe drive de Button en outrepassant la mthode paint (), mais plutt une classe drive de Canvas. Ceci implique que dans cette classe, vous devrez non seulement redessiner entirement le bouton en outrepassant la mthode paint (), mais en plus reprogrammer son comportement (enfoncement, relchement, ...). La taille d'un composant prdfini ne peut tre connue ou modifie tant que sa mthode addNotify () n'a pas encore t appele. En effet, la taille d'un composant est tablie qu'une fois que son peer a t cr. Ce n'est qu' partir de ce moment que vous pouvez interroger sa taille prfre ou modifier sa taille.

La classe java.awt.Toolkit

Cette classe abstract dclare un ensemble de mthodes abstract appeles pour crer le peer des composants, des menus du package java.awt, grer les images et obtenir des informations sur l'interface graphique. Pour obtenir une instance de cette classe, vous pouvez
Programmer en java Page 291

Dao Issiaka- 3me anne SI

appelez la mthode getToolkit () de la classe Component ou la mthode static getDefaultToolkit () de cette classe.
Mthodes
protected protected protected protected protected protected protected protected protected protected protected protected protected protected protected protected protected protected abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract ButtonPeer createButton (Button target) ChoicePeer createChoice (Choice target) ListPeer createList (List target) CheckboxPeer createCheckbox (Checkbox target) LabelPeer createLabel (Label target) TextAreaPeer createTextArea (TextArea target) TextFieldPeer createTextField (TextField target) ScrollbarPeer createScrollbar (Scrollbar target) CanvasPeer createCanvas (Canvas target) PanelPeer createPanel (Panel target) FramePeer createFrame (Frame target) WindowPeer createWindow (Window target) DialogPeer createDialog (Dialog target) FileDialogPeer createFileDialog (FileDialog target) MenuBarPeer createMenuBar (MenuBar target) MenuItemPeer createMenuItem (MenuItem target) MenuPeer createMenu (Menu target) CheckboxMenuItemPeer createCheckboxMenuItem (CheckboxMenuItem target)

Ces mthodes sont appeles dans les mthodes addNotify () des classes de composants passs en paramtre, pour crer le peer de ce composant. Vous n'avez pas appeler ces mthodes.
public abstract Dimension getScreenSize ()

Renvoie la taille de l'cran.


public abstract int getScreenResolution ()

Renvoie la rsolution de l'cran en points par pouce (dpi).


public abstract ColorModel getColorModel ()

Renvoie le modle de couleur utilis.


public abstract String [ ] getFontList ()

Renvoie la liste des polices de caractres disponibles.


public abstract FontMetrics getFontMetrics (Font font)

Renvoie la taille de la police de caractres font.


public abstract void sync ()

Synchronise l'affichage graphique ; cette mthode peut tre utile pour raliser des animations.
public abstract Image getImage (String filename) public abstract Image getImage (URL url)

Programmer en java

Page 292

Dao Issiaka- 3me anne SI

Ces mthodes permettent d'obtenir l'image du fichier filename ou l'URL url. L'image n'est effectivement charge qu' sa premire utilisation (voir le chargement des images).
public abstract boolean prepareImage (Image image, int width, int height, ImageObserver observer) public abstract int checkImage (Image image, int width, int height, ImageObserver observer)

Ces mthodes permettent de grer le chargement d'une image.


public abstract Image createImage (ImageProducer producer)

Permet de crer une image.


public synchronized static Toolkit getDefaultToolkit ()

Renvoie le toolkit par dfaut.


Exemples

Applets ListePolices et BoutonsNavigation.

Programmer en java

Page 293

Dao Issiaka- 3me anne SI

Les containers et la disposition des composants


Les containers La disposition des composants : les layouts Les menus

Les containers L'architecture container/composant

Les containers sont des composants qui contiennent d'autres composants. Ce type d'architecture donne aux containers un ensemble de caractristiques qui leur sont propres :

Chaque container mmorise la liste des composants qu'on lui ajoute avec les mthodes add () ou qu'on lui enlve avec les mthodes remove () et removeAll (). Un container dispose l'cran les composants qu'il contient, grce un layout qui lui est associ. Il s'occupe d'envoyer les vnements qui surviennent (clic de souris, touche du clavier,...) au composant concern ou de les traiter lui-mme.

Il existe ainsi une relation entre un container et ses composants. Comme un composant peut tre lui-mme un container contenant d'autres composants, l'ensemble de ces relations parentenfant peut se dcrire sous forme d'un arbre, comme dans l'applet suivante, qui reproduit les commandes Couper / Copier / Coller / Effacer d'un traitement de texte :

Voici le programme Java correspondant ( copier dans un fichier dnomm TraitementTexte.java et invoqu partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; import java.util.Date; public class TraitementTexte extends Applet { private TextArea texte = new TextArea (); private String texteCopie = ""; public void init () { // Choix d'un layout BorderLayout (FlowLayout par dfaut) setLayout (new BorderLayout ()); // Cration d'une barre de boutons avec les commandes
Programmer en java Page 294

Dao Issiaka- 3me anne SI

// Couper/Copier/Coller/Effacer (layout FlowLayout par dfaut) Panel panel = new Panel (); panel.add (new Button ("Couper")); panel.add (new Button ("Copier")); panel.add (new Button ("Coller")); panel.add (new Button ("Effacer")); // Ajout en haut de la barre de boutons add ("North", panel); // Ajout au centre de la zone de saisie add ("Center", texte); // Ajout en bas d'un label add ("South", new Label ( "Du C/C++ a Java " + new Date ().toLocaleString ())); } // Mthode appele par la machine virtuelle quand on clique sur un bouton public boolean action (Event event, Object eventArg) { if ("Couper".equals (eventArg)) { // Simulation d'une action Copier/Effacer postEvent (new Event (this, Event.ACTION_EVENT, "Copier")); postEvent (new Event (this, Event.ACTION_EVENT, "Effacer")); } else if ("Copier".equals (eventArg)) // Rcupration du texte slectionn texteCopie = texte.getSelectedText (); else if ("Coller".equals (eventArg)) // Remplacement de la slection par texteCopie texte.replaceText (texteCopie, texte.getSelectionStart (), texte.getSelectionEnd ()); else if ("Effacer".equals (eventArg)) // Remplacement de la slection par rien texte.replaceText ("", texte.getSelectionStart (), texte.getSelectionEnd ()); return true; } }

Les relations entre les composants de l'applet prcdente dcrivent l'arbre suivant :

figure 15. Arbre des composants de l'applet TraitementTexte

Programmer en java

Page 295

Dao Issiaka- 3me anne SI

Ne mlangez pas les concepts de graphe d'hritage entre classes et de graphe de parent entre composants !... Ces liens de parent ne sont le rsultat que de la composition entre classes : chaque composant mmorise dans un champ private, une rfrence sur son parent que l'on peut obtenir grce la mthode getParent () de la classe Component. Chaque composant et par consquent chaque container possde son propre systme de coordonnes. L'origine de ce repre est situ en haut gauche du composant, l'axe des x va vers la droite, et l'axe des y vers le bas. Ceci forme un repre indirect, ce qui n'est pas trs pratique pour afficher des courbes mathmatiques, mais comme presque tous les systmes informatiques utilisent cette convention... Chaque composant (container ou pas) est positionn dans le repre du container qui le contient, c'est--dire que dans l'exemple prcdent, le bouton Copier est positionn par rapport au repre du container de classe Panel qui le contient, et ce container est positionn dans le repre de l'applet. La mthode location () de la classe Component invoque sur ce bouton vous renverra donc les coordonnes du bouton dans son parent et non dans l'applet ; de mme, si vous utilisez la mthode move (x, y) de la classe Component pour placer un composant comp, il faut fournir des coordonnes (x,y) relatives au container qui contient comp. Les containers sont gnralement utiliss pour y ajouter des composants mais vous pouvez aussi y afficher des dessins fabriqus avec les mthodes de la classe Graphics en outrepassant par exemple la mthode paint () de la classe Component. Mais vitez de mlanger ces deux styles, car les composants sont disposs par un layout des positions qui ne sont pas toujours les mmes suivant les systmes, et vos dessins pourraient tre recouverts par des composants. Il vaut mieux dans ce cas crer une nouvelle classe de composant CanvasDessin drivant de Canvas, o vous effectuez vos dessins, puis ajouter une instance de CanvasDessin au container.
La classe java.awt.Container

Cette classe abstract qui drive de la classe Component, est la super classe de toutes les classes de container. Elle dfinit notamment un certains nombres de mthodes, qui permettent d'ajouter ou d'enlever des composants aux containers, ou qui disposent les composants dans un container grce son layout associ.
Mthodes
public Component add (Component comp) public synchronized Component add (Component comp, int pos) public synchronized Component add (String name, Component comp)

Ces mthodes permettent d'ajouter le composant comp un container et de crer le lien parentenfant. Le container garde une liste ordonne des composants qui lui sont ajouts, ce qui permet aux layouts de les disposer dans cet ordre si ncessaire. Par dfaut, pos = -1, ce qui implique que le composant est ajout la fin de la liste des composants. La troisime mthode, en plus d'ajouter le composant en fin de liste, appelle la mthode addLayoutComponent (name, comp) de l'interface LayoutManager, si le container a un layout. Certaines classes de layout comme BorderLayout, implmentent cette mthode pour utiliser les informations contenues dans name et placer le composant autrement qu'en utilisant
Programmer en java Page 296

Dao Issiaka- 3me anne SI

uniquement son numro d'ordre. Si le peer du container existe dj, ces mthodes appellent la mthode addNotify () du composant comp.
public synchronized void remove (Component comp) public synchronized void removeAll ()

Ces mthodes permettent d'enlever le composant comp ou tous les composants d'un container. Si vous ajoutez ou enlevez un composant d'un container qui est dj l'cran, n'oubliez pas d'appeler la mthode validate () sur le container, sinon votre container restera inchang l'cran (voir l'exemple de la classe BorderLayout).
public int countComponents ()

Renvoie le nombre de composants que contient un container.


public synchronized Component getComponent (int n) throws ArrayIndexOutOfBoundsException public synchronized Component [ ] getComponents ()

Ces mthodes renvoient le nime composant ou tous les composants d'un container.
public LayoutManager getLayout () public void setLayout (LayoutManager manager)

Ces mthodes permettent d'interroger ou de modifier le layout utilis par un container. Toutes les classes drives de container ont un layout par dfaut.
public synchronized void layout ()

Mthode de la classe Component, outrepasse pour disposer les composants d'un container.
public synchronized void validate ()

Mthode de la classe Component, outrepasse pour mettre jour tous les composants d'un container invalide.
public Insets insets ()

Renvoie la largeur des bordures du container en haut, en bas, gauche et droite. Comme cette mthode interroge le peer du container, les valeurs renvoyes ne sont valides que si son peer existe dj.
public synchronized Dimension preferredSize () public synchronized Dimension minimumSize ()

Ces mthodes renvoient la taille prfre et la taille minimum d'un container. Si le container a un layout, ces mthodes renvoient les dimensions respectivement donnes par les mthodes preferredLayoutSize () et minimumLayoutSize () de l'interface LayoutManager.
public void paintComponents (Graphics g) public void printComponents (Graphics g)
Programmer en java Page 297

Dao Issiaka- 3me anne SI

Ces mthodes redessine ou imprime tous les composants d'un container.


public void deliverEvent (Event e)

Cette mthode qui outrepasse celle de la classe Component est utilise pour la gestion vnementielle (voir le chapitre suivant).
public Component locate (int x, int y)

Mthode de la classe Component outrepasse pour rechercher le composant situ au point de coordonnes (x,y) d'un container.
public synchronized void addNotify ()

Cette mthode outrepasse la mthode addNotify () de la classe Component pour appeler la mthode addNotify () sur chacun des composants du container.
public synchronized void removeNotify ()

Cette mthode outrepasse la mthode removeNotify () de la classe Component pour appeler la mthode removeNotify () sur chacun des composants du container.
protected String paramString ()

Mthode de la classe Component, outrepasse pour renvoyer une chane de caractres dcrivant le container.
public void list (PrintStream out, int indent)

Mthode de la classe Component, outrepasse pour imprimer sur out la chane de caractres dcrivant le container et tous composants.
La classe java.awt.Panel

Cette classe qui drive des classes Container et Component, permet de crer un container utilis comme zone d'affichage pour y ajouter des composants ou pour y dessiner directement avec les mthodes de classe Graphics. Le layout utilis par dfaut par la classe Panel est la classe FlowLayout. Cette classe est la super classe Applet.
Constructeur
public Panel ()

Mthode
public synchronized void addNotify ()

Cette mthode outrepasse la mthode addNotify () de la classe Container pour crer le peer d'un panel puis appeler la mthode addNotify () de la classe Container.
Exemples

Applets TraitementTexte, DrawIt, ListePolices et Nuancier.


Programmer en java Page 298

Dao Issiaka- 3me anne SI

La classe java.awt.Window

Cette classe qui drive des classes Container et Component, permet de crer une fentre sans bord, ni titre, ni menu. Contrairement ses classes drives Dialog et Frame, elle est peu utile mais peut servir par exemple comme bannire au lancement d'un programme, pour afficher une image. Le layout utilis par dfaut par la classe Window est la classe BorderLayout. N'oubliez pas d'appeler la mthode show () pour afficher une fentre et de la dimensionner la taille correcte avec les mthodes pack () ou les mthodes resize () ou reshape () de la classe Component.
Constructeur
public Window (Frame parent)

Ce constructeur construit une fentre invisible dont le parent parent doit tre de classe Frame ou ses drives.
Mthodes
public synchronized void addNotify ()

Cette mthode outrepasse la mthode addNotify () de la classe Container pour crer le peer d'une fentre puis appeler la mthode addNotify () de la classe Container.
public synchronized void pack ()

Cette mthode permet de dimensionner la fentre la taille donne par la mthode preferredSize () de la classe Container. Si les peers de la fentre et des composants qu'elle contient n'existent pas encore, ceux-ci sont crs pour que la taille renvoye soit correcte.
public void show ()

Mthode de la classe Component, outrepasse pour afficher la fentre et les composants qu'elle contient. Si la fentre est dj visible, la fentre est ramene devant toutes les autres. Cette mthode appelle la mthode addNotify (), ce qui a pour consquence de crer l'cran la fentre et tous les composants qui lui ont t ajouts. Vous devez appeler au moins une fois cette mthode par fentre car elles sont cres invisibles. Le parent de la fentre n'a pas forcment besoin d'tre visible pour que cette mthode fonctionne.
public synchronized void dispose ()

Dtruit une fentre. Vous devez appeler cette mthode pour que la fentre l'cran soit effectivement dtruite.
public void toFront () public void toBack ()

Ces mthodes ramne une fentre devant ou derrire toutes les autres.
Programmer en java Page 299

Dao Issiaka- 3me anne SI

public Toolkit getToolkit ()

Mthode de la classe Component, outrepasse pour renvoyer le kit d'outils (Toolkit) par dfaut utilis pour la cration du peer d'un composant.
public final String getWarningString ()

Renvoie le warning d'une fentre. Ce type de message est affich dans les fentres cres dans un navigateur.
La classe java.awt.Frame

Cette classe qui drive des classes Window, Container et Component et implmente l'interface MenuContainer permet de crer une fentre indpendante avec un cadre, un titre, et ventuellement un menu et un pointeur de souris propre.
Champs
public public public public public public public public public public public public public public final final final final final final final final final final final final final final static static static static static static static static static static static static static static int int int int int int int int int int int int int int DEFAULT_CURSOR CROSSHAIR_CURSOR TEXT_CURSOR WAIT_CURSOR SW_RESIZE_CURSOR SE_RESIZE_CURSOR NW_RESIZE_CURSOR NE_RESIZE_CURSOR N_RESIZE_CURSOR S_RESIZE_CURSOR W_RESIZE_CURSOR E_RESIZE_CURSOR HAND_CURSOR MOVE_CURSOR

Ces constantes reprsentent les pointeurs de souris prdfinis que vous pouvez choisir dans une fentre avec la mthode setCursor ().
Constructeurs
public Frame () public Frame (String title)

Ces constructeurs crent une fentre avec ou sans titre title.


Mthodes
public synchronized void addNotify ()

Cette mthode outrepasse la mthode addNotify () de la classe Window pour crer le peer d'une fentre et son ventuel menu, puis appeler la mthode addNotify () de la classe Window.
public String getTitle () public void setTitle (String title)

Ces mthodes permettent d'interroger ou de modifier le titre d'une fentre.

Programmer en java

Page 300

Dao Issiaka- 3me anne SI

public Image getIconImage () public void setIconImage (Image image)

Ces mthodes permettent d'interroger ou de modifier l'image utilise quand une fentre est icnifie, mais tous les systmes n'utilisent pas cette caractristique.
public MenuBar getMenuBar () public synchronized void setMenuBar (MenuBar menubar)

Ces mthodes permettent d'interroger ou de modifier la barre de menu utilise pour une fentre.
public synchronized void remove (MenuComponent menu)

Enlve le menu menu de la fentre.


public synchronized void dispose ()

Mthode de la classe Window, outrepasse pour dtruire une fentre. Vous devez appeler cette mthode pour que la fentre l'cran soit effectivement dtruite.
public boolean isResizable ()

Renvoie true si la fentre est redimensionnable interactivement.


public void setResizable (boolean resizable)

Permet de spcifier si une fentre est redimensionnable interactivement ou non.


public int getCursorType () public void setCursor (int cursorType)

Ces mthodes permettent d'interroger ou de modifier le curseur de souris utilis dans une fentre. cursorType doit tre une des constantes dont la liste est donne avec les champs.
protected String paramString ()

Mthode de la classe Container, outrepasse pour renvoyer une chane de caractres dcrivant la fentre.
Exemples

Applets BorderBuilder et ShowMenu. Application TraitementTexte.


Transformer une applet en application isole

La classe d'une applet hritant de la classe Panel, il est possible d'ajouter une applet une fentre de classe Frame. Grce cette caractristique, vous pouvez ajouter la plupart de vos applets la facult d'tre utilises comme applications isoles, en leur ajoutant une mthode main () qui cre une instance de Frame pour y ajouter une instance de votre applet (les limitations de ce systme sont dcrites au chapitre sur les applets).
Programmer en java Page 301

Dao Issiaka- 3me anne SI

Voici par exemple comment transformer l'applet de classe TraitementTexte dfinie au dbut de ce chapitre pour en faire une application isole :
public class TraitementTexte extends Applet { // Code prcdemment dfini... public static void main (String [ ] args) { // Cration d'une fentre et d'une instance de l'applet Frame fenetreApplet = new Frame ("TraitementTexte"); Applet applet = new TraitementTexte (); // Ajout de l'applet la fentre puis affichage de la fentre fenetreApplet.add ("Center", applet); fenetreApplet.show (); fenetreApplet.resize (300, 200); // Dmarrage de l'applet applet.init (); fenetreApplet.validate (); } }

La classe java.awt.Dialog

Cette classe qui drive des classes Window, Container et Component permet de crer une boite de dialogue avec un cadre et un titre. Les boites de dialogues ont un parent de classe Frame, et peuvent tre modale ou non. Une boite de dialogue qui est modale bloque toute entre dans les autres fentres tant qu'elle est ouverte. Quand une boite de dialogue est modale, l'utilisateur ne peut plus manipuler que cette boite de dialogue et plus les autres fentres cres par la Machine Virtuelle Java. A l'appel de la mthode show () sur une boite de dialogue modale dialog1, la boite de dialogue est affiche et les instructions qui suivent show () ne sont excutes qu'une fois que dialog1 est dtruite. N'oubliez donc pas de dtruire avec la mthode dispose () vos boites de dialogues modales une fois son traitement termin.
Constructeurs
public Dialog (Frame parent, boolean modal) public Dialog (Frame parent, String title, boolean modal)

Ce constructeur construit une boite de dialogue invisible avec ou sans titre title, dont le parent parent doit tre de classe Frame ou ses drives. Cette boite de dialogue peut tre modale ou non.
Mthodes
public synchronized void addNotify ()

Cette mthode outrepasse la mthode addNotify () de la classe Window pour crer le peer d'une boite de dialogue, puis appeler la mthode addNotify () de la classe Window.
public boolean isModal ()
Programmer en java Page 302

Dao Issiaka- 3me anne SI

Renvoie true si la boite de dialogue est modale.


public String getTitle () public void setTitle (String title)

Ces mthodes permettent d'interroger ou de modifier le titre d'une boite de dialogue.


public boolean isResizable ()

Renvoie true si la boite de dialogue est redimensionnable interactivement.


public void setResizable (boolean resizable)

Permet de spcifier si une boite de dialogue est redimensionnable interactivement ou non.


protected String paramString ()

Mthode de la classe Container, outrepasse pour renvoyer une chane de caractres dcrivant la boite de dialogue. La bibliothque Java ne fournissant pas en standard une boite de dialogue affichant simplement un message, voil l'applet MessageBoxApplet qui peut vous servir de base pour en raliser une :

Voici le programme Java correspondant ( copier dans un fichier dnomm MessageBoxApplet.java et invoqu partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; public class MessageBoxApplet extends Applet { public void init () { add (new Button ("Afficher message")); } // Mthode appele par la machine virtuelle quand on clique sur le bouton public boolean action (Event event, Object eventArg) { MessageBox.showMessageBox(this, "Message", "Ceci est un message..."); return true; } } class MessageBox extends Dialog { private MessageBox (Frame frame, String titre) { // Appel du constructeur de la classe Dialog en mode modal super (frame, titre, true); } static public void showMessageBox (Component
Programmer en java

parent,
Page 303

Dao Issiaka- 3me anne SI

String String { // Recherche du parent qui est un Frame Component frame = parent; while ( frame != null && !(frame instanceof Frame)) frame = frame.getParent ();

titre, message)

// Cration d'une instance de MessageBox MessageBox boite = new MessageBox ((Frame)frame, titre); // Ajout du message et d'un bouton Ok boite.add ("Center", new Label (message)); boite.add ("East", new Button ("Ok")); // Affichage de la boite de message // show () ne rend la main que quand la boite est dtruite boite.setResizable (false); boite.pack (); boite.show (); } // Mthode appele quand on clique sur Ok public boolean action (Event event, Object eventArg) { // Destruction de la boite de message dispose (); return true; } }

La classe java.awt.FileDialog

Cette classe qui drive des classes Dialog, Window, Container et Component permet de crer une boite de dialogue modale de saisie de fichier. Comme pour tous les composants du package java.awt, cette boite de dialogue est celle communment utilise avec le systme sur lequel fonctionne la Machine Virtuelle Java. Comme cette classe donne accs au systme de fichiers, certains navigateurs interdisent tout simplement de s'en servir.
Champs
public final static int LOAD public final static int SAVE

Ces constantes sont utilises pour choisir le mode de saisie du fichier de la boite de dialogue (Ouvrir ou Enregistrer).
Constructeurs
public FileDialog (Frame parent, String title) public FileDialog (Frame parent, String title, int mode)

Ce constructeur construit une boite de dialogue invisible de saisie de fichier avec ou sans titre title, dont le parent parent doit tre de classe Frame ou ses drives. Par dfaut, le mode saisie est LOAD.

Programmer en java

Page 304

Dao Issiaka- 3me anne SI

Mthodes
public synchronized void addNotify ()

Cette mthode outrepasse la mthode addNotify () de la classe Dialog pour crer le peer d'une boite de dialogue de saisie de fichier, puis appeler la mthode addNotify () de la classe Dialog.
public int getMode ()

Ces mthodes permettent d'interroger le mode saisie du fichier (LOAD ou SAVE).


public void setDirectory (String dir) public void setFile (String file)

Ces mthodes permettent de modifier le rpertoire et le fichier utiliser l'ouverture de la boite de dialogue.
public String getDirectory () public String getFile ()

Ces mthodes permettent d'interroger le rpertoire et le fichier saisis dans la boite de dialogue. Si l'utilisateur a annul la saisie, ces mthodes renvoient null.
public FilenameFilter getFilenameFilter () public void setFilenameFilter (FilenameFilter filter)

Ces mthodes permettent d'interroger ou de modifier le filtre utilis pour la saisie du fichier, par exemple pour n'accepter que les fichiers se terminant par .java (ce qui correspondrait *.java).
protected String paramString ()

Mthode de la classe Container, outrepasse pour renvoyer une chane de caractres dcrivant la boite de dialogue de saisie de fichier.
La disposition des composants : les layouts

Associ chaque container, existe un gestionnaire qui permet de disposer les ventuels composants que contient le container : ce sont les layouts. Il est conseill d'utiliser ce type de gestionnaire pour indiquer la position des composants plutt que les coordonnes pixel qui ne garantissent pas le mme rendu sur chacune des plateformes o peuvent fonctionner une applet (par exemple, un bouton n'a pas le mme aspect ni la mme taille sous tous les systmes). Globalement, il existe trois solutions pour donner une position un composant :

En utilisant une des cinq classes de layout fournies avec Java : FlowLayout, BorderLayout, GridLayout, GridBagLayout ou CardLayout. En crant et en utilisant une classe de layout qui implmente l'interface LayoutManager. Cette interface dclare un ensemble de mthodes qui permettent de grer et de placer les composants d'un container (Les cinq classes prcdentes implmentent cette interface).

Programmer en java

Page 305

Dao Issiaka- 3me anne SI

En n'utilisant aucun layout (grce setLayout (null)) et en plaant les composants " la main" dans le container, au pixel prs grce aux mthodes move (), resize () ou reshape () de la classe Component. Dans ce cas, n'oubliez pas de prendre en compte la largeur des bordures du container renvoyes par la mthode insets () de la classe Container.

Le choix d'un layout se fait grce la mthode setLayout () de la classe Container. Les composants d'un container container1 sont positionns l'appel de la mthode layout () de la classe Container sur container1. Cette mthode appelle le gestionnaire qui dispose les composants dans le container. Elle est appele par la mthode validate () de la classe Component si le container ou un de ses composants ne sont pas valides ( leur premire visualisation, quand ils changent de taille,...). Quand le container est dj visualis, l'ajout (ou la suppression) d'un composant ce container n'appelle pas validate () automatiquement : il vous faut donc appeler cette mthode dans ce cas de figure pour mettre jour la disposition des composants dans le container (voir l'exemple de la classe BorderLayout). Les classes de Java drivant de la classe container utilisent un layout par dfaut : Les classes Panel et Applet utilisent la classe FlowLayout, et les classes Window, Dialog et Frame la classe BorderLayout. Si dans certains cas, les classes de layout fournies avec Java ne semblent pas vous convenir, n'oubliez pas avant d'envisager de crer un layout de toute pice que vous pouvez trs bien combiner les layouts existants. Chaque container tant luimme un composant, vous pouvez agencer une partie de vos composants en les incluant dans un sous-container (de classe Panel par exemple) qui disposera ces composants de manire diffrente que le layout du container principal. Donc, tudiez bien l'effet de chacun des layouts suivants et soyez imaginatifs ! Toutes les combinaisons sont possibles... L'exemple du paragraphe sur les containers combine deux layouts, l'un de classe BorderLayout et l'autre de classe FlowLayout. Si vous voulez n'utiliser aucun layout pour un container, il est trs fortement conseill d'outrepasser la mthode layout () de la classe Container pour y disposer vos composants. En effet, pour pouvoir placer sans problme vos composants leur peer doit exister. Le peer d'un container et de ses composants est cr l'appel de la mthode addNotify () de la classe Container. Cette mthode n'est pas appele au mme moment pour une applet et une fentre indpendante, mais elle est toujours suivie d'un appel validate () et donc d'un appel la mthode layout () :

Pour une applet, addNotify () est appele juste avant que le navigateur n'appelle les mthodes validate () et init () de la classe Applet (voir l'exemple dcrivant l'ensemble des mthodes appeles la cration d'une applet). Pour une fentre indpendante (de classe Frame ou Dialog par exemple), addNotify () est invoque par la mthode show () de la classe Window, qui appelle ensuite la mthode validate ().

Programmer en java

Page 306

Dao Issiaka- 3me anne SI

L'interface java.awt.LayoutManager

L'interface LayoutManager dclare cinq mthodes que doit dfinir toute classe qui l'implmente (mme si ces mthodes ne font rien).
Mthodes
public void addLayoutComponent (String name, Component component)

(name, component)

Mthode appele quand le composant component est ajout un container par la mthode add de la classe Container. Utiliser cette mthode si vous voulez mmoriser les informations supplmentaires dcrites dans name et associes au composant component pour le placer. Cette mthode est utilise par exemple par la classe BorderLayout. Rappelez-vous qu'il n'est pas obligatoire de mmoriser la liste de tous les composants d'un container, car la classe Container fournit la mthode getComponents () qui renvoient la liste de tous les composants ajouts un container.
public void removeLayoutComponent (Component component)

Mthode appele quand le composant component est enlev d'un container par la mthode remove (component) de la classe Container.
public Dimension preferredLayoutSize (Container parent)

Doit renvoyer les dimensions prfres du container parent auquel ont t ajouts des composants.
public Dimension minimumLayoutSize (Container parent)

Doit renvoyer les dimensions minimum du container parent auquel ont t ajouts des composants.
public void layoutContainer (Container parent)

Doit positionner les composants du container parent. Cette mthode est appele par la mthode layout () de la classe Container si le container parent utilise un layout. C'est donc cette mthode qui place les composants dans le container parent, en utilisant les mthodes move (), resize () ou reshape () de la classe Component et en prenant en compte la largeur des bordures du container renvoyes par la mthode insets () de la classe Container.
La classe java.awt.FlowLayout

Cette classe qui implmente l'interface LayoutManager, est le type de layout le plus simple. Les composants d'un container container1 gr par un FlowLayout sont positionns les uns derrire les autres, en partant du coin en haut gauche de container1, puis en occupant horizontalement au maximum la largeur de container1, avant de passer une ligne suivante. Chaque composant prend les dimensions que renvoie sa mthode preferredSize ().
Champs
public final static int LEFT
Programmer en java Page 307

Dao Issiaka- 3me anne SI

public final static int CENTER public final static int RIGHT

Constantes utilises pour l'alignement des composants dans le container (sur le bord gauche, au centre, ou sur le bord droit). Par dfaut, l'alignement est CENTER.
Constructeurs
public FlowLayout () public FlowLayout (int align) public FlowLayout (int align, int horizontalgap, int verticalgap)

Ces constructeurs permettent de crer un layout FlowLayout avec un alignement align (LEFT, CENTER ou RIGHT) et un espacement horizontal et vertical entre les composants de horizontalgap et verticalgap pixels (par dfaut gal 5).
Mthodes
public public public public public void addLayoutComponent (String name, Component comp) void removeLayoutComponent (Component comp) Dimension preferredLayoutSize (Container target) Dimension minimumLayoutSize (Container target) void layoutContainer (Container target)

Implmentation des mthodes de l'interface LayoutManager. addLayoutComponent () et removeLayoutComponent () ne font rien.


public String toString ()

Exemples

Les applets BorderBuilder , MiseAJourHorloge et BoutonsNavigation affichent leurs composants avec leur layout par dfaut de classe FlowLayout. L'applet TraitementTexte utilise une barre de boutons qui sont ajouts un sous-container de classe Panel utilisant son layout par dfaut de classe FlowLayout.
La classe java.awt.BorderLayout

Cette classe qui implmente l'interface LayoutManager, est un type de layout qui permet de grer la position d'au plus cinq composants : La position d'un composant component est dtermine grce la chane de caractres name passe en argument la mthode add (name, component) de la classe Container. Cette chane de caractres peut tre gal "North", "South", "East", "West" ou "Center". Les cinq composants (ou moins) sont redimensionns pour occuper l'espace du container en respectant dans l'ordre, les rgles suivantes :

Les composants "North" et "South" gardent la hauteur renvoye par leur mthode preferredSize () et sont agrandis en horizontal pour occuper toute la largeur du container. Les composants "West" et "East" gardent la largeur renvoye par leur mthode preferredSize () et sont agrandis en vertical pour occuper toute la hauteur restante du container. Le composant "Center" occupe le reste de l'espace du container.

Programmer en java

Page 308

Dao Issiaka- 3me anne SI

Cette classe de layout peut servir dans de nombreux types d'interfaces utilisateurs : Le composant "Center" peut reprsenter par exemple une zone de dessin ou d'dition de texte, les composants "North" et "West" tre utiliss pour afficher des barres d'outils et les composants "East" et "South" pour des ascenseurs (composant Scrollbar).
Constructeurs
public BorderLayout () public BorderLayout (int horizontalgap, int verticalgap)

Ces constructeurs permettent de crer un layout BorderLayout avec un espacement horizontal et vertical entre les composants de horizontalgap et verticalgap pixels (par dfaut gal 0).
Mthodes
public public public public public void addLayoutComponent (String name, Component comp) void removeLayoutComponent (Component comp) Dimension preferredLayoutSize (Container target) Dimension minimumLayoutSize (Container target) void layoutContainer (Container target)

Implmentation des mthodes de l'interface LayoutManager. L'implmentation de la mthode addLayoutComponent () mmorise pour chacune des cinq directions le composant qui lui est associ.
public String toString ()

Pour illustrer l'utilisation de la classe BorderLayout, voici un exemple d'applet permettant d'ajouter une fentre indpendante des boutons aux cinq positions possibles (La fentre s'affiche quand vous cliquez sur un des boutons et est indpendante pour que vous puissiez la redimensionner et observer les effets de la classe BorderLayout) :

et le programme Java correspondant ( copier dans un fichier dnomm BorderBuilder.java et invoqu partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; public class BorderBuilder extends Applet { // Cration des boutons de l'applet et du Frame Button [] appletButtons = {new Button ("Add North"), new Button ("Add South"), new Button ("Add West"), new Button ("Add East"), new Button ("Add Center")}; Button [] frameButtons = {new Button ("North"), new Button ("South"), new Button ("West"), new Button ("East"), new Button ("Center")}; Frame buttonsFrame;

Programmer en java

Page 309

Dao Issiaka- 3me anne SI

public void init () { // Ajout des boutons l'applet (par dfaut utilise FlowLayout) for (int i = 0; i < appletButtons.length; i++) add (appletButtons [i]); // Cration d'une fentre (par dfaut utilise BorderLayout) buttonsFrame = new Frame ("BorderLayout window"); buttonsFrame.resize (200, 200); } public void stop () { // A la fin de l'applet, destruction de la fentre buttonsFrame.dispose (); } // Mthode appele par la machine virtuelle quand on clique sur un bouton public boolean action (Event event, Object eventArg) { // Affichage de la fentre buttonsFrame.show (); for (int i = 0; i < appletButtons.length; i++) if (event.target == appletButtons [i]) { // Si le label du bouton commence par Add, if (appletButtons [i].getLabel ().startsWith ("Add")) { // Ajouter le bouton correspondant buttonsFrame buttonsFrame.add (frameButtons [i].getLabel (), frameButtons [i]); // Changer le nom du bouton de l'applet appletButtons [i].setLabel ("Remove " + frameButtons [i].getLabel ()); } else { // Sinon enlever le bouton correspondant de buttonsFrame buttonsFrame.remove (frameButtons [i]); // Changer le nom du bouton de l'applet appletButtons [i].setLabel ("Add " + frameButtons [i].getLabel ()); } // Mettre jour les composants de l'applet et de la fentre appletButtons [i].invalidate (); validate (); buttonsFrame.validate (); return true; } return super.action (event, eventArg); } }

La classe BorderLayout vous oblige vous servir de la mthode add (String name, Component component) de la classe Container pour ajouter les composants un container.

Programmer en java

Page 310

Dao Issiaka- 3me anne SI

Autres exemples

Applets TraitementTexte, MessageBoxApplet, DrawIt, ListePolices et Nuancier.


La classe java.awt.GridLayout

Cette classe qui implmente l'interface LayoutManager, est un layout permettant d'afficher les composants que contient un container sur une grille rgulire. Le nombre de lignes et de colonnes tant passs en argument au constructeur d'un layout GridLayout, la hauteur et la largeur d'un container container1 gr par un GridLayout sont divises par le nombre de lignes et de colonnes pour connatre la dimension de chaque cellule. Les composants de container1 sont ensuite positionns dans les cellules, en partant du coin en haut gauche de container1, puis colonne aprs colonne et ligne par ligne. Chaque composant prend les dimensions de la cellule qu'il occupe.
Constructeurs
public GridLayout (int rows, int cols) public GridLayout (int rows, int cols, int horizontalgap, int verticalgap)

Ces constructeurs permettent de crer un layout GridLayout avec une grille de rows lignes par cols colonnes, et un espacement horizontal et vertical entre les composants de horizontalgap et verticalgap pixels (par dfaut gal 0). Il n'est pas obligatoire de remplir entirement la grille d'un layout GridLayout, mais attention les lignes inoccupes restent vides ; donc vitez de crer un layout GridLayout avec de grandes dimensions en prvision de son remplissage, sinon les cellules seront toutes petites !
Mthodes
public public public public public void addLayoutComponent (String name, Component comp) void removeLayoutComponent (Component comp) Dimension preferredLayoutSize (Container target) Dimension minimumLayoutSize (Container target) void layoutContainer (Container target)

Implmentation des mthodes de l'interface LayoutManager. addLayoutComponent () et removeLayoutComponent () ne font rien.


public String toString ()

Exemples

Applets Unicode, DrawIt, ListePolices. L'applet GridBagBuilder de la classe GridBagLayout contient aussi un sous-container de classe Panel qui affiche les composants des 17 premires lignes et des 2 colonnes avec un layout de classe GridLayout.
La classe java.awt.GridBagLayout

Cette classe qui implmente l'interface LayoutManager, est le layout le plus complet et le plus complexe utiliser des layouts fournis avec Java. A chaque composant ajout un container gr par un layout GridBagLayout, sont associes des contraintes (constraints en anglais) dcrivant comment placer ce composant dans le
Programmer en java Page 311

Dao Issiaka- 3me anne SI

container. Ces contraintes sont dcrites par une instance de la classe GridBagConstraint et positionnes sur le composant grce la mthode setConstraints () de la classe GridBagLayout. Vu le nombre de paramtres utiliss par les contraintes, le placement des composants grs par un layout GridBagLayout est complexe et c'est pourquoi cette classe dfinit de nombreux champs et mthodes protected, vous permettant de modifier le comportement de cette classe dans une classe drive.
Champs
public public public public int int double double columnWidths [ ] rowHeights [ ] columnWeights [ ] rowWeights [ ]

protected final static int MAXGRIDSIZE protected final static int MINSIZE protected final static int PREFERREDSIZE protected Hashtable comptable protected GridBagConstraints defaultConstraints protected GridBagLayoutInfo layoutInfo

Constructeur
public GridBagLayout ()

Mthodes
public public public public public void addLayoutComponent (String name, Component comp) void removeLayoutComponent (Component comp) Dimension preferredLayoutSize (Container target) Dimension minimumLayoutSize (Container target) void layoutContainer (Container target)

Implmentation des mthodes de l'interface LayoutManager. addLayoutComponent () et removeLayoutComponent () ne font rien.


public void setConstraints (Component comp, GridBagConstraints constraints)

Positionne les contraintes sur un composant comp gr par un layout GridBagLayout.


public GridBagConstraints getConstraints (Component component)

Renvoie une copie des contraintes positionnes sur un composant gr par un layout GridBagLayout.
public public public public Point getLayoutOrigin () int [ ][ ] getLayoutDimensions () double [ ][ ] getLayoutWeights () Point location (int x, int y)

public String toString () protected GridBagLayoutInfo GetLayoutInfo (Container parent, int sizeflag) protected void AdjustForGravity (GridBagConstraints constraints, Rectangle r)
Programmer en java Page 312

Dao Issiaka- 3me anne SI

protected Dimension GetMinSize (Container parent, GridBagLayoutInfo info) protected void ArrangeGrid (Container parent)

Pour illustrer l'utilisation de la classe GridBagLayout, voici l'applet GridBagBuilder permettant d'ajouter une fentre indpendante le composant de votre choix et de positionner sur chacun des composants les contraintes proposes par la classe GridBagConstraints. La fentre s'affiche la premire utilisation d'un des composants de l'applet.
Mode d'emploi

Une fois la classe de votre composant choisie avec le champ Type de composant, vous pouvez saisir dans le champ Label, text ou item le label (pour les classes Button, Checkbox et Label), le texte (pour les classes TextArea et TextField) ou le premier item (pour les classe Choice et List) des nouveaux composants.Vous pouvez aussi positionner une ou plusieurs contraintes (gridx weighty) sur un composant avant de l'ajouter la fentre Composants avec le bouton Ajouter. Le champ Champ permet de saisir un nom de champ pour chacun des composants que vous ajoutez ; ce nom est celui utilis pour intituler chacune des champs du programme gnr dans le champ Programme copier : Vous pouvez slectionner le code Java crit dans ce champ, le copier puis le coller dans la dclaration d'une classe drivant de la classe Container (par exemple, une applet), pour crer les mmes composants que ceux de la fentre Composants. Le champ Composant courant permet de choisir un des composants crs pour le supprimer avec le bouton Supprimer ou le modifier avec le bouton Modifier aprs avoir positionner une ou plusieurs contraintes (gridx weighty) sur ce composant.

N'hsitez pas utiliser cet exemple pour bien comprendre (et utiliser dans vos programmes) le fonctionnement des classes GridBagLayout et GridBagConstraints.
La classe java.awt.GridBagConstraints

Cette classe qui implmente l'interface Cloneable, est utilise pour dcrire les contraintes sur le positionnement d'un composant inclus dans un container gr par un layout GridBagLayout Les diffrentes contraintes tant plutt complexes grer, il vous est conseill d'essayer l'applet GridBagBuilder pour essayer les diffrentes combinaisons possibles et comprendre leur effet. Cette applet gnre le code correspondant aux diffrentes contraintes choisies dans le champ Programme copier.
Champs
public final static int RELATIVE public final static int REMAINDER public public public public final final final final static static static static int int int int NONE BOTH HORIZONTAL VERTICAL

public final static int CENTER


Programmer en java Page 313

Dao Issiaka- 3me anne SI

public public public public public public public public

final final final final final final final final

static static static static static static static static

int int int int int int int int

NORTH NORTHEAST EAST SOUTHEAST SOUTH SOUTHWEST WEST NORTHWEST

public int gridx public int gridy

Permet de donner la position en x et y de la cellule que doit occuper un composant, relativement au coin suprieur gauche du container (dont la position est (0, 0)). Si gridx (ou respectivement gridy) est gal RELATIVE, le composant sera plac droite (ou respectivement en dessous) du composant prcdemment ajout au container par la mthode add () de la classe Container.
public int gridwidth public int gridheight

Permet de donner le nombre de cellules en largeur et en hauteur qu'un composant occupe. Si gridwith (ou respectivement gridheight) est gal REMAINDER, le composant sera le dernier sur une ligne (ou respectivement sur une colonne). Si gridwith (ou respectivement gridheight) est gal RELATIVE, le composant sera plac gauche (ou respectivement au dessus) du composant suivant.
public int fill

Permet de spcifier si un composant est redimensionn ou non pour occuper la(ou les) cellules qu'il occupe. Si fill est gal NONE, le composant prend la taille qu'il donne par la mthode preferredSize (). Si fill est gal BOTH, le composant est redimensionn pour occuper tout l'espace de la (ou des) cellules. Si fill est gal HORIZONTAL (ou respectivement VERTICAL) le composant prend la largeur (ou respectivement la hauteur) de la (ou les) cellules qu'il occupe.
public int ipadx public int ipady

Permet de donner la largeur et la hauteur supplmentaire que doit prendre le composant par rapport la taille qu'il donne par la mthode preferredSize ().
public Insets insets

Permet de donner l'espacement vide autour du composant.


public int anchor

Quand le composant est plus petit que la (ou les) cellules qu'il occupe, anchor permet de donner quel coin ou quel bord le composant est ancr (ou attach). anchor peut tre gal CENTER ou aux 8 points cardinaux : NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST ou NORTHWEST.
public double weightx
Programmer en java Page 314

Dao Issiaka- 3me anne SI

public double weighty

Permet de donner un poids au composant par rapport aux autres pour rpartir les composants horizontalement ou verticalement. Si tous les composants ont leurs contraintes weightx et weighty gales 0, l'ensemble des composants d'un container gr par un layout GridBagLayout occupe le minimum d'espace au milieu du container.
Constructeur
public GridBagConstraints ()

Le constructeur affecte aux champs de contraintes les valeurs par dfaut suivantes :
gridx, gridy : RELATIVE gridwidth, gridheight : 1 fill : NONE ipadx, ipady : 0 insets : new Insets (0, 0, 0, 0) anchor : CENTER weightx, weighty : 0

Mthode
public Object clone ()

A l'usage, vous vous rendrez compte que certaines contraintes ne se compltent pas toujours de manire trs heureuse... Evitez notamment d'utiliser, le mlange du positionnement absolu de gridx et gridy, avec l'utilisation de REMAINDER pour gridwidth et gridheight. Si l'utilisation des classes GridBagLayout et GridBagConstraints vous semble trop compliqu, n'hsitez pas utiliser plutt une combinaison de layouts.
La classe java.awt.CardLayout

Cette classe qui implmente l'interface LayoutManager, est un layout permettant d'ajouter un container une liste de sous-containers ou de composants qui sont affichs un par un, de manire similaire aux boites de dialogues onglets (mais sans les onglets).
Constructeurs
public CardLayout () public CardLayout (int horizontalgap, int verticalgap)

Ces constructeurs permettent de crer un layout CardLayout avec un espacement horizontal et vertical entre les composants de horizontalgap et verticalgap pixels (par dfaut gal 0).
Mthodes
public public public public public void addLayoutComponent (String name, Component comp) void removeLayoutComponent (Component comp) Dimension preferredLayoutSize (Container target) Dimension minimumLayoutSize (Container target) void layoutContainer (Container target)

Programmer en java

Page 315

Dao Issiaka- 3me anne SI

Implmentation des mthodes de l'interface LayoutManager. La mthode addLayoutComponent () utilise le paramtre name pour associer une chane de caractres au composant ou au container comp.
public public public public void void void void first (Container parent) next (Container parent) previous (Container parent) last (Container parent)

Ces mthodes permettent d'afficher le premier, le suivant, le prcdent ou le dernier de la liste des composants ou des sous-containers du layout. parent doit tre gal au container auquel est associ ce layout.
public void show (Container parent, String name)

Affiche le composant ou le sous-container associ la chane de caractres name. parent doit tre gal au container auquel est associ ce layout. Si vous voulez utiliser cette mthode, il faut que le composant ait t ajout au container avec la mthode add (String name, Component component) de la classe Container.
public String toString ()

Les menus

La cration de menus se fait trs simplement en Java, l'aide de 4 classes diffrentes qui hritent toutes de la classe MenuComponent. Une barre de menu se compose d'une instance de la classe MenuBar auquel vous pouvez ajouter grce la mthode add () un ou plusieurs menus instances de la classe Menu. Finalement, vous pouvez ajouter chaque menu grce la mthode add () de la classe Menu un ensemble d'lments instances des classes MenuItem (pour crer des lments simples), CheckboxMenuItem (pour crer des lments cocher) ou Menu (pour crer un sous-menu).

figure 16. Les diffrents composants d'un menu

La classe Frame est la seule classe de fentre pour laquelle vous pouvez spcifier une barre de menu, grce la mthode setMenuBar (). Par consquent, vous ne pouvez pas donner de menu aux applets, puisque leur classe n'hrite pas de la classe Frame. L'applet suivante permet de tester tous les diffrents types de menu dcrit ci-dessus (cliquez sur le bouton Nouveau Menu pour afficher la fentre utilisant un menu) :

Programmer en java

Page 316

Dao Issiaka- 3me anne SI

Voici le programme Java correspondant ( copier dans un fichier dnomm ShowMenu.java et invoqu partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; public class ShowMenu extends Applet { // Cration d'une instance de MenuFrame Frame fenetreMenu = new MenuFrame (); public void init () { // Ajout d'un bouton pour ouvrir une fentre add (new Button ("Nouveau Menu")); } public void stop () { // A la fin de l'applet, destruction de la fentre fenetreMenu.dispose (); } // Mthode appele par la machine virtuelle quand on clique sur un bouton public boolean action (Event event, Object eventArg) { // Affichage de la fentre if ("Nouveau Menu".equals (eventArg)) fenetreMenu.show (); return true; } } // Classe MenuFrame utilisant un menu class MenuFrame extends Frame { public MenuFrame () { // Cration d'une barre de menu et de 3 menus MenuBar menuBar = new MenuBar (); Menu menu1 = new Menu ("Menu 1"); Menu menu2 = new Menu ("Menu 2"); Menu menu3 = new Menu ("Sous menu"); // Ajout au premier menu de 2 lments et d'un sparateur menu1.add ("Choix 1"); menu1.addSeparator (); menu1.add ("Choix 2"); // Ajout au second menu d'un lment cocher // et d'un sous-menu menu2.add (new CheckboxMenuItem ("Choix")); menu2.add (menu3); // Ajout au sous-menu de 2 lments menu3.add (new MenuItem ("Sous choix 1")); menu3.add (new MenuItem ("Sous choix 2")); // Ajout la barre de menu des 2 premiers menus menuBar.add (menu1); menuBar.add (menu2);
Programmer en java Page 317

Dao Issiaka- 3me anne SI

// Choix de la barre de menu pour cette fentre setMenuBar (menuBar); resize (200, 50); } }

L'interface java.awt.MenuContainer

Cette interface doit tre implmente par les classes de containers permettant l'utilisation des menus, comme c'est le cas pour la classe Frame.
Mthodes
public Font getFont () public boolean postEvent (Event evt) public void remove (MenuComponent comp)

La classe java.awt.MenuComponent

La classe MenuComponent qui est abstract est la super classe de toutes les classes de composants utilisables dans un menu (MenuBar, MenuItem, Menu et CheckboxMenuItem). Elle ressemble dans le principe la classe Component en plus simple.
Constructeur
public MenuComponent ()

Mthodes
public MenuContainer getParent () public MenuComponentPeer getPeer ()

Ces mthodes permettent d'obtenir le container auquel est rattach un composant de menu et le peer d'un composant de menu.
public Font getFont () public void setFont (Font font)

Ces mthodes permettent d'interroger ou de modifier la police de caractre utilise pour l'affichage d'un composant de menu.
public void removeNotify ()

Cette mthode est appele pour supprimer le peer d'un composant de menu.
protected String paramString () public String toString ()

Ces mthodes sont utilises pour fabriquer une chane de caractres dcrivant le composant de menu (toString () outrepasse la mthode de la classe Object et appelle la mthode paramString () qui est outrepasse par les classes drives de MenuComponent).
public boolean postEvent (Event evt)

Programmer en java

Page 318

Dao Issiaka- 3me anne SI

La classe java.awt.MenuBar

Cette classe qui drive de la classe MenuComponent, est la classe du package java.awt qui permet de crer et de manipuler une barre de menu. Une fois que vous avez crez une barre de menu vous pouvez y ajouter un ou plusieurs menus. La mthode setMenuBar () de classe Frame permet de spcifier la barre de menu que doit utiliser une fentre.
Constructeur
public MenuBar ()

Mthodes
public synchronized void addNotify () public void removeNotify ()

Ces mthodes permettent de crer et de dtruire le peer d'une barre de menu (removeNotify () outrepasse la mthode de la classe MenuComponent).
public synchronized Menu add (Menu menu)

Permet d'ajouter un menu une barre de menu.


public synchronized void remove (int index) public synchronized void remove (MenuComponent menu)

Ces mthodes permettent de supprimer un menu d'une barre de menu, soit en donnant son numro d'ordre index, soit en donnant directement l'instance de menu supprimer.
public int countMenus ()

Renvoie le nombre de menus courant d'une barre de menu.


public Menu getMenu (int index)

Renvoie le menu dont le numro d'ordre est index.


public Menu getHelpMenu () public synchronized void setHelpMenu (Menu m)

Ces mthodes permettent d'interroger ou de modifier le menu d'aide.


Exemple

Applet ShowMenu.
La classe java.awt.MenuItem

Cette classe qui drive de la classe MenuComponent, est la classe du package java.awt qui permet de crer et de manipuler un lment simple de menu. Un lment de menu a un label qui est le texte affich dans le menu et peut tre ventuellement gris pour indiquer qu'il n'est pas utilisable un moment donn.

Programmer en java

Page 319

Dao Issiaka- 3me anne SI

Constructeur
public MenuItem (String label)

Ce constructeur permet de donner un label au nouveau menu cr.


Mthodes
public synchronized void addNotify ()

Permet de crer le peer d'un lment de menu.


public String getLabel () public void setLabel (String label)

Ces mthodes permettent d'interroger ou de modifier le label d'un menu.


public boolean isEnabled ()

Renvoie true si un lment de menu est utilisable.


public void enable () public void disable () public void enable (boolean cond)

Vous pouvez rendre utilisable ou inutilisable un composant grce ces mthodes. Un lment de menu inutilisable (disabled) est gnralement gris.
public String paramString ()

Mthode de la classe MenuComponent, outrepasse pour renvoyer une chane de caractres dcrivant l'lment de menu.
Exemple

Applet ShowMenu.
La classe java.awt.Menu

Cette classe qui drive des classes MenuItem et MenuComponent est la classe du package java.awt qui permet de crer et de manipuler un menu ou un sous-menu. Un menu a un label et peut contenir un ou plusieurs lments ; les lments qui sont eux-mmes des instances de la classe Menu deviennent des sous-menus.
Constructeurs
public Menu (String label) public Menu (String label, boolean tearOff)

Mthodes
public synchronized void addNotify () public synchronized void removeNotify ()

Ces mthodes permettent de crer et de dtruire le peer d'un menu (removeNotify () outrepasse la mthode de la classe MenuComponent).
Programmer en java Page 320

Dao Issiaka- 3me anne SI

public boolean isTearOff () public int countItems ()

Renvoie le nombre d'lments d'un menu.


public MenuItem getItem (int index)

Renvoie l'lment du menu de numro d'ordre index.


public synchronized MenuItem add (MenuItem menuItem) public void add (String label)

Ces mthodes permettent d'ajouter un lment un menu.


public void addSeparator ()

Permet d'ajouter un sparateur un menu. Equivalent l'appel de la mthode add ("-").


public synchronized void remove (int index) public synchronized void remove (MenuComponent item)

Ces mthodes permettent de retirer d'un menu l'lment de numro d'ordre index ou l'lment item.
Exemple

Applet ShowMenu.
La classe java.awt.CheckboxMenuItem

Cette classe qui drive des classes MenuItem et MenuComponent est la classe du package java.awt qui permet de crer et de manipuler un lment de menu cocher. Comme un composant de classe Checkbox, ce type d'lment de menu a un tat coch ou non.
Constructeur
public CheckboxMenuItem (String label)

Mthodes
public synchronized void addNotify ()

Permet de crer le peer d'un lment de menu cocher.


public boolean getState () public void setState (boolean t)

Ces mthodes permettent d'interroger ou de modifier l'tat coch ou non de l'lment de menu.
public String paramString ()

Programmer en java

Page 321

Dao Issiaka- 3me anne SI

Mthode de la classe MenuComponent, outrepasse pour renvoyer une chane de caractres dcrivant l'lment de menu cocher.
Exemple

Applet ShowMenu.

Programmer en java

Page 322

Dao Issiaka- 3me anne SI

La gestion de l'interface utilisateur


La gestion vnementielle La classe Graphics : tout pour dessiner Les polices de caractres La couleur Les classes manipulant des dimensions La cration de nouveaux composants

La gestion vnementielle

Maintenant que vous avez vu comment crer et disposer un ensemble de composants l'cran, il reste aborder comment grer l'interactivit de ces composants avec votre programme pour que vous puissiez ragir aux actions d'un utilisateur, quand il utilise tel ou tel composant.
Les vnements

La classe Component dclare tout un ensemble de mthodes qui permettent de ragir aux diffrents vnements que peut recevoir un composant. Dans les diffrents exemples dj cits, l'une de ces mthodes, action () a t souvent outrepasse pour traiter les actions d'un utilisateur sur un composant, mais en fait il existe tout un ensemble de mthodes traitant chacune des vnements qui peuvent survenir lors de l'utilisation de l'ordinateur. On regroupe sous le terme gnrique vnement tout type d'entre qu'un programme peut s'attendre recevoir. Les vnements peuvent se regrouper en plusieurs catgories :

Les vnements provoqus par un priphrique de l'ordinateur : Entre clavier (Enfoncement-relchement d'une touche du clavier) et entre souris (Enfoncementrelchement d'un bouton de la souris et dplacement du pointeur de la souris). Les vnements dclenchs par le gestionnaire de fentre du systme, suite un enchanement d'actions de l'utilisateur sur une fentre (changement de taille d'une fentre, obtention du focus dans une fentre,...) ou un composant (clic sur un bouton, choix dans une liste,...).

Avant l'avnement des systmes utilisant une interface graphique, les programmes attendaient que l'utilisateur appuie sur une touche de clavier pour effectuer telle ou telle action suivant la touche enfonce. Similairement, un programme utilisant les fonctionnalits d'une interface graphique utilise une boucle pour attendre un vnement quelconque qui permettra de dclencher telle ou telle action d'un programme. Quand un programme Java reoit un vnement, il excute toujours le mme scnario qu'il faut bien comprendre pour programmer correctement. La Machine Virtuelle Java utilise l'arbre des composants que vous avez cr (comme celui de l'applet TraitementTexte du chapitre prcdent) pour dterminer les diffrents composants auxquels peut se destiner un
Programmer en java Page 323

Dao Issiaka- 3me anne SI

nouvel vnement. Quand un vnement est reu par un composant comp d'un programme Java, la mthode handleEvent () de la classe Component est appele par la Machine Virtuelle Java. handleEvent () renvoie false par dfaut ce qui provoque l'appel de la mthode handleEvent () du composant parent du composant comp, ainsi de suite jusqu' ce que le composant n'est pas de parent. Si la classe d'un des composants sur lequel handleEvent () est invoqu outrepasse cette mthode, c'est cette mthode qui sera appele, ce qui vous permet de modifier le comportement par dfaut d'un composant qui drive de Component. Quand vous outrepassez cette mthode, vous pouvez terminer votre mthode de trois manires suivant ce que vous voulez faire :
return true; gnralement utilis aprs le traitement d'un vnement pour indiquer que

vous avez pris en compte l'vnement et que vous ne voulez pas que le systme continue envoyer l'vnement au parent du composant (par exemple, si vous avez trait un vnement WINDOW_DESTROY envoy quand l'utilisateur veut fermer une fentre indpendante). Dans ce cas, la mthode handleEvent () du parent du composant n'est pas appele. return false; dans ce cas, la mthode handleEvent () du parent du composant est appele. return super.handleEvent (event); dans ce cas, la mthode handleEvent () de la classe dont hrite le composant est appele.

L'enchanement des appels aux mthodes handleEvent () sur chacun des parents d'un composant est trs pratique car il vite de traiter les vnements au niveau de chacun des composants o ils surviennent. Vous pouvez ainsi traiter le clic d'un bouton dans la classe de son container, ce qui vite de crer une nouvelle classe pour ce bouton. Pour vous le montrer, voici une applet simple qui affiche l'heure courante dans un label quand vous cliquez sur le bouton Mise l'heure :

Cette applet peut tre ralise de deux manires diffrentes comme suit ( copier dans un fichier dnomm MiseAJourHorloge.java et invoqu partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; import java.util.Date; public class MiseAJourHorloge extends Applet { private Label heure = new Label ( new Date ().toLocaleString ()); private Button miseAHeure = new BoutonMiseAJour ("Mise \u00e0 l'heure", heure); public void init () { // Ajout des deux composants add (miseAHeure); add (heure); import java.applet.Applet; import java.awt.*; import java.util.Date; public class MiseAJourHorloge extends Applet { private Label heure = new Label ( new Date ().toLocaleString ()); private Button miseAHeure = new Button ("Mise \u00e0 l'heure");

public void init () { // Ajout des deux composants add (miseAHeure); add (heure);

Programmer en java

Page 324

Dao Issiaka- 3me anne SI

} } class BoutonMiseAJour extends Button { private Label heure; // Constructeur public BoutonMiseAJour (String label, Label heure) { super (label); this.heure = heure; } // Mthode appele par la Machine // Virtuelle quand un vnement survient public boolean handleEvent (Event event) { // Si l'vnement est un clic sur le // bouton, mise jour de l'horloge if (event.id == Event.ACTION_EVENT) { heure.setText ( new Date ().toLocaleString ()); return true; } return super.handleEvent (event); } }

// Mthode appele par la Machine // Virtuelle quand un vnement survient public boolean handleEvent (Event event) { // Si l'vnement est un clic sur le // bouton, mise jour de l'horloge if ( event.target == miseAHeure && event.id == Event.ACTION_EVENT) { heure.setText ( new Date ().toLocaleString ()); return true; } return super.handleEvent (event); } }

La premire mthode respecte plus le style de programmation oriente objet : on y modifie le comportement par dfaut d'un bouton en crant une nouvelle classe drive de Button. La seconde mthode est plus pratique : on modifie le comportement du container qui a cr tous les composants en lui indiquant comment grer ses composants. Un container contenant gnralement plusieurs composants qui interagissent entre eux (comme l'applet TraitementTexte), on utilise plus souvent le second style de programmation en dcrivant dans une seule mthode le traitement des vnements que reoivent les diffrents composants grs par le container. Pour faciliter la clart du traitement de certains types d'vnements, la mthode handleEvent () de la classe Component appelle certaines mthodes suivant le type d'vnement reu. Ces mthodes, comme la mthode action (), peuvent tre outrepasses dans vos classes la place (ou en plus) de la mthode handleEvent (). Elles doivent toutes renvoyer une valeur boolenne indiquant comme pour handleEvent () si l'vnement doit tre renvoy au parent du composant (return false;) ou non (return true;). En voici la liste :
Programmer en java Page 325

Dao Issiaka- 3me anne SI

EVENEMENT
Event.MOUSE_ENTER

METHODE
public boolean mouseEnter (Event evt, int x, int y) public boolean mouseExit (Event evt, int x, int y) public boolean mouseDown (Event evt, int x, int y) public boolean mouseUp (Event evt, int x, int y) public boolean mouseMove (Event evt, int x, int y) public boolean mouseDrag (Event evt, int x, int y) public boolean keyDown (Event evt, int key)

DESCRIPTION

Mthode appele quand le pointeur de la souris entre dans un composant (utilis par exemple pour changer l'aspect du pointeur). Mthode appele quand le pointeur de la souris sort d'un composant. Mthode appele le bouton de la souris est enfonc. Mthode appele le bouton de la souris est relch. Mthode appele quand le pointeur de la souris est dplac. Mthode appele quand le pointeur de la souris est dplac, avec le bouton de la souris enfonc. Mthode appele quand une touche du clavier est enfonce. Mthode appele quand une touche du clavier est relche. Mthode appele quand un composant obtient le focus. Un composant qui a le focus est celui qui reoit les entres du clavier. Mthode appele quand un composant perd le focus. Mthode appele quand l'utilisateur effectue une action dans un composant : Suivant la classe du composant, ceci peut prendre un sens diffrent.

Event.MOUSE_EXIT

Event.MOUSE_DOWN

Event.MOUSE_UP

Event.MOUSE_MOVE

Event.MOUSE_DRAG

Event.KEY_PRESS Event.KEY_ACTION

Event.KEY_RELEASE public boolean Event.KEY_ACTION_RELEASE keyUp (Event evt, int key) Event.GOT_FOCUS public boolean gotFocus (Event evt, Object arg)

Event.LOST_FOCUS

public boolean lostFocus (Event evt, Object arg) public boolean action (Event evt, Object arg)

Event.ACTION_EVENT

Nota : La liste de tous les vnements reconnus en Java est donne dans la classe Event dcrite ci-aprs.

Programmer en java

Page 326

Dao Issiaka- 3me anne SI

Pour les vnements MOUSE_..., x et y reprsentent les coordonnes du pointeur de la souris relatives au repre du composant o vous recevez l'vnement. Pour les vnements KEY_..., key reprsente le code UNICODE de la touche enfonce ou l'une des valeurs Event.HOME Event.F12 pour les touches spciales du clavier. Pour l'vnement ACTION_EVENT, arg peut prendre une valeur diffrente suivant la classe du composant o est survenu l'vnement :

Pour les composants de classe Button, l'vnement ACTION_EVENT est envoy quand l'utilisateur clique sur un bouton. arg est alors gal au label du bouton (de classe String). Pour les composants de classe Checkbox (que ce soit une boite cocher ou un bouton radio) l'vnement ACTION_EVENT est envoy quand l'utilisateur clique sur le composant. arg est alors gal l'tat (coch ou non) de ce composant (arg de classe Boolean). Pour les composants de classe Choice, l'vnement ACTION_EVENT est envoy quand l'utilisateur choisit un lment de la liste. arg est alors gal la valeur de ce choix (de classe String). Pour les composants de classe List, l'vnement ACTION_EVENT est envoy quand l'utilisateur a double-cliqu sur un lment de la liste. arg est alors gal la valeur de cet lment (de classe String). Pour les composants de classe TextField, l'vnement ACTION_EVENT est envoy quand l'utilisateur a appuy sur return dans le champ de saisie. arg est alors gal la chane saisie (de classe String). Pour les composants de classe MenuItem, l'vnement ACTION_EVENT est envoy quand l'utilisateur choisit un lment de menu. arg est alors gal au label de cet lment de menu (de classe String). Pour les composants de classe CheckboxMenuItem, deux vnements ACTION_EVENT sont envoys quand l'utilisateur coche ou dcoche un lment de menu. arg du premier vnement est gal au label de cet lment de menu (de classe String) et arg du second vnement est gal l'tat (coch ou non) de de cet lment (arg de classe Boolean)

Finalement, l'applet MiseAJourHorloge peut tre programme comme ceci :


import java.applet.Applet; import java.awt.*; import java.util.Date; public class MiseAJourHorloge extends Applet { private Label heure = new Label (new Date ().toLocaleString ()); private Button miseAHeure = new Button ("Mise \u00e0 l'heure"); public void init () { // Ajout des deux composants add (miseAHeure); add (heure); } // Mthode appele par la machine virtuelle la suite d'une action public boolean action (Event event, Object arg) { // Si l'vnement est un clic sur le bouton, mise jour de l'horloge if ("Mise \u00e0 l'heure".equals (arg)) heure.setText (new Date ().toLocaleString ()); return true; }
Programmer en java Page 327

Dao Issiaka- 3me anne SI

Si vous outrepassez handleEvent () ET une des mthodes prcdentes dans la mme classe, n'oubliez pas l'appel super.handleEvent (event); pour les vnements que vous ne traitez pas dans handleEvent (). Sinon ces mthodes ne seront pas appeles. Les applets DrawIt et PaperBoardClient sont des exemples d'utilisation des mthodes mouseDown (), mouseDrag () et mouseUp (). L'applet PaperBoardClient est un exemple d'utilisation des mthodes mouseDown (), mouseUp (), mouseEnter () et mouseExit (). L'applet EchoClient est un exemple d'utilisation de la mthode keyDown ().
La classe java.awt.Event

La classe Event est la classe qui regroupe tous les vnements qui peuvent survenir dans un programme. Les mthodes de gestion vnementielle (handleEvent () ou autre) que vous outrepassez dans vos classes reoivent un vnement de cette classe cr par la Machine Virtuelle Java. Vous pouvez aussi crer vous-mme des vnements que vous envoyez un composant par la mthode postEvent () de la classe Component. Le principal avantage d'envoyer un vnement un composant de classe Comp1 partir d'une autre classe CompEmetteur plutt que d'appeler une mthode que vous crez dans la classe Comp1, est que vous rendez indpendantes ces deux classes l'une de l'autre. Contrairement la plupart des classes de la librairie Java, les champs de la classe Event sont public, et vous pouvez consulter directement les caractristiques d'un vnement par ces champs.
Champs
public Object target

Dsigne l'objet cible de l'vnement (gnralement le composant o est survenu l'vnement).


public long when

Reprsente le moment o est survenu l'vnement.


public int id

Caractrise le type d'vnement qui est survenu (gal aux valeurs WINDOW_DESTROY LOST_FOCUS dcrites ci-aprs).
public int x public int y

Pour les vnements souris, x et y sont les coordonnes du pointeur de la souris. Ces coordonnes sont relatives au repre du composant o vous consultez l'vnement.
public int key

Programmer en java

Page 328

Dao Issiaka- 3me anne SI

Pour les vnements clavier, key reprsente le code UNICODE de la touche enfonce ou l'une des valeurs HOME F12 dcrites ci-aprs pour les touches spciales du clavier.
public int modifiers

Reprsente la combinaison des valeurs SHIFT_MASK ALT_MASK, reprsentant l'tat enfonc ou non des touches Shift, Control, Meta et Alt. Si par exemple les touches Shift et Control sont enfonces modifiers sera gal SHIFT_MASK | CTRL_MASK.
public int clickCount

Pour les vnements MOUSE_DOWN, reprsente le nombre de clics conscutifs (gal 2 pour un double clic,...).
public Object arg

peut prendre n'importe quelle valeur. Il est utilis comme argument utilisateur pour fournir ventuellement des renseignements supplmentaires au composant rcepteur de l'vnement courant. Par exemple, l'vnement ACTION_EVENT mis par la plupart des composants Java l'utilise pour communiquer le label du composant.
arg public Event evt

Dsigne l'vnement suivant quand les vnements sont mis dans une liste chane.
public final static int SHIFT_MASK public final static int CTRL_MASK public final static int ALT_MASK

Ces constantes reprsentent la combinaison de l'tat enfonc ou non des touches Shift (Majuscule), Control et Alt.
public final static int META_MASK

Cette constante reprsente la combinaison de l'tat enfonc ou non de la touche Pomme sous Mac OS ou du bouton droit de la souris sur les autres systmes.
public public public public public public public public public public public public public public public public public final final final final final final final final final final final final final final final final final static static static static static static static static static static static static static static static static static int int int int int int int int int int int int int int int int int HOME END PGUP PGDN UP DOWN LEFT RIGHT F1 F2 F3 F4 F5 F6 F7 F8 F9
Page 329

Programmer en java

Dao Issiaka- 3me anne SI

public final static int F10 public final static int F11 public final static int F12

Ces constantes reprsentent les touches spciales du clavier.


public public public public public public public public public public public public public public public public public public public public public public public public public public public final final final final final final final final final final final final final final final final final final final final final final final final final final final static static static static static static static static static static static static static static static static static static static static static static static static static static static int int int int int int int int int int int int int int int int int int int int int int int int int int int WINDOW_DESTROY WINDOW_EXPOSE WINDOW_ICONIFY WINDOW_DEICONIFY WINDOW_MOVED KEY_PRESS KEY_RELEASE KEY_ACTION KEY_ACTION_RELEASE MOUSE_DOWN MOUSE_UP MOUSE_MOVE MOUSE_ENTER MOUSE_EXIT MOUSE_DRAG SCROLL_LINE_UP SCROLL_LINE_DOWN SCROLL_PAGE_UP SCROLL_PAGE_DOWN SCROLL_ABSOLUTE LIST_SELECT LIST_DESELECT ACTION_EVENT LOAD_FILE SAVE_FILE GOT_FOCUS LOST_FOCUS

Ces constantes reprsentent tous les vnements qui peuvent survenir dans un programme Java. Pour certains de ces vnements, la mthode handleEvent () de la classe Component appelle des mthodes que vous pouvez outrepasser.
Constructeurs
public Event (Object int x, Object public Event (Object int x, public Event (Object target, long when, int id, int y, int key, int modifiers, arg) target, long when, int id, int y, int key, int modifiers) target, int id, Object arg)

Ces constructeurs permettent de crer un vnement. Les paramtres correspondent aux champs de la classe Event.
Mthodes
public void translate (int x, int y)

Effectue une translation de (x,y) sur les coordonnes de l'vnement.


public boolean shiftDown () public boolean controlDown () public boolean metaDown ()
Programmer en java Page 330

Dao Issiaka- 3me anne SI

Ces mthodes permettent de savoir si lors d'un vnement les touches Shift, Control et Meta sont enfonces (true) ou non.
protected String paramString () public String toString ()

Ces mthodes sont utilises pour fabriquer une chane de caractres dcrivant le composant (toString () outrepasse la mthode de la classe Object et appelle la mthode paramString ()). Pour essayer le traitement des vnements, vous pouvez par exemple amliorer l'applet du piano du chapitre sur les applets, en ajoutant des raccourcis clavier aux diffrentes notes (ceci vous permettra de tester le mixage des sons en jouant des accords). A partir de la version de Java 1.1 un traitement des vnements diffrents de Java 1.0 a t mis en place. Ce sujet sera trait dans une version ultrieure de ce manuel.
Exemples

Applets Piano, PaperBoardClient, TraitementTexte, BorderBuilder, MiseAJourHorloge , ListePolices, Nuancier et BoutonsNavigation. Voir aussi ci-dessus.
La classe Graphics : tout pour dessiner La classe java.awt.Graphics

La classe Graphics qui est abstract reprsente un contexte graphique et regroupe toutes les mthodes permettant de dessiner (ligne, rectangle, arc de cercle, polygone, texte et image), quelque soit le support final (cran, imprimante, image en mmoire). Il n'est pas possible de crer directement d'objet de cette classe grce l'oprateur new, mais vous pouvez rcuprer une instance de cette classe en paramtre des mthodes paint () et update () ou par la mthode getGraphics () de la classe Component.
Constructeur
protected Graphics ()

Mthodes
public abstract Graphics create ()

Cre une copie d'un contexte graphique.


public Graphics create (int x, int y, int width, int height)

Cre une copie d'un contexte graphique, en effectuant en plus une translation (x,y) sur le repre courant et en crant une zone de clipping de largeur width et hauteur height. Seuls les dessins effectus l'intrieur de cette zone de clipping seront affichs.
public abstract void translate (int x, int y)

Programmer en java

Page 331

Dao Issiaka- 3me anne SI

Cette mthode effectue une translation (x,y) sur le repre courant. Tous les ordres graphiques seront ensuite calculs par rapport ce nouveau repre.
public abstract Rectangle getClipRect () public abstract void clipRect (int x, int y, int width, int height)

Ces mthodes permettent d'interroger ou de modifier la zone de clipping courante. Seuls les dessins effectus l'intrieur de cette zone de clipping seront affichs. S'il existe dj un rectangle de clipping, le rectangle de clipping rsultant de l'appel la mthode clipRect () est l'intersection entre le rectangle courant et celui pass en paramtre.
public abstract Color getColor () public abstract void setColor (Color c)

Ces mthodes permettent d'interroger ou de modifier la couleur courante utilise pour dessiner.
public abstract void setPaintMode () public abstract void setXORMode (Color c1)

Ces mthodes permettent de choisir le mode d'utilisation de la couleur au cours d'un dessin. setPaintMode () positionne le mode le plus usuel o tout dessin est effectu avec la couleur courante. setXORMode () positionne le mode XOR : Dans ce mode, tout ordre graphique effectu deux fois aux mmes coordonnes s'annule ; si la couleur d'un pixel (ou d'un point) dessiner est gale la couleur courante, il prend la couleur c1, les pixels d'une autre couleur prennent une couleur non prvisible. Ce mode est surtout utilis pour dessiner des rectangles lastiques quand l'utilisateur doit dsigner un ensemble d'objets ou dessiner un rectangle lastique. A chaque dplacement du pointeur de la souris, avant de dessiner un rectangle aux nouvelles coordonnes, vous annulez le rectangle prcdent en le redessinant la mme position.
public abstract Font getFont () public abstract void setFont (Font font)

Ces mthodes permettent d'interroger ou de modifier la police de caractre courante utilise pour dessiner les textes.
public FontMetrics getFontMetrics () public abstract FontMetrics getFontMetrics (Font font)

Ces mthodes permettent d'interroger les tailles de la police de caractre courante ou de la police de caractre font.
public abstract void drawLine (int x1, int y1, int x2, int y2)

Permet de dessiner une ligne reliant les points de coordonnes (x1,y1) et (x2,y2).
public void drawRect (int x, int y, int width, int height)

Permet de dessiner le contour du rectangle au point de coordonnes (x,y), de largeur (vers la droite) width et de hauteur (vers le bas) height. Ce rectangle s'tend en fait du pixel de coordonnes (x,y) celui de coordonnes (x +
Programmer en java Page 332

Dao Issiaka- 3me anne SI

width,y + height), + 1 pixels.

ce qui donne une largeur de width + 1 pixels et une hauteur de height

public abstract void fillRect (int x, int y, int width, int height) public abstract void clearRect (int x, int y, int width, int height)

Ces mthodes permettent de remplir le rectangle au point de coordonnes (x,y), de largeur width et de hauteur height. fillRect () utilise la couleur courante comme couleur de remplissage et clearRect () utilise la couleur de fond. Contrairement la mthode drawRect (), ce rectangle s'tend du pixel de coordonnes (x,y) celui de coordonnes (x + width - 1,y + height - 1), ce qui donne une largeur de width pixels et une hauteur de height pixels.
public abstract void drawRoundRect (int x, int y, int width int height, int arcWidth, int arcHeight) public abstract void fillRoundRect (int x, int y, int width, int height, int arcWidth, int arcHeight)

Ces mthodes permettent de dessiner ou de remplir un rectangle dont les bords sont arrondis.
public void draw3DRect (int x, int y, int width, int height, boolean raised) public void fill3DRect (int x, int y, int width, int height, boolean raised)

Ces mthodes permettent de dessiner ou de remplir un rectangle avec effet 3D. Si raised est gal true, le rectangle sera en relief, sinon il sera en creux.
public abstract void drawOval (int x, int y, int width, int height) public abstract void fillOval (int x, int y, int width, int height)

Ces mthodes permettent de dessiner le contour d'un oval ou de remplir un ovale (ou une ellipse) contenu dans le rectangle de coordonnes (x,y), de largeur width et de hauteur height. Pour les deux mhodes, ce rectangle s'tend en fait du pixel de coordonnes (x,y) celui de coordonnes (x + width,y + height), ce qui donne une largeur de width + 1 pixels et une hauteur de height + 1 pixels.
public abstract void drawArc (int x, int y, int width, int height, int startAngle, int arcAngle) public abstract void fillArc (int x, int y, int width, int height, int startAngle, int arcAngle)

Ces mthodes permettent de dessiner le contour d'un arc ou de remplir un arc d'ellipse contenu dans le rectangle de coordonnes (x,y), de largeur width et de hauteur height. L'arc est dessin partir de l'angle startAngle degrs (correspondant l'angle de 3 heures), et s'tend sur arcAngle degrs dans le sens trigonomtrique, si arcAngle est positif. Le rectangle englobant s'tend du pixel de coordonnes (x,y) celui de coordonnes (x + width,y + height), ce qui donne une largeur de width + 1 pixels et une hauteur de height + 1 pixels.
public abstract void drawPolygon (int xPoints [ ], int yPoints [ ], int nPoints)
Programmer en java Page 333

Dao Issiaka- 3me anne SI

public void drawPolygon (Polygon p) public abstract void fillPolygon (int xPoints [ ], int yPoints [ ], int nPoints) public void fillPolygon (Polygon p)

Ces mthodes permettent de dessiner ou de remplir un polygone. Les points du polygone peuvent tre donns soit dans les tableaux xPoints et yPoints reprsentant les coordonnes (x,y) de chaque point, soit par uns instance de la classe Polygon.
public abstract void drawString (String str, int x, int y) public void drawChars (char data [ ], int offset, int length, int x, int y) public void drawBytes (byte data [ ], int offset, int length, int x, int y)

Ces mthodes permettent de dessiner une chane de caractres avec la police de caractre courante au point de coordonnes (x,y) : l'ordonne y de ce point est la ligne de base sur laquelle sera dessine la chane. La chane de caractres peut tre donne soit par une instance de String, soit par les length premiers caractres partir de l'indice offset du tableau data.
public abstract void copyArea (int x, int y, int width, int height, int dx, int dy)

Permet de copier au point de coordonnes (x + dx,y + dy) la partie du composant contenue dans le rectangle au point de coordonnes (x,y), de largeur width et de hauteur height.
public abstract boolean drawImage (Image img, int x, int y, ImageObserver observer) public abstract boolean drawImage (Image img, int x, int y, int width, int height, ImageObserver observer) public abstract boolean drawImage (Image img, int x, int y, Color bgcolor, ImageObserver observer) public abstract boolean drawImage (Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer)

Ces mthodes permettent de dessiner l'image img, au point de coordonnes (x,y). La largeur et la hauteur width et height permettent ventuellement de d'agrandir ou de diminuer la taille de l'image. Si vous voulez ne dessiner qu'une partie d'une image, utiliser la mthode clipRect (). Voir aussi le chapitre sur les images.
public abstract void dispose ()

Permet de dtruire le contexte graphique. Une fois dtruit, le contexte graphique n'est plus utilisable et la translation et la zone de clipping ventuellement actives sur ce contexte graphique sont annules.
public void finalize ()

Programmer en java

Page 334

Dao Issiaka- 3me anne SI

Dtruit le contexte graphique (appel de dispose ()). Cette mthode outrepasse celle de la classe Object.
public String toString ()

Renvoie une chane de caractre reprsentant le contexte graphique. Cette mthode outrepasse celle de la classe Object.

Les mthodes de dessin (comme drawRect (), drawOval ()) prenant en paramtre une largeur et une hauteur (width et height), n'acceptent que des valeurs positives pour ces paramtres. Voici l'applet DrawIt, vous permettant de dessiner interactivement des formes en dsignant un rectangle englobant avec la souris. Les boutons radios droite vous permettent de choisir le type de dessin que vous voulez raliser. Cette applet permet de tester le mode XOR, la plupart des mthodes de dessins de la classe Graphics et l'utilisation des mthodes mouseDown (), mouseDrag () et mouseUp () de la classe Component :

et le programme Java correspondant ( copier dans un fichier dnomm DrawIt.java et invoqu partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; import java.util.Random; public class DrawIt extends Applet { private CheckboxGroup choixDessin = new CheckboxGroup (); private Panel zoneDessin = new DrawItComponent (choixDessin); public void init () { // Choix d'un layout BorderLayout (FlowLayout par dfaut) setLayout (new BorderLayout ()); // Cration de boutons radios permettant de choisir // la fonction de dessin utiliser Panel panel = new Panel (); panel.setLayout (new GridLayout (7, 1)); panel.add (new Checkbox ("Ligne", choixDessin, true)); panel.add (new Checkbox ("Rectangle", choixDessin, false)); panel.add (new Checkbox ("Rectangle 3D", choixDessin, false)); panel.add (new Checkbox ("Polygone", choixDessin, false)); panel.add (new Checkbox ("Ovale", choixDessin, false)); panel.add (new Checkbox ("Arc de cercle", choixDessin, false)); panel.add (new Checkbox ("Texte", choixDessin, false)); // Ajout droite des boutons radios add ("East", panel); // Ajout au centre de la zone de saisie add ("Center", zoneDessin); } }
Programmer en java Page 335

Dao Issiaka- 3me anne SI

// Classe DrawItComponent class DrawItComponent extends Panel { private int xDebut, yDebut, xFin, yFin; private CheckboxGroup choixDessin; private Color couleurDessin; private int angleDebut, angle; private String typeDessin = ""; // Constructeur DrawItComponent (CheckboxGroup choixDessin) { this.choixDessin = choixDessin; } // Mthodes mouseDown (), mouseDrag (), mouseUp () // appeles l'enfoncement du bouton de la souris, // au dplacement du pointeur, et au relchement du bouton public boolean mouseDown (Event evt, int x, int y) { xDebut = x; yDebut = y; dessinerElastique (x , y); return true; } public boolean mouseDrag (Event evt, int x, int y) { // Effacement du rectangle aux anciennes coordonnes // puis dessin d'un nouveau rectangle aux coordonnes courantes dessinerElastique (xFin, yFin); dessinerElastique (x, y); return true; } public boolean mouseUp (Event evt, int x, int y) { // Effacement du dernier rectangle dessin dessinerElastique (xFin, yFin); // Rcupration du type de dessin demand, d'une couleur et deux angles // et redessin du composant typeDessin = choixDessin.getCurrent ().getLabel (); Random generateur = new Random (); couleurDessin = new Color (generateur.nextFloat (), generateur.nextFloat (), generateur.nextFloat ()); angleDebut = generateur.nextInt () % 360; angle = generateur.nextInt () % 360; repaint (); return true; } // Mthode dessinerElastique () : mmorise les coordonnes // courantes, puis trace un rectangle en mode XOR private void dessinerElastique (int xFin, int yFin) { this.xFin = xFin; this.yFin = yFin; Graphics gc = getGraphics ();
Programmer en java Page 336

Dao Issiaka- 3me anne SI

gc.setXORMode (getBackground ()); gc.drawRect (Math.min (xDebut, xFin), Math.min (yDebut, yFin), Math.abs (xFin - xDebut), Math.abs (yFin - yDebut)); } // Mthode appele la mise jour du composant public void paint (Graphics gc) { // Slection de la couleur gc.setColor (couleurDessin); // Appel de la mthode de dessin suivant le type de dessin choisi int x = Math.min (xDebut, xFin); int y = Math.min (yDebut, yFin); int largeur = Math.abs (xFin - xDebut); int hauteur = Math.abs (yFin - yDebut); if (typeDessin.equals ("Ligne")) gc.drawLine (x, y, x + largeur, y + hauteur); else if (typeDessin.equals ("Rectangle")) gc.fillRect (x, y, largeur, hauteur); else if (typeDessin.equals ("Rectangle 3D")) gc.fill3DRect (x, y, largeur, hauteur, true); else if (typeDessin.equals ("Polygone")) { int xPoints [ ] = {x, x , x + largeur, x + largeur}; int yPoints [ ] = {y, y + hauteur, y, y + hauteur}; gc.fillPolygon (xPoints, yPoints, xPoints.length); } else if (typeDessin.equals ("Ovale")) gc.fillOval (x, y, largeur, hauteur); else if (typeDessin.equals ("Arc de cercle")) { gc.drawOval (x, y, largeur, hauteur); gc.fillArc (x, y, largeur, hauteur, angleDebut, angle); } else if (typeDessin.equals ("Texte")) { gc.setFont (new Font ("Helvetica", Font.PLAIN, hauteur)); FontMetrics tailles = gc.getFontMetrics (); gc.drawString ("Texte", x, y + tailles.getAscent () + tailles.getLeading ()); } } }

Autres exemples

Les applets Chrono, EchoClient, PaperBoardClient, ListePolices et ScrollText sont des exemples d'utilisation de la mthode drawString (). Les applets AfficheurDeCalcul, ObservateurCalcul, PaperBoardClient, Piano, ListePolices et Horloge sont des exemples de tracs de lignes et de polygones. Les applets BoutonsNavigation, MultiImages, ImageSimple, ChargementImage, ImageTableau, ImageNoirEtBlanc, NegatifImage, AnimationFleche et Horloge sont des exemples d'utilisation de la mthode drawImage (). Le package java.awt dfinit aussi un ensemble de classes utiles pour la classe Graphics dcrites ci-aprs, qui permettent de manipuler les polices de caractres, les couleurs et les objets reprsentant des dimensions (point, rectangle, polygone,...) :
Programmer en java Page 337

Dao Issiaka- 3me anne SI

Les polices de caractres La classe java.awt.Font

Cette classe permet de manipuler les polices de caractres. Une police de caractres se caractrise par un nom, un style (normal, gras, italique) et une taille exprime en points (voir aussi la classe FontMetrics). Toutes les polices de caractres du systme ne sont pas disponibles en Java. Vous pouvez en obtenir la liste (gnralement, Courier, TimesRoman et Helvetica) grce la mthode getFontList () de la classe Toolkit, utilis dans l'applet ListePolices.
Champs
public final static int PLAIN public final static int BOLD public final static int ITALIC

Ces constantes permettent de spcifier le style de la police de caractres sa cration (normal, gras ou italique). Il est possible de combiner les styles avec l'oprateur | (par exemple, Font.BOLD | Font.ITALIC).
protected String name protected int style protected int size

Ces champs protected permettent d'accder aux caractristiques d'une police de caractres, dans les classes drives de Font.
Constructeur
public Font (String name, int style, int size)

Construit une police de caractres de nom name, de style style et de taille size.
Mthodes
public String getName () public int getStyle () public int getSize ()

Ces mthodes permettent d'interroger le nom, le style et la taille d'une police de caractres`.
public boolean isPlain () public boolean isBold () public boolean isItalic ()

Ces mthodes renvoient true si une police de caractres a un style normal, gras ou italique.
public String getFamily ()

Renvoie le nom de la famille laquelle appartient une police de caractres. La famille d'une police dpend du systme sur lequel fonctionne la Machine Virtuelle Java, tandis que le nom

Programmer en java

Page 338

Dao Issiaka- 3me anne SI

d'une police est un nom logique qui est toujours le mme quelque soit le systme pour rendre un programme Java portable.
public static Font getFont (String prop) public static Font getFont (String prop, Font font)

Ces mthodes renvoient la police de caractre mmorise par la proprit prop du systme (voir la classe System). Si cette proprit n'existe pas, la seconde mthode renvoie la valeur par dfaut font.
public int hashCode () public boolean equals (Object obj) public String toString ()

Ces mthodes outrepassent celles de la classe Object, pour renvoyer un code de hash, comparer une police de caractres un objet ou renvoyer une chane de caractres dcrivant une police.
Exemples

Applets DrawIt, ListePolices. et ScrollText.


La classe java.awt.FontMetrics

Cette classe dcrit les diffrentes tailles (hauteurs par rapport la ligne de base, largeurs diverses) d'une police de caractres (de classe Font).
Champ
protected Font font

Mmorise la police de caractres dcrite.


Constructeur
protected FontMetrics (Font font)

Ce constructeur est protected ce qui empche de crer directement une instance de la classe FontMetrics. Les mthodes getFontMetrics () des classes Graphics et Toolkit vous permettent d'interroger les tailles d'une police de caractres.
Mthodes
public Font getFont ()

Renvoie la police de caractres dcrite par une instance de la classe FontMetrics.


public public public public int int int int getHeight () getLeading () getAscent () getDescent ()

Ces mthodes revoient la hauteur, l'interligne, la hauteur au-dessus de la ligne de base et le jambage d'une police de caractres. La hauteur, diffrente de la taille de la police donne sa cration, est gale la somme des trois autres dimensions.
Programmer en java Page 339

Dao Issiaka- 3me anne SI

public int getMaxAscent () public int getMaxDescent ()

Ces mthodes revoient la hauteur maximum au-dessus de la ligne de base et le jambage maximum de tous les caractres d'une police.
public int getMaxAdvance ()

Renvoie la largeur du plus large des caractres d'une police.


public int charWidth (int ch) public int charWidth (char ch)

Ces mthodes renvoient la largeur du caractre ch d'une police.


public int stringWidth (String str) public int charsWidth (char data [ ], int offset, int length) public int bytesWidth (byte data [ ], int offset, int length)

Ces mthodes renvoient la largeur d'une chane de caractres. La chane de caractres peut tre donne soit par une instance de String, soit par les length premiers caractres partir de l'indice offset du tableau data.
public int [ ] getWidths ()

Renvoie un tableau dcrivant la taille des 256 premiers caractres d'une police.
public String toString ()

Cette mthode outrepasse la mthode toString () de la classe Object, pour renvoyer une chane de caractres dcrivant les principales tailles d'une police de caractres. L'applet suivante dcrit la liste de l'ensemble des polices de caractres disponibles avec Java. Cliquez sur un lment de la liste ou saisissez une taille de police de caractres dans le champ Size, pour afficher un exemple de texte et les caractristiques de la police choisie :

Voici le programme Java correspondant ( copier dans un fichier dnomm ListePolices.java et invoqu partir d'un fichier HTML) :
import java.awt.*; import java.applet.*; public class ListePolices extends { AfficheurTexte exemple = new List listePolices = new TextField taillePolice = new Label labelHeight = new Label labelLeading = new Label labelAscent = new Label labelDescent = new Label labelMaxAdvance = new
Programmer en java

Applet AfficheurTexte (); List (); TextField ("24"); Label (); Label (); Label (); Label (); Label ();
Page 340

Dao Issiaka- 3me anne SI

public void init () { // Choix d'un layout BorderLayout (FlowLayout par dfaut) setLayout (new BorderLayout (5, 0)); // Cration d'un panel contenant la liste des polices // et la zone de saisie de la taille Panel panelSaisie = new Panel (); panelSaisie.setLayout (new BorderLayout ()); // Rcupration de la liste des polices disponibles String [ ] ensemblePolices = getToolkit ().getFontList (); for (int i = 0; i < ensemblePolices.length; i++) listePolices.addItem (ensemblePolices [i]); panelSaisie.add ("Center", listePolices); Panel panelTaille = new Panel (); panelTaille.add (new Label ("Size :")); panelTaille.add (taillePolice); panelSaisie.add ("South", panelTaille); // Ajout du panel de saisie add ("West", panelSaisie); // Ajout du composant affichant une chane d'exemple add ("Center", exemple); // Cration d'un panel utilisant un layout de grille // et affichant un ensemble de labels qui permettent // de dcrire les caractristiques de la police slectionne Panel panelResultat = new Panel (); panelResultat.setLayout (new GridLayout (5, 2)); panelResultat.add (new Label ("Height :")); panelResultat.add (labelHeight); panelResultat.add (new Label ("Leading :")); panelResultat.add (labelLeading); panelResultat.add (new Label ("Ascent :")); panelResultat.add (labelAscent); panelResultat.add (new Label ("Descent :")); panelResultat.add (labelDescent); panelResultat.add (new Label ("MaxAdvance :")); panelResultat.add (labelMaxAdvance); // Ajout du panel de rsultat add ("East", panelResultat); } // Gestion des vnements sur la liste et la zone de saisie public boolean handleEvent (Event event) { // Si un vnement de slection de la liste ou un // vnement de changement de texte survient, // mise jour des labels dcrivant la police et de l'exemple if ( event.id == Event.LIST_SELECT || ( event.id == Event.ACTION_EVENT && event.target == taillePolice)) { Font police = new Font (listePolices.getSelectedItem (), Font.PLAIN, Integer.parseInt (taillePolice.getText ())); FontMetrics metrics = getToolkit ().getFontMetrics (police);
Programmer en java Page 341

Dao Issiaka- 3me anne SI

labelHeight.setText (String.valueOf (metrics.getHeight ())); labelLeading.setText (String.valueOf (metrics.getLeading ())); labelAscent.setText (String.valueOf (metrics.getAscent ())); labelDescent.setText (String.valueOf (metrics.getDescent ())); labelMaxAdvance.setText (String.valueOf (metrics.getMaxAdvance ())); exemple.modifierTexte (police, "Bonjour"); return true; } return super.handleEvent (event); } } // Classe AfficheurTexte affiche un texte avec une police de caractres class AfficheurTexte extends Panel { Font police; String texte; // La mthode modifierTexte () permet de modifier // la police de caractres et le texte du composant public void modifierTexte (Font police, String texte) { this.police = police; this.texte = texte; repaint (); } public void paint (Graphics gc) { if (texte != null) { // Dessin d'un cadre autour du composant gc.drawRect (0, 0, size ().width - 1, size ().height - 1); // Dessin des rectangles reprsentant les tailles FontMetrics metrics = gc.getFontMetrics (police); int y = (size ().height - metrics.getHeight ()) / 2; int largeurTexte = metrics.stringWidth (texte); gc.setColor (Color.blue.darker ()); gc.drawRect (5, y, largeurTexte, metrics.getHeight ()); gc.drawRect (5, y + metrics.getLeading (), largeurTexte, metrics.getAscent ()); // Dessin du texte dans les rectangles gc.setColor (Color.black); gc.setFont (police); gc.drawString (texte, 5, y + metrics.getAscent () + metrics.getLeading ()); } } }

Autres exemples

Applets DrawIt et ScrollText.

Programmer en java

Page 342

Dao Issiaka- 3me anne SI

La couleur La classe java.awt.Color

Cette classe permet de manipuler une couleur. Elle dclare un ensemble de constantes dcrivant les couleurs les plus communment utilises. Ses constructeurs permettent de crer des couleurs partir de leurs composantes RGB (Red Green Blue : Rouge Vert Bleu), mais les mthodes brighter () et darker () sont aussi trs pratiques pour crer des couleurs plus claire ou plus fonce partir d'une couleur existante.
Champs
public public public public public public public public public public public public public final final final final final final final final final final final final final static static static static static static static static static static static static static Color Color Color Color Color Color Color Color Color Color Color Color Color white lightGray gray darkGray black red pink orange yellow green magenta cyan blue

Ces constantes permettent de rcuprer directement des couleurs prdfinies (blanc, gris clair, gris, gris fonc, noir, rouge, rose, orange, jaune, vert, magenta, cyan et bleu).
Constructeurs
public Color (int r, int g, int b)

Construit une couleur partir de ses composantes entires rouge r, vert g et bleu b comprises entre 0 et 255.
public Color (int rgb)

Construit une couleur partir de l'entier rgb combinaison des composantes rouge (bits 16 23), vert (bits 8 15) et bleu (bits 0 7).
public Color (float r, float g, float b)

Construit une couleur partir de ses composantes dcimales rouge r, vert g et bleu b comprises entre 0.0 et 1.0.
Mthodes
public int getRed () public int getGreen () public int getBlue ()

Ces mthodes renvoient les composantes rouge, vert ou bleu d'une couleur comprises entre 0 et 255.
public int getRGB ()
Programmer en java Page 343

Dao Issiaka- 3me anne SI

Renvoie un entier combinaison des composantes rouge (bits 16 23), vert (bits 8 15) et bleu (bits 0 7) d'une couleur.
public Color brighter () public Color darker ()

Ces mthodes renvoient une couleur plus claire ou plus fonce d'une couleur.
public static Color getColor (String name) public static Color getColor (String name, Color v) public static Color getColor (String name, int v) public static int HSBtoRGB (float hue, float saturation, float brightness)

Renvoie un entier combinaison des composantes rouge, vert et bleu d'une couleur exprime par sa teinte hue, sa saturation saturation et sa luminosit brightness comprises entre 0.0 et 1.0.
public static float [ ] RGBtoHSB (int r, int g, int b, float hsbvals [ ])

Renvoie un tableau dcrivant la teinte, la saturation et la luminosit (aux indices 0, 1 et 2) d'une couleur partir de ses composantes rouge, vert et bleu comprises entre 0 et 255. Les valeurs sont stockes dans hsbvals s'il est diffrent de null, sinon un nouveau tableau est cr.
public static Color getHSBColor (float hue, float saturation, float brightness)

Cre une couleur partir de sa teinte hue, sa saturation saturation et sa luminosit brightness comprises entre 0.0 et 1.0.
public int hashCode () public boolean equals (Object obj) public String toString ()

Ces mthodes outrepassent celles de la classe Object, pour renvoyer un code de hash, comparer une une couleur un objet ou renvoyer une chane de caractres dcrivant la couleur. L'applet suivante dessine un nuancier. Les couleurs utilisent le mode HSB (Teinte, Saturation, Luminosit) pour avoir plus simplement les couleurs de toute la palette partir d'une teinte. Quand vous cliquez sur une couleur, le label en dessous du nuancier indique la couleur choisie. Cette applet vous permet de tester la palette des couleurs disponibles sur une Machine Virtuelle :

Voici le programme Java correspondant ( copier dans un fichier dnomm Nuancier.java et invoqu partir d'un fichier HTML) :

Programmer en java

Page 344

Dao Issiaka- 3me anne SI

import java.awt.*; import java.applet.*; public class Nuancier extends Applet { // Label bidon utilis pour afficher en couleur de fond la couleur choisie Label labelColorise = new Label (" "); Label labelCouleur = new Label ("Cliquez sur une couleur..."); public void init () { // Choix d'un layout BorderLayout (FlowLayout par dfaut) setLayout (new BorderLayout ()); // Ajout d'un composant affichant le nuancier add ("Center", new ComposantNuancier ()); // Cration et ajout d'un panel de deux labels d'information Panel panelInfo = new Panel (); panelInfo.setLayout (new BorderLayout (5, 0)); panelInfo.add ("West", labelColorise); panelInfo.add ("Center", labelCouleur); add ("South", panelInfo); } public boolean action (Event event, Object arg) { // Si une action est reue du composant nuancier // modifier la couleur de fond du label sans texte // et afficher les composantes RGB de la couleur choisie if (event.target instanceof ComposantNuancier) { Color couleur = (Color)arg; labelColorise.setBackground (couleur); labelColorise.repaint (); labelCouleur.setText ("Couleur : Rouge " + couleur.getRed () + ", Vert " + couleur.getGreen () + ", Bleu " + couleur.getBlue ()); } return true; } } // Classe ComposantNuancier class ComposantNuancier extends Panel { private static final int TAILLE = 40; private Rectangle [ ] carreaux = new Rectangle [TAILLE * TAILLE]; private Color [ ] couleurCarreaux = new Color [TAILLE * TAILLE]; // Constructeur : cre l'ensemble des couleurs des carreaux ComposantNuancier () { for (int i = 0; i < TAILLE; i++) { // Premire boucle ralisant un fondu du noir vers la teinte (moiti suprieure) int j; for (j = 0; j < TAILLE / 2; j++) couleurCarreaux [i * TAILLE + j] =
Programmer en java Page 345

Dao Issiaka- 3me anne SI

Color.getHSBColor ((float)i / TAILLE, Teinte 1, Saturation (float)j / TAILLE * 2); Luminosit

// // //

// Seconde boucle diminuant la saturation de la couleur (moiti infrieure) for ( ; j < TAILLE; j++) couleurCarreaux [i * TAILLE + j] = Color.getHSBColor ((float)i / TAILLE, // Teinte (float)(TAILLE - 1 - j) / TAILLE * 2, // Saturation 1); // Luminosit } } // Mthode appele quand le composant change de taille public void reshape (int x, int y, int width, int height) { super.reshape (x, y, width, height); // Calcul de la largeur et de la hauteur des carreaux int largeur = size ().width / TAILLE; int hauteur = size ().height / TAILLE; // Cration des rectangles reprsentant les carreaux de couleur for (int i = 0; i < TAILLE; i++) for (int j = 0; j < TAILLE; j++) carreaux [i * TAILLE + j] = new Rectangle (largeur * i, hauteur * j, largeur, hauteur); } public void paint (Graphics gc) { for (int i = 0; i < carreaux.length; i++) { // Slection d'une couleur et dessin du carreau gc.setColor (couleurCarreaux [i]); gc.fillRect (carreaux [i].x, carreaux [i].y, carreaux [i].width, carreaux [i].height); } } public boolean mouseDown (Event evt, int x, int y) { // Recherche du carreau dans lequel l'utilisateur cliquer // et envoi d'un vnement d'action for (int i = 0; i < carreaux.length; i++) if (carreaux [i].inside (x, y)) postEvent (new Event (this, Event.ACTION_EVENT, couleurCarreaux [i])); return true; } }

Autres exemples

Applets ObservateurCalcul, DrawIt, ListePolices, MultiImages et ScrollText.


Programmer en java Page 346

Dao Issiaka- 3me anne SI

Les classes manipulant des dimensions La classe java.awt.Dimension

Cette classe permet de manipuler les dimensions d'un objet (largeur et hauteur) grce ses deux champs public width et height.
Champs
public int width public int height

Constructeurs
public Dimension () public Dimension (Dimension d) public Dimension (int width, int height)

Mthode
public String toString ()

Cette mthode outrepasse la mthode toString () de la classe Object, pour renvoyer une chane de caractres dcrivant les dimensions.
Exemples

Applets BoutonsNavigation, MultiImages, ImageTableau, ImageNoirEtBlanc, ScrollText et Horloge.


La classe java.awt.Insets

Cette classe qui implmente l'interface Cloneable, permet de manipuler les bordures d'un container, qui dlimitent une zone dans laquelle il n'est pas possible de dessiner.
Champs
public public public public int int int int top left bottom right

Ces champs public dsignent les bordures en haut, gauche, en bas et droite.
Constructeur
public Insets (int top, int left, int bottom, int right)

Mthodes
public String toString () public Object clone ()

Ces mthodes outrepassent celles de la classe Object, pour renvoyer une chane de caractres dcrivant les valeurs des bordures ou un clone d'une instance de la classe Insets.

Programmer en java

Page 347

Dao Issiaka- 3me anne SI

La classe java.awt.Point

Cette classe permet de manipuler des points de coordonnes (x,y).


Champs
public int x public int y

Constructeur
public Point (int x, int y)

Mthodes
public void move (int x, int y)

Dplace le point en (x,y).


public void translate (int x, int y)

Effectue une translation (x,y) sur un point.


public int hashCode () public boolean equals (Object obj) public String toString ()

Ces mthodes outrepassent celles de la classe Object, pour renvoyer un code de hash, comparer un point un objet ou renvoyer une chane de caractres dcrivant le point.
La classe java.awt.Polygon

Cette classe permet de manipuler des polygones, ensemble de npoints points dont les coordonnes sont enregistres dans les tableaux xpoints et ypoints.
Champs
public int npoints public int xpoints [ ] public int ypoints [ ]

Constructeurs
public Polygon () public Polygon (int xpoints [ ], int ypoints [ ], int npoints)

Mthodes
public void addPoint (int x, int y)

Ajoute le point de coordonnes (x,y) la fin de l'ensemble des points.


public Rectangle getBoundingBox ()

Renvoie le rectangle englobant tous les points du polygone.


public boolean inside (int x, int y)

Renvoie true si le point de coordonnes (x,y) est l'intrieur du polygone.


Programmer en java Page 348

Dao Issiaka- 3me anne SI

Exemple

AppletPaperBoardClient.
La classe java.awt.Rectangle

Cette classe permet de manipuler des rectangles, mmoriss sous forme d'un point origine de coordonnes (x,y) reprsentant le coin suprieur gauche, de sa largeur width et de sa hauteur height.
Champs
public public public public int int int int x y width height

Constructeurs
public public public public public public Rectangle Rectangle Rectangle Rectangle Rectangle Rectangle () (int x, int y, int width, int height) (int width, int height) (Point p, Dimension d) (Point p) (Dimension d)

Mthodes
public void reshape (int x, int y, int width, int height)

Permet de changer l'origine, la largeur et la hauteur d'un rectangle.


public void move (int x, int y)

Dplace l'origine du rectangle en (x,y).


public void translate (int x, int y)

Effectue une translation (x,y) sur l'origine du rectangle.


public void resize (int width, int height)

Modifie la largeur et la hauteur d'un rectangle.


public boolean inside (int x, int y)

Renvoie true si le point de coordonnes (x,y) est l'intrieur d'un rectangle.


public boolean intersects (Rectangle r)

Renvoie true si le rectangle r et le rectangle sur lequel la mthode est invoque ont une intersection.
public Rectangle intersection (Rectangle r) public Rectangle union (Rectangle r)

Programmer en java

Page 349

Dao Issiaka- 3me anne SI

Ces mthodes renvoie un rectangle rsultat de l'intersection ou de l'union entre deux rectangles.
public void add (int newx, int newy) public void add (Point pt)

Ces mthodes ajoutent un point un rectangle qui est agrandit si ncessaire pour contenir le point pass en paramtre.
public void add (Rectangle r)

Ajoute le rectangle r au rectangle sur lequel la mthode est invoque. Le rsultat est l'union des deux rectangles.
public void grow (int horiz, int vert)

Agrandit un rectangle de horiz points gauche et droite, et de vert points en haut et en bas.
public boolean isEmpty ()

Renvoie true si la largeur ou la hauteur d'un rectangle est ngative ou nulle.


public int hashCode () public boolean equals (Object obj) public String toString ()

Ces mthodes outrepassent celles de la classe Object, pour renvoyer un code de hash, comparer un rectangle un objet ou renvoyer une chane de caractres dcrivant le rectangle.
La cration de nouveaux composants

Dans les trois exemples prcdents, les classes DrawItComponent, AfficheurTexte et ComposantNuancier drivent de la classe Panel. Bien que ces applets fonctionnent correctement, Panel est une classe de container donc prvue pour contenir d'autres composants. Pour crer de nouveaux composants, il est plutt recommand de driver de nouvelles classes partir de la classe Canvas.
La classe java.awt.Canvas

Cette classe qui drive de la classe Component, est la classe du package java.awt dont vous devez driver pour crer vos propres classes de composants.
Constructeur
public Canvas ()

Mthodes
public synchronized void addNotify ()

Programmer en java

Page 350

Dao Issiaka- 3me anne SI

Cette mthode outrepasse la mthode addNotify () de la classe Component pour crer le peer d'une instance de Canvas.
public void paint (Graphics gc)

Cette mthode outrepasse la mthode paint () de la classe Component, pour remplir le composant de la couleur de fond.

L'applet suivante utilise une nouvelle classe de composant BoutonImage. Ce composant est un bouton utilisant deux images de mme taille, pour reprsenter l'tat relch et l'tat enfonc du bouton :

Le programme Java correspondant a t divis en deux fichiers. Comme la classe BoutonImage ( copier dans un fichier dnomm BoutonImage.java) peut tre appele tre rutilise, elle est range dans un package tools :
// Les classes de ce fichier appartiennent au package tools package tools; import java.awt.*; import java.net.*; public class BoutonImage extends Canvas { private boolean boutonEnfonce = false; private boolean boutonSourisEnfonce = false; private Object private Image private Image argAction; imageRelache; imageEnfonce;

// Constructeur public BoutonImage (Object argAction, URL urlImageRelache, URL urlImageEnfonce) { try { this.argAction = argAction; // Cration des images enfonc/relch du bouton imageRelache = getToolkit ().getImage (urlImageRelache); imageEnfonce = getToolkit ().getImage (urlImageEnfonce); // Cration d'un MediaTracker pour charger les images // afin que leur taille soit disponible pour le layout MediaTracker imageTracker = new MediaTracker (this); imageTracker.addImage (imageRelache, 0); imageTracker.addImage (imageEnfonce, 0); imageTracker.waitForAll (); // En cas d'erreur, dclenchement d'une exception if (imageTracker.isErrorAny ()) throw new IllegalArgumentException ("Images introuvables"); } catch (InterruptedException e) { } }
Programmer en java Page 351

Dao Issiaka- 3me anne SI

// Il est conseill d'outrepasser les mthodes preferredSize () // et minimumSize () pour que les layouts utilisant ces mthodes // puissent dimensionner ce composant correctement public Dimension preferredSize () { return new Dimension (imageRelache.getWidth (this), imageRelache.getHeight (this)); } public Dimension minimumSize () { return preferredSize (); } // La mthode paint () dessine l'image suivant l'tat du bouton public void paint (Graphics gc) { if (boutonEnfonce) gc.drawImage (imageEnfonce, 0, 0, this); else gc.drawImage (imageRelache, 0, 0, this); } // Les mthodes mouseDown () et mouseUp () modifient l'image du // bouton l'enfoncement/relchement du bouton de la souris public boolean mouseDown (Event event, int x, int y) { modifierEnfoncementBouton (true); boutonSourisEnfonce = true; return true; } public boolean mouseUp (Event event, int x, int y) { boolean boutonEnfonce = this.boutonEnfonce; modifierEnfoncementBouton (false); boutonSourisEnfonce = false; // Si le bouton est rest enfonc, envoi d'un vnement d'action if (boutonEnfonce) postEvent (new Event (this, Event.ACTION_EVENT, argAction)); return true; } // Les mthodes mouseEnter () et mouseExit () modifient // l'image du bouton si le bouton de la souris est enfonc public boolean mouseEnter (Event event, int x, int y) { if (boutonSourisEnfonce) modifierEnfoncementBouton (true); return true; } public boolean mouseExit (Event event, int x, int y) { if (boutonSourisEnfonce) modifierEnfoncementBouton (false); return true; } private void modifierEnfoncementBouton (boolean nouvelEtat)
Programmer en java Page 352

Dao Issiaka- 3me anne SI

{ // Si l'tat enfonc/relch du bouton a chang // mettre jour le dessin du bouton if (boutonEnfonce != nouvelEtat) { boutonEnfonce = nouvelEtat; paint (getGraphics ()); } } }

L'autre fichier dcrit l'applet ( copier dans un fichier dnomm BoutonsNavigation.java et invoqu partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; import java.net.*; // Importation de la classe BoutonImage du package tools import tools.BoutonImage; public class BoutonsNavigation extends Applet { public void init () { try { // Cration et ajout des deux boutons l'applet add (new BoutonImage (new URL (getDocumentBase (), "awtlayouts10.html"), new URL (getCodeBase (), "prevup.gif"), new URL (getCodeBase (), "prevdown.gif"))); add (new BoutonImage (new URL (getDocumentBase (), "image10.html"), new URL (getCodeBase (), "nextup.gif"), new URL (getCodeBase (), "nextdown.gif"))); } catch (MalformedURLException e) { } } // Les boutons de classe BoutonImage mettent des vnements ACTION_EVENT public boolean action (Event evt, Object arg) { // Chargement d'un document HTML suivant le bouton enfonc if (arg instanceof URL) getAppletContext ().showDocument ((URL)arg); return true; } }

En rcuprant les valeurs de paramtres utilisant la balise PARAM, cette applet pourrait tre gnralise pour qu'elle configure les images et les actions des boutons, sans avoir modifier son code source chaque utilisation diffrente dans un fichier HTML.

Programmer en java

Page 353

Dao Issiaka- 3me anne SI

Les images
La gnration d'images Le chargement des images La cration d'images Transformer des images avec un filtre Comment a marche ? Gestion d'animations

La gnration d'images

Les images, instances de la classe Image, peuvent provenir de deux sources diffrentes :

Charges partir d'un fichier grce aux mthodes getImage () des classes Applet ou Toolkit. Ce fichier pouvant tre ventuellement tlcharg partir d'une URL sur un rseau, son chargement peut prendre un certain temps. C'est pourquoi la cration de ce type d'image se fait en deux temps : getImage () permet de crer une instance de la classe Image tandis que d'autres mthodes se chargent d'initialiser et de surveiller son chargement, et d'attendre la fin de son chargement. Cres de toute pice grce aux mthodes createImage () des classes Component et Toolkit. Ces images sont souvent utilises comme buffer ou comme bitmap affichs l'cran qu'une fois leur dessin termin.

Les mthodes drawImage () de la classe Graphics permettent d'afficher une image un point donn en la redimensionnant ventuellement, comme le montre l'applet suivante, qui cre une image d'un nuancier, et l'affiche 4 tailles diffrentes :

Voici le programme Java correspondant ( copier dans un fichier dnomm MultiImages.java et invoqu partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; public class MultiImages extends Applet { private Image image; public void reshape (int x, int y, int width, int height) { // Effectuer le comportement par dfaut du changement de taille super.reshape (x, y, width, height); // Cration de l'image que quand le peer de l'applet existe if (getPeer () != null)
Programmer en java Page 354

Dao Issiaka- 3me anne SI

{ Dimension taille = size (); taille.width /= 3; taille.height /= 3; // Cration d'une image de dimensions 3 fois plus petites que l'applet image = createImage (taille.width, taille.height); Graphics gc = image.getGraphics (); // Remplissage d'une image avec un nuancier de rouge et vert for (int i = 0; i < taille.height; i++) for (int j = 0; j < taille.width; j++) { gc.setColor (new Color ((float)i / taille.height, // Rouge (float)j / taille.width, // Vert 0)); // Bleu gc.fillRect (i, j, 1, 1); } } } public void paint (Graphics gc) { if (image != null) { // Dessin de l'image sa taille et agrandie gc.drawImage (image, 0, 0, this); gc.drawImage (image, image.getWidth (this), 0, image.getWidth (this) * 2, image.getHeight (this), this); gc.drawImage (image, 0, image.getHeight (this), image.getWidth (this), image.getHeight (this) * 2, this); gc.drawImage (image, image.getWidth (this), image.getHeight (this), image.getWidth (this) * 2, image.getHeight (this) * 2, this); } } }

Soit un composant comp sur lequel vous invoquez la mthode createImage (int width, int height) de la classe Component (comp peut tre une applet ou un autre composant). comp.createImage () ne cre une image que si le peer du composant comp existe. Le peer n'tant pas cr dans le constructeur d'un composant (de classe drive de Applet, Canvas, ou autre), cette caractristique vous amne crer une image pas forcment dans la mthode laquelle vous pensiez au dpart... Vous devez appeler createImage () qu'au moment o ce peer existe, par exemple dans la mthode init () de la classe Applet, dans la mthode paint () d'une classe drive de Canvas, ou en outrepassant la mthode addNotify () de la manire suivante :
//... Image image; public void addNotify () { super.addNotify (); // Le peer du composant existe, on peut crer une image
Programmer en java Page 355

Dao Issiaka- 3me anne SI

image = createImage (largeur, hauteur); } //...

Souvenez-vous donc que si un appel comp.createImage () vous renvoie null, demandez vous d'abord si le peer du composant comp existe ce moment.
La classe java.awt.Image

Cette classe abstract permet de manipuler les images en Java.


Champ
public final static Object UndefinedProperty

Constructeur
public Image ()

Mthodes
public abstract int getWidth (ImageObserver observer) public abstract int getHeight (ImageObserver observer)

Ces mthodes renvoient la largeur ou la hauteur d'une image. La classe Component implmentant l'interface ImageObserver, observer peut tre gal un composant. Si l'image n'est pas encore charge, la valeur -1 est renvoye.
public abstract Graphics getGraphics ()

Renvoie une instance de la classe Graphics, grce laquelle vous pouvez dessiner dans l'image.
public abstract ImageProducer getSource ()

Renvoie une instance de la classe implmentant l'interface ImageProducer. Cet objet est notamment utilis par les classes ralisant un filtrage.
public abstract Object getProperty (String observer) public abstract void flush () name, ImageObserver

Exemples

Applets BoutonsNavigation, MultiImages, ImageSimple, ChargementImage, ImageTableau, ImageNoirEtBlanc, NegatifImage, AnimationFleche, ScrollText et Horloge.
Le chargement des images

Comme il est expliqu au dbut de ce chapitre, la mthode getImage () permet crer une instance d'une image. Pour initialiser et surveiller le chargement d'une image et l'utiliser quand elle est partiellement ou entirement charge, il existe plusieurs moyens :

Programmer en java

Page 356

Dao Issiaka- 3me anne SI

Soit l'appel de l'une des mthodes drawImage () de la classe Graphics avec en paramtre une image img. Si img n'est encore pas charge, la mthode drawImage () dbute le chargement de l'image de manire asynchrone et rend la main. Le dernier paramtre de drawImage () doit tre une instance d'une classe implmentant l'interface ImageObserver comme par exemple la classe Component. Cette interface ne dclare qu'une seule mthode imageUpdate () et l'implmentation de cette mthode dans la classe Component redessine le composant pour mettre jour le dessin de l'image au fur et mesure de son chargement. Donc, si vous donnez en dernier paramtre le composant dans lequel l'image est affiche, l'image sera affiche automatiquement aussitt qu'elle est disponible. L'applet suivante utilise la mthode drawImage () pour charger et afficher une image :

Voici le programme Java correspondant ( copier dans un fichier dnomm ImageSimple.java et invoqu partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; public class ImageSimple extends Applet { private Image image; public void init () { // Cration d'une image image = getImage (getCodeBase (), "monval.jpg"); } public void paint (Graphics gc) { if (image != null) // Affichage de l'image (image charge automatiquement) gc.drawImage (image, 0, 0, this); } }

Soit l'appel des mthodes prepareImage (Image img, ImageObserver observer) ou prepareImage (Image img, int width, int height, ImageObserver observer) des classe Component et Toolkit. Ces mthodes permettent de dbuter le chargement de l'image img par un autre thread de manire asynchrone et rend la main. Les paramtres width et height permettent de redimensionner l'image ds son chargement. Le dernier paramtre observer doit tre une instance d'une classe implmentant l'interface ImageObserver et permet de surveiller l'tat du chargement de l'image. La classe Component implmentant cette interface, vous pouvez utiliser un composant comme paramtre. L'applet ChargementImage est un exemple d'utilisation de la mthode prepareImage () et de l'interface ImageObserver. Soit en utilisant la classe MediaTracker, qui permet de surveiller et d'attendre la fin du chargement d'une image. Cette classe qui utilise la mthode prepareImage () et l'interface ImageObserver, simplifie la programmation du chargement d'une image.

Programmer en java

Page 357

Dao Issiaka- 3me anne SI

De plus, les mthodes checkImage () des classes Component et Toolkit permettent de vrifier l'tat du chargement d'une image. Ces mthodes prennent en dernier paramtre une instance d'une classe implmentant l'interface ImageObserver, dont la mthode imageUpdate () est appele pour lui communiquer l'tat de l'image.
La classe java.awt.MediaTracker

Cette classe permet de grer le chargement d'une ou plusieurs images. Elle est utilise par les applets BoutonsNavigation, AnimationFleche et Horloge pour charger les images dont elles ont besoin. Les mthodes addImage () permettent de donner un ensemble d'images charger et les mthodes waitForID () et waitForAll () de lancer le chargement des images.
Champs
public public public public final final final final static static static static int int int int ABORTED COMPLETE ERRORED LOADING

Les mthodes statusID () et statusAll () renvoie une combinaison de ces constantes pour indiquer l'tat du chargement des images (annul, termin, erreur ou en cours de chargement).
Constructeur
public MediaTracker (Component comp)

Construit une instance de MediaTracker. comp dsigne un composant dans lequel sera visualis les images charger.
Mthodes
public void addImage (Image image, int id) public synchronized void addImage (Image image, int id, int width, int height)

Ces mthodes permettent d'ajouter une image charger. width et height permettent d'ventuellement redimensionner l'image ds son chargement. id est un identifiant numrique permettant de rassembler les images, pour les charger par groupe avec les mthodes ...ID () de cette classe.
public public public public void waitForID (int id) synchronized boolean waitForID (int id, long ms) void waitForAll () synchronized boolean waitForAll (long ms)

Ces mthodes permettent de lancer le chargement des images d'identifiant id ou de toutes les images et met en attente le thread courant jusqu' la fin de leur chargement ou pendant le laps de temps ms millisecondes.
public int statusID (int id, boolean load) public int statusAll (boolean load)

Programmer en java

Page 358

Dao Issiaka- 3me anne SI

Ces mthodes renvoient l'tat du chargement des images d'identifiant id ou de toutes les images. La valeur renvoye est une combinaison des constantes ABORTED, COMPLETE, ERRORED et LOADING. Si load est gal true, le chargement des images est dmarr.
public public public public boolean checkID (int id) synchronized boolean checkID (int id, boolean load) synchronized boolean checkAll () boolean checkAll (boolean load)

Ces mthodes renvoient true si les images d'identifiant id ou toutes les images sont charges correctement (tat gal COMPLETE). Si load est gal true (gal false par dfaut), le chargement des images est dmarr.
public synchronized boolean isErrorID (int id) public synchronized boolean isErrorAny ()

Ces mthodes renvoient true si une erreur est survenue pendant le chargement d'une des images d'identifiant id ou de n'importe quelle image (tat gal ERRORED).
public synchronized Object [ ] getErrorsID (int id) public synchronized Object [ ] getErrorsAny ()

Ces mthodes renvoient un tableau contenant toutes les images ventuellement d'identifiant id, dont le chargement a produit une erreur.
Exemples

Applets BoutonsNavigation, AnimationFleche et Horloge.


L'interface java.awt.image.ImageObserver

Cette interface est utilise pour surveiller le chargement d'une image. Une classe implmentant cette interface est requise par la mthode drawImage () de la classe Graphics, les mthodes prepareImage () et checkImage () des classes Component et Toolkit et les mthodes getWidth () et getHeight () de la classe Image. Cette interface est notamment implmente par la classe Component pour mettre jour un composant contenant une image au fur et mesure que celle-ci est charge.
Champs

Le paramtre infoflags de la mthode imageUpdate () utilise une combinaison des constantes suivantes pour indiquer quelles caractristiques d'une image sont connues au moment du chargement d'une image :
public final static int WIDTH public final static int HEIGHT

La largeur ou la hauteur de l'image sont disponibles.


public final static int PROPERTIES

Programmer en java

Page 359

Dao Issiaka- 3me anne SI

Les proprits de l'image sont disponibles.


public final static int SOMEBITS public final static int FRAMEBITS

Une partie de l'image est charge.


public final static int ALLBITS

Le chargement de l'image est termin et toutes ses caractristiques sont disponibles.


public final static int ERROR

Une erreur est survenue pendant le chargement de l'image. Combin avec ABORT.
public final static int ABORT

Le chargement de l'image a t annul.


Mthodes
public boolean imageUpdate (Image image, int infoflags, int x, int y, int width, int height)

Cette mthode est appele au cours du chargement d'une image pour indiquer quelles en sont les caractristiques connues. infoflags est une combinaison des constantes WIDTH, HEIGHT, PROPERTIES, SOMEBITS, FRAMEBITS, ALLBITS, ERROR et ABORT. x, y, width et height sont significatives suivant la valeur de infoflags. imageUpdate () doit renvoyer true si elle a besoin d'tre encore appele pour lui communiquer les phases suivantes du chargement d'une image. Gnralement, false est renvoy en cas d'erreur. L'applet suivante utilise l'interface ImageObserver pour attendre la fin du chargement d'une image et l'afficher :

Voici le programme Java correspondant ( copier dans un fichier dnomm ChargementImage.java et invoqu partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; import java.awt.image.*; public class ChargementImage extends Applet implements ImageObserver { private Image image; private boolean chargementTermine = false; public void init () { // Cration d'une image et lancement de son chargement image = getImage (getCodeBase (), "brookbr.jpg"); prepareImage (image, this);
Programmer en java Page 360

Dao Issiaka- 3me anne SI

} public void paint (Graphics gc) { // Si le chargement de l'image est termin, affichage de l'image // sinon affichage d'une chane de caractres d'attente if (chargementTermine) gc.drawImage (image, 0, 0, this); else gc.drawString ("Chargement en cours...", 10, size ().height 10); } // Mthode appele pour communiquer les tapes du chargement de l'image public boolean imageUpdate (Image image, int infoFlags, int x, int y, int width, int height) { // Si le chargement est termin, redessin de l'applet if ((infoFlags & ALLBITS) != 0) { chargementTermine = true; repaint (); } return (infoFlags & (ALLBITS | ABORT)) == 0; } }

A la diffrence de l'applet ImageSimple, l'image de cette applet n'est affiche qu'une fois que l'image est entirement charge.
La cration d'images

Comme le montre l'applet MultiImages, une image peut tre cre grce la mthode createImage (int width, int height) de la classe Component. Cette mthode cre une image vierge dans laquelle vous pouvez dessiner grce aux mthodes de dessin de la classe Graphics. Il existe une deuxime version de la mthode createImage () disponible dans les classes Component et Toolkit : createImage (ImageProducer producer). Le paramtre producer doit tre d'une classe qui implmente l'interface ImageProducer. Le package java.awt.image fournit deux classes qui implmentent cette interface :

La classe MemoryImageSource permet de crer une image initialise avec un tableau dcrivant la couleur de chacun des points d'une image. La classe FilteredImageSource permet de crer une image qui est le rsultat de l'application d'un filtre sur une image existante.

La classe java.awt.image.MemoryImageSource

Cette classe qui implmente l'interface ImageProducer permet de crer une image partir d'un tableau dcrivant la couleur de chacun des points (ou pixels) d'une image.
Constructeurs
public MemoryImageSource (int width, int height, int pix [ ], int offset, int scan)
Programmer en java Page 361

Dao Issiaka- 3me anne SI

public MemoryImageSource (int width, int height, int pix [ ], int offset, int scan, Hashtable props) public MemoryImageSource (int width, int height, ColorModel cm, int pix [ ], int offset, int scan) public MemoryImageSource (int width, int height, ColorModel cm, int pix [ ], int offset, int scan, Hashtable props) public MemoryImageSource (int width, int height, ColorModel cm, byte pix [ ], int offset, int scan) public MemoryImageSource (int width, int height, ColorModel cm, byte pix [ ], int offset, int scan, Hashtable props)

Ces constructeurs permettent de crer une image de largeur width et de hauteur height partir du tableau pix [ ] de type byte ou int. pix [ ] dcrit la couleur de chacun des points de l'image ligne par ligne. offset permet de donner le premier point du tableau utiliser et scan le nombre de pixels par ligne dans le tableau pix [ ] au cas o cette valeur serait diffrente de width. cm permet de spcifier un modle de couleur (par dfaut gal au modle RGB par dfaut), et props dcrit ventuellement les proprits associes l'image.
Mthodes
public public public public public synchronized void addConsumer (ImageConsumer ic) synchronized boolean isConsumer (ImageConsumer ic) synchronized void removeConsumer (ImageConsumer ic) void startProduction (ImageConsumer ic) void requestTopDownLeftRightResend (ImageConsumer ic)

Implmentation des mthodes de l'interface ImageProducer. L'applet suivante, comme l'applet MultiImages, cre un nuancier en rouge et vert mais cette fois-ci en utilisant la classe MemoryImageSource :

Voici le programme Java correspondant ( copier dans un fichier dnomm ImageTableau.java et invoqu partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; import java.awt.image.*; public class ImageTableau extends Applet { private Image image; public void init () { Dimension taille = size (); int [ ] tableauPixels = new int [taille.width * taille.height]; // Remplissage du tableau avec un nuancier de rouge et vert
Programmer en java Page 362

Dao Issiaka- 3me anne SI

// les pixels sont dcrits ligne par ligne par leur code RGB for (int i = 0; i < taille.height; i++) for (int j = 0; j < taille.width; j++) tableauPixels [i * taille.width + j] = 255 << 24 // Transparence | ((j * 255 / taille.width) << 16) // Rouge | ((i * 255 / taille.height) << 8) // Vert | 0; // Bleu // Cration d'une image partir du tableau image = createImage (new MemoryImageSource (taille.width, taille.height, tableauPixels, 0, taille.width)); } public void paint (Graphics gc) { if (image != null) gc.drawImage (image, 0, 0, this); } }

Remplir le tableau oblige ici positionner les bits des composantes Rouge, Vert, Bleu d'une couleur. Quelle est la principale diffrence entre cette applet et l'applet MultiImages ? A partir de mesures de temps ralises sur ces deux applets, la cration d'une image de mme dimension prend au moins 100 fois plus de temps par l'applet MultiImages que sur l'applet ImageTableau ! Donc, si la cration d'une image n'a pas besoin des mthodes de dessin de la classe Graphics, n'hsitez pas utiliser la classe MemoryImageSource. Le modle de couleur RGB par dfaut implique que chaque couleur d'un point est code sur un entier 32 bits dont les bits 16 23 reprsentent le Rouge, les bits 8 15 le Vert et les bits 0 7 le Bleu, ET dont les bits 24 31 reprsentent le canal alpha. Cette dernire valeur correspond la transparence (0 pour transparent 255 pour opaque) : si vous oubliez de mettre une valeur pour ces bits dans le code couleur, l'image sera du coup transparente et donc invisible !
Autre exemple

Applets ImageNoirEtBlanc.
La classe java.awt.image.ColorModel

Cette classe abstract est la super classe des modles de couleurs. Un modle de couleur dcrit comment retrouver la couleur d'un point (ou pixel) d'une image partir de sa valeur entire. Le modle de couleur RGB par dfaut est obtenu par la mthode static getRGBDefault (). Les classes DirectColorModel et IndexColorModel qui drivent de cette classe permettent d'utiliser des modles de couleur diffrents, pour par exemple dcrire une image cre avec la classe MemoryImageSource.
Champ
protected int pixel_bits

Nombre de bits par pixel.


Programmer en java Page 363

Dao Issiaka- 3me anne SI

Constructeur
public ColorModel (int bits)

Mthodes
public static ColorModel getRGBdefault ()

Renvoie le modle de couleur RGB par dfaut utilisant 32 bits avec les bits 24 31 pour le canal alpha, les bits 16 23 pour le Rouge, les bits 8 15 pour le Vert et les bits 0 7 pour le Bleu.
public int getPixelSize ()

Renvoie le nombre de bits utilis par un modle de couleur pour coder la couleur d'un pixel.
public public public public abstract abstract abstract abstract int int int int getRed (int pixel) getGreen (int pixel) getBlue (int pixel) getAlpha (int pixel)

Ces mthodes doivent renvoyer les composantes Rouge, Vert, Bleu et Alpha (comprises entre 0 et 255) pour une valeur pixel.
public int getRGB (int pixel)

La classe java.awt.image.DirectColorModel

Cette classe qui drive de la classe ColorModel permet de dfinir un modle de couleur diffrent du modle RGB par dfaut, qui n'utilise pas forcment 32 bits pour coder la couleur d'un pixel. Ce modle permet par exemple de dcrire comment coder une couleur sur 16 bits, utilisant les bits 11 15 pour le Rouge, les bits 6 10 pour le Vert et les bits 0 5 pour le Bleu (correspondant la cration d'une instance de la classe DirectColorModel par l'instruction new DirectColorModel (16, 0xF800, 0x07C0, 0x003F)).
Constructeur
public DirectColorModel (int bits, int rmask, int gmask, int bmask) public DirectColorModel (int bits, int rmask, int gmask, int bmask, int amask)

Ces constructeurs permettent de crer un modle de couleur sur nbits bits. rmask, gmask bmask et amask dcrivent les masques de bits utiliss pour coder les composantes Rouge, Vert, Bleu et Alpha. Les masques doivent occups les bits de poids le plus faible. Par dfaut, les couleurs sont opaques.
Mthodes
public public public public final final final final int int int int getRed (int pixel) getGreen (int pixel) getBlue (int pixel) getAlpha (int pixel)

Ces mthodes renvoient les composantes Rouge, Vert, Bleu ou Alpha (comprises entre 0 et 255) pour une valeur de couleur pixel, utilise avec ce modle de couleur.
Programmer en java Page 364

Dao Issiaka- 3me anne SI

public final int getRGB (int pixel)

Renvoie la couleur RGB utilisant le modle de couleur RGB par dfaut pour une valeur pixel.
public public public public final final final final int int int int getRedMask () getGreenMask () getBlueMask () getAlphaMask ()

Renvoie masques de bits utiliss pour coder les composantes Rouge, Vert, Bleu ou Alpha de ce modle de couleur.
La classe java.awt.image.IndexColorModel

Cette classe qui drive de la classe ColorModel permet de dfinir une palette de plusieurs couleurs. Chaque couleur de cette palette est dfinie par ses composantes RGB (comprises entre 0 et 255) et Alpha (transparence de 0 transparent 255 opaque). Une image utilisant une palette de couleurs dfinit la couleur de chacun de ses points par un entier gal l'indice d'une couleur de cette palette (comme par exemple les images au format GIF).
Constructeur
public IndexColorModel (int bits, int size, byte r [ ], byte g [ ], byte b [ ]) public IndexColorModel (int bits, int size, byte r [ ], byte g [ ], byte b [ ], byte a [ ]) public IndexColorModel (int bits, int size, byte r [ ], byte g [ ], byte b [ ], int trans)

Ces constructeurs permettent de crer une palette de size couleurs. Les tableaux r [ ], g [ ], b [ ] et a [ ] dcrivent les composantes Rouge, Vert, Bleu et Alpha de chacune des couleurs de la palette. Par dfaut, chaque couleur est opaque. trans permet de spcifier l'indice de la couleur qui sera considre comme transparente (comme pour les images au format GIF). bits donne le nombre de bits utilis par chaque pixel (habituellement gal log2 size arrondi l'entier suprieur).
public IndexColorModel (int bits, int size, byte cmap [ ], int start, boolean hasalpha) public IndexColorModel (int bits, int size, byte cmap [ ], int start, boolean hasalpha, int trans)

[ ]

Ces constructeurs permettent de crer une palette de size couleurs. Le tableau cmap dcrit dans l'ordre les composantes Rouge, Vert, Bleu et Alpha (si hasalpha est gal true) de chacune des couleurs de la palette. start permet de spcifier l'indice du premier lment du tableau utiliser. trans et bits sont utilises de la mme manire que pour les constructeurs prcdents.

Programmer en java

Page 365

Dao Issiaka- 3me anne SI

Mthodes
public final int getMapSize ()

Renvoie la taille de la palette.


public final int getTransparentPixel ()

Renvoie l'indice de la couleur transparente ou -1 s'il n'est pas dfini.


public public public public final final final final int int int int getRed (int pixel) getGreen (int pixel) getBlue (int pixel) getAlpha (int pixel)

Ces mthodes renvoient les composantes Rouge, Vert, Bleu ou Alpha (comprises entre 0 et 255) l'indice pixel de la palette.
public final int getRGB (int pixel)

Renvoie la couleur RGB utilisant le modle de couleur RGB par dfaut l'indice pixel de la palette.
public public public public final final final final void void void void getReds (byte r [ ]) getGreens (byte g [ ]) getBlues (byte b [ ]) getAlphas (byte a [ ])

Ces mthodes remplissent le tableau qui leur est pass en paramtre avec les composantes Rouge, Vert, Bleu ou Alpha de chacune des couleurs de la palette. L'applet suivante cre une image alatoire en utilisant la classe MemoryImageSource, et une palette de couleurs noir et blanc :

Voici le programme Java correspondant ( copier dans un fichier dnomm ImageNoirEtBlanc.java et invoqu partir d'un fichier HTML) :
import import import import java.applet.Applet; java.awt.*; java.awt.image.*; java.util.Random;

public class ImageNoirEtBlanc extends Applet { private Image image; public void init () { byte [ ] noirEtBlanc = {0x00, 0x00, 0x00, // Noir (byte)0xFF, (byte)0xFF, (byte)0xFF}; // Blanc ColorModel paletteNoirEtBlanc = new IndexColorModel (1, 2, noirEtBlanc, 0, false);
Programmer en java Page 366

Dao Issiaka- 3me anne SI

Dimension taille = size (); byte [ ] tableauPixels = new byte [taille.width * taille.height]; Random generateur = new Random (); // Remplissage alatoire avec les valeurs 0 ou 1 for (int i = 0; i < tableauPixels.length; i++) tableauPixels [i] = (byte)Math.abs (generateur.nextInt () % 2); // Cration d'une image partir du tableau image = createImage (new MemoryImageSource (taille.width, taille.height, paletteNoirEtBlanc, tableauPixels, 0, taille.width)); } public void paint (Graphics gc) { if (image != null) gc.drawImage (image, 0, 0, this); } }

Une image cre avec la classe MemoryImageSource et une palette de couleurs de classe IndexColorModel doit utiliser un tableau de type byte pour mmoriser la couleur des points de l'image (ceci limite la palette 256 couleurs).
La classe java.awt.image.PixelGrabber

Cette classe qui implmente l'interface ImageConsumer permet de rcuprer les points d'une partie d'une image dans un tableau. Le tableau est rempli avec la couleur de chacun de ces points en utilisant le modle de couleur RGB par dfaut.
Constructeurs
public PixelGrabber (Image img, int x, int y, int width, int height, int pix [ ], int offset, int scansize) public PixelGrabber (ImageProducer ip, int x, int y, int width, int height, int pix [ ], int offset, int scansize)

Ces constructeurs crent une instance de la classe PixelGrabber pour rcuprer dans le tableau pix [ ] une portion rectangulaire d'une image aux coordonnes (x,y), de largeur width et de hauteur height. Le tableau est rempli partir de l'indice offset, avec un nombre de scansize pixels par ligne.
Mthodes
public boolean grabPixels () throws InterruptedException public synchronized boolean grabPixels (long ms) throws InterruptedException

Ces mthodes dmarre la rcupration des points de l'image (ventuellement pendant ms millisecondes maximum).
public synchronized int status ()

Programmer en java

Page 367

Dao Issiaka- 3me anne SI

Renvoie le statut des points rcuprer. La valeur renvoye est une combinaison des constantes dclares dans l'interface ImageObserver.
public public public public public setDimensions (int width, int height) setProperties (Hashtable props) setColorModel (ColorModel model) setHints (int hints) setPixels (int x, int y, int w, int h, ColorModel model, byte pixels [ ], int off, int scansize) public void setPixels (int x, int y, int w, int h, ColorModel model, int pixels [ ], int off, int scansize) public void imageComplete (int status) void void void void void

Implmentation des mthodes de l'interface ImageConsumer pour stocker l'image dans le tableau pass au constructeur.
Transformer des images avec un filtre

Java comporte le concept de filtres qui permettent de transformer une image en une autre. Ces filtres drivent de la classe ImageFilter, et permettent toute sorte de transformation. Le package java.awt.image fournit deux classes de filtre drives de la classe ImageFilter, les classes CropImageFilter qui permet d'extraire une partie d'une image, et RGBImageFilter qui permet de transformer la couleur de chacun des points d'une image ; vous pouvez aussi imaginer toute sorte de filtre. Une image filtre est cre grce la mthode createImage (ImageProducer producer) des classes Component ou Toolkit, avec le paramtre producer gal une une instance de la classe FilteredImageSource. Pour plus d'information sur le fonctionnement du filtrage d'images, voir Comment a marche ?
La classe java.awt.image.FilteredImageSource

Cette classe qui implmente l'interface ImageProducer permet de crer une image filtre. Le constructeur de cette classe prend en paramtre une instance d'une classe implmentant l'interface ImageProducer (obtenue par exemple grce la mthode getSource () de la classe Image) et une instance d'une classe de filtre. Les applets NegatifImage, Compteur et AnimationFleche utilise cette classe pour crer des images filtres.
Constructeur
public FilteredImageSource (ImageProducer orig, ImageFilter imgf)

Mthodes
public public public public public synchronized void addConsumer (ImageConsumer ic) synchronized boolean isConsumer (ImageConsumer ic) synchronized void removeConsumer (ImageConsumer ic) void startProduction (ImageConsumer ic) void requestTopDownLeftRightResend (ImageConsumer ic)

Programmer en java

Page 368

Dao Issiaka- 3me anne SI

Implmentation des mthodes de l'interface ImageProducer ralisant le filtrage.


La classe java.awt.image.ImageFilter

Cette classe qui implmente les interfaces ImageConsumer et Cloneable, est la super classe de toutes les classes permettant de raliser un filtrage. Cette classe n'a aucun effet sur l'image filtrer (filtre nul). Le package java.awt.image fournit les deux classes de filtre CropImageFilter et RGBImageFilter.
Champ
protected ImageConsumer consumer

Consommateur final d'images de l'image filtre. Une fois modifies, les donnes doivent tre renvoye ce consommateur.
Constructeur
public ImageFilter ()

Mthodes
public public public public public setDimensions (int width, int height) setProperties (Hashtable props) setColorModel (ColorModel model) setHints (int hints) setPixels (int x, int y, int w, int h, ColorModel model, byte pixels [ ], int off, int scansize) public void setPixels (int x, int y, int w, int h, ColorModel model, int pixels [ ], int off, int scansize) public void imageComplete (int status) void void void void void

Implmentation des mthodes de l'interface ImageConsumer pour renvoyer l'image non modifie consumer.
public ImageFilter getFilterInstance (ImageConsumer ic) public void resendTopDownLeftRight (ImageProducer ip) public Object clone ()

Exemple

Applet Compteur.
La classe java.awt.image.CropImageFilter

Cette classe qui drive de la classe ImageFilter permet d'extraire une partie d'une image. Elle est intressante pour rcuprer diffrentes images d'une image tlcharge. En effet, il est plus rapide de charger un seul fichier et d'en extraire plusieurs images que de charger plusieurs images, car une seule requte est ncessaire et la taille d'un fichier compress comportant plusieurs images est plus petite que la somme des tailles des fichiers compresss de ces images.
Programmer en java Page 369

Dao Issiaka- 3me anne SI

Constructeur
public CropImageFilter (int x, int y, int width, int height)

Construit un filtre permettant d'extraire une image aux coordonnes (x,y), de largeur width et de hauteur height.
Mthodes
public void setProperties (Hashtable props) public void setDimensions (int w, int h) public void setPixels (int x, int y, int w, int h, ColorModel model, byte pixels [ ], int off, int scansize) public void setPixels (int x, int y, int w, int h, ColorModel model, int pixels [ ], int off, int scansize)

Ces mthodes outrepassent celles de la classe ImageFilter pour raliser les oprations du filtre.
Exemple

Applet AnimationFleche.
La classe java.awt.image.RGBImageFilter

Cette classe abstract qui drive de la classe ImageFilter permet de crer des classes de filtres modifiant la couleur des points d'une images. Il faut pour cela crer une classe drive de cette classe et implmenter la mthode filterRGB (int x, int y, int rgb) pour qu'elle renvoie la nouvelle couleur (modifie ou non) du point de coordonnes (x,y). A la cration de l'image filtre avec la classe FilteredImageSource, l'ensemble des points de l'image originale est numr travers cette mthode pour rcuprer la couleur de chacun des points de la nouvelle image.
Champs
protected ColorModel origmodel protected ColorModel newmodel protected boolean canFilterIndexColorModel

Si le filtrage de la couleur ne dpend pas des coordonnes des points de l'image, il est conseill de mettre ce champ true.
Constructeur
public RGBImageFilter ()

Mthodes
public abstract int filterRGB (int x, int y, int rgb)

Cette mthode doit tre outrepasse par les classes drives pour renvoyer la couleur du point de coordonnes (x,y) de l'image filtre, sachant que la couleur de l'image originale est gale rgb ce point.
Programmer en java Page 370

Dao Issiaka- 3me anne SI

public void filterRGBPixels (int x, int y, int w, int h, int pixels [ ], int off, int scansize) public void substituteColorModel (ColorModel oldcm, ColorModel newcm) public IndexColorModel filterIndexColorModel (IndexColorModel icm) public void setColorModel (ColorModel model) public void setPixels (int x, int y, int w, int h, ColorModel model, byte pixels [ ], int off, int scansize) public void setPixels (int x, int y, int w, int h, ColorModel model, int pixels [ ], int off, int scansize)

Ces mthodes outrepassent celles de la classe ImageFilter pour raliser les oprations du filtre.

Voici un exemple d'applet utilisant cette classe pour crer le ngatif d'une image :

et le programme Java correspondant ( copier dans un fichier dnomm NegatifImage.java et invoqu partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; import java.awt.image.*; public class NegatifImage extends Applet { private Image image, negatifImage; public void init () { // Cration d'une image et de son ngatif image = getImage (getCodeBase (), "rockfel.jpg"); negatifImage = createImage (new FilteredImageSource (image.getSource (), new FiltreNegatif ())); } public void paint (Graphics gc) { if (image != null) { // Affichage des images gc.drawImage (image, 0, 0, this); gc.drawImage (negatifImage, image.getWidth (this) + 10, 0, this); } }

Programmer en java

Page 371

Dao Issiaka- 3me anne SI

} // Classe FiltreNegatif transformant une couleur en son inverse class FiltreNegatif extends RGBImageFilter { public FiltreNegatif () { // La transformation des couleurs ne dpend pas // des coordonnes des points de l'image canFilterIndexColorModel = true; } public int filterRGB (int x, int y, int rgb) { int alpha = rgb & 0xFF000000; // Transformation des composantes RGB en leur inverse int rougeInverse = (rgb & 0xFF0000) ^ 0xFF0000; int vertInverse = (rgb & 0x00FF00) ^ 0x00FF00; int bleuInverse = (rgb & 0x0000FF) ^ 0x0000FF; return alpha | rougeInverse | vertInverse | bleuInverse; } }

Comment a marche ?

Les classes dcrites prcdemment implmentent soit l'interface ImageProducer (classes MemoryImageSource et FilteredImageSource), soit l'interface ImageConsumer (classes PixelGrabber, ImageFilter et les classes qui en drivent). Bien qu'il soit entirement possible d'utiliser ces classes sans connatre ces interfaces, vous vous demandez peut-tre quoi servent les interfaces ImageProducer et ImageConsumer et quel modle elles respectent. Tout d'abord, ces deux interfaces ne vont pas l'une sans l'autre. C'est un peu comme pour vous, consommateur d'images (ImageConsumer), et votre magntoscope, producteur d'images (ImageProducer) : vous mettez en marche le magntoscope pour voir un film. Vous pouvez tre plusieurs voir un mme film et le magntoscope n'a d'intrt que si les images qu'ils diffusent sont vues. Souvenez-vous de cette analogie, elle vous aidera mieux comprendre comment fonctionne le modle de gestion des images du package java.awt.image. Gnralement en Java, un consommateur d'images est le systme graphique de votre ordinateur qui attend qu'on lui transmette les pixels afficher l'cran. Un producteur d'images est capable de crer une image partir d'un fichier GIF ou JPEG (la mthode getImage () de la classe Toolkit renvoie une instance de la classe Image dont le producteur peut tre obtenu grce la mthode getSource ()) ou partir d'une zone mmoire (via la classe MemoryImageSource). Quand le consommateur d'images a besoin d'afficher une image, le producteur d'images est dmarr en appelant la mthode startProduction () qu'implmente le producteur. Ce dernier renvoie alors au consommateur tous les renseignements (taille, modle de couleur, couleur de chacun des pixels) qui lui permettront de construire l'image, en appelant successivement les mthodes setDimensions (), setColorModel (), setPixels () qu'implmente le consommateur.

Programmer en java

Page 372

Dao Issiaka- 3me anne SI

figure 17. Gnration d'une image

Quand toutes les donnes d'une image ont t transmises au consommateur ou en cas d'erreur, le producteur appelle la mthode imageComplete () qu'implmente le consommateur. Le producteur peut ventuellement dlivrer l'image par morceaux en appelant plusieurs fois la mthode setPixels (), ce qui permet au consommateur d'afficher l'image au fur et mesure qu'elle est disponible. Par exemple, c'est ce qui se produit l'affichage d'une image provenant d'un fichier tlcharg sur Internet : comme les donnes de l'image sont dlivres relativement lentement, on voit l'image qui se dessine petit petit comme dans l'exemple d'applet ImageSimple. Le producteur peut tre aussi capable de gnrer plusieurs images pour crer un animation. Dans ce cas, il appelle imageComplete () chaque fois qu'une image de l'animation (frame en anglais) a t entirement dcrite. Comme il est possible que plusieurs personnes regardent un mme film, un producteur d'images peut avoir plusieurs consommateurs qui lui demandent de leur envoyer les donnes d'une image. En appliquant ce modle de manire plus gnrale, il est possible d'imaginer toute sorte de classes de producteur ou de consommateur d'images, du moment qu'ils implmentent les interfaces ImageProducer ou ImageConsumer. Il est possible de crer par exemple une classe de consommateur d'images dont le but est d'crire une image dans un fichier respectant tel ou tel format : c'est ce schma qu'utilise la bibliothque fournit par Acme, pour gnrer des sorties GIF. La classe PixelGrabber est aussi une classe implmentant l'interface ImageConsumer : elle permet d'interroger la valeur des pixels d'une image. En fait, elle stocke dans un tableau les valeurs transmises par le producteur l'appel de la mthode setPixels (). Le filtrage d'images utilise aussi ce systme, en intercalant des classes de producteur (FilteredImageSource) et de consommateur (drivant de la classe ImageFilter qui implmente l'interface ImageConsumer) entre le producteur original et le consommateur final.

Programmer en java

Page 373

Dao Issiaka- 3me anne SI

figure 18. Filtrage d'une image

Pour crer une image filtre imageFiltree de classe FilteredImageSource, vous devez passer en paramtre au constructeur de cette classe un producteur d'image et un filtre dont la classe FiltreImage drive de ImageFilter. Quand le consommateur d'images appelle la mthode startProduction () sur imageFiltree, l'objet imageFiltree cre une instance spciale de filtre filtreImageIC qui mmorise le consommateur final puis imageFiltree appele son tour la mthode startProduction () sur le producteur original en lui passant en paramtre le nouveau consommateur d'images filtreImageIC. Quand le producteur original produit l'image en appelant successivement les mthodes setDimensions (), setPixels (),... c'est donc sur le consommateur filtreImageIC. filtreImageIC rappelle ces mthodes sur le consommateur final avec des valeurs modifies en fonction du filtre voulu. Comme c'est filtreImageIC qui transmet toutes les donnes de l'image au consommateur final, il peut crer tous les effets possibles, comme changer la taille ou les couleurs de l'image, voir mme crer une animation sur une image qui tait statique l'origine ! Voici un exemple d'applet qui affiche l'image d'un nombre alatoire et utilise la classe de filtre drivant de la classe ImageFilter. Cette classe permet de fabriquer l'image d'un nombre donn partir d'une image dcrivant les 10 chiffres de 0 9, dans 10 zones rectangulaires de taille gale. Globalement, quand le producteur appelle une des deux mthodes setPixels (), cette classe mmorise les pixels qu'on lui transmet, puis une fois qu'elle a une image complte, elle retransmet au consommateur final les images de chacun des chiffres du nombre afficher. Cette applet prend en paramtre le nom du fichier d'image contenant le dessin de tous les chiffres. Ceci permet de rendre le compteur sous diffrents aspects, comme le montrent les deux exemples suivants, l'un utilisant l'image JPEG chiffres1.jpg, l'autre le fichier GIF anim chiffres2.gif (l'animation d'un GIF n'est gre qu' partir de Java 1.1) :
ImageFilterCounter

Voici le programme Java correspondant ( copier dans un fichier dnomm Compteur.java et invoqu partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*;
Programmer en java Page 374

Dao Issiaka- 3me anne SI

import java.awt.image.*; public class Compteur extends Applet { private Image image; public void start () { // Rcupration de l'image originale dont le fichier // est indiqu dans le paramtre de l'applet "image" Image imageOriginale = getImage (getCodeBase (), getParameter ("image")); // Cration d'une image filtre avec un nombre alatoire image = createImage (new FilteredImageSource (imageOriginale.getSource (), new ImageFilterCounter ((int)(Math.random () * 100000), 5))); } public void paint (Graphics gc) { if (image != null) // Affichage de l'image gc.drawImage (image, 0, 0, this); } } // Classe de filtre crant l'image d'un nombre partir d'une // image comportant tous les chiffres de 0 9 class ImageFilterCounter extends ImageFilter { private int valeur; private int nbChiffres; private int private int private byte [] private int [] largeurImageOriginale; hauteurImageOriginale; bytePixels; intPixels;

private ColorModel model; public ImageFilterCounter (int valeur, int nbChiffres) { this.valeur = valeur; this.nbChiffres = nbChiffres; } // Implmentation des mthodes de ImageConsumer public void setDimensions (int width, int height) { largeurImageOriginale = width; hauteurImageOriginale = height; // Renvoie la dimension de l'image au consommateur final consumer.setDimensions (nbChiffres * largeurImageOriginale / 10, height); } public void setHints (int hints)
Programmer en java Page 375

Dao Issiaka- 3me anne SI

{ // Positionnemennt de RANDOMPIXELORDER uniquement pour dire que // les pixels dont renvoys dans un ordre alatoire consumer.setHints ( ( hints | RANDOMPIXELORDER) & ~(TOPDOWNLEFTRIGHT | COMPLETESCANLINES)); } public void setColorModel (ColorModel model) { this.model = model; consumer.setColorModel (model); } public void setPixels (int x, int y, int width, int height, ColorModel model, byte pixels [], int offset, int scansize) { if (bytePixels == null) bytePixels = new byte [largeurImageOriginale * hauteurImageOriginale]; copyPixels (x, y, width, height, pixels, offset, scansize, bytePixels); } public void setPixels (int x, int y, int width, int height, ColorModel model, int pixels[], int offset, int scansize) { if (intPixels == null) intPixels = new int [largeurImageOriginale * hauteurImageOriginale]; copyPixels (x, y, width, height, pixels, offset, scansize, intPixels); } // Recopie la portion d'image chargee dans le tableau destPixels private void copyPixels (int x, int y, int width, int height, Object pixels, int offset, int scansize, Object destPixels) { for (int i = 0; i < height; i++) System.arraycopy (pixels, offset + (scansize * i), destPixels, x + (y + i) * largeurImageOriginale, width); } public void imageComplete (int status) { if ( status == STATICIMAGEDONE || status == SINGLEFRAMEDONE) { int largeurChiffre = largeurImageOriginale / 10; // Renvoie vers le consommateur final les chiffres du compteur un un for (int puissanceDix = nbChiffres - 1; puissanceDix >= 0; puissanceDix--) { // Recherche du chiffre afficher int chiffre = (valeur / (int)Math.pow (10, puissanceDix)) % 10; if (bytePixels != null) consumer.setPixels ((nbChiffres - puissanceDix - 1) * largeurChiffre, 0,
Programmer en java Page 376

Dao Issiaka- 3me anne SI

largeurChiffre, hauteurImageOriginale, model, bytePixels, chiffre * largeurChiffre, largeurImageOriginale); else consumer.setPixels ((nbChiffres - puissanceDix - 1) * largeurChiffre, 0, largeurChiffre, hauteurImageOriginale, model, intPixels, chiffre * largeurChiffre, largeurImageOriginale); } } consumer.imageComplete (status); } }

L'interface java.awt.image.ImageProducer

Cette interface est implmente par les classes qui sont capables de produire des images. A l'appel de la mthode startProduction (), la classe qui implmente cette interface doit commencer produire une image vers un consommateur, qui lui doit implmenter l'interface ImageConsumer. Ceci doit se traduire par l'appel des mthodes de l'interface ImageConsumer pour transmettre au consommateur les informations dcrivant l'image. Un producteur est capable de produire des images pour un ou plusieurs consommateurs. Les mthodes addConsumer (), isConsumer () et removeConsumer () doivent tre implmentes pour grer cet ensemble de consommateurs.
Mthodes
public synchronized void addConsumer (ImageConsumer ic) public synchronized void removeConsumer (ImageConsumer ic)

Ces mthodes doivent ajouter ou retirer le consommateur d'images ic, de l'ensemble des consommateurs enregistrs par ce producteur.
public synchronized boolean isConsumer (ImageConsumer ic)

Doit renvoyer true si ic appartient l'ensemble des consommateurs d'images enregistrs par ce producteur.
public void startProduction (ImageConsumer ic)

Cette mthode mthode doit enregistrer ic comme consommateur d'images, et commencer la production de(s) image(s) en appelant les diffrentes mthodes de l'interface ImageConsumer sur chacun des consommateurs d'images enregistrs.
public void requestTopDownLeftRightResend (ImageConsumer ic)

Cette mthode doit renvoyer les donnes de l'image vers le consommateur d'images ic avec les pixels transmis de haut en bas et de gauche droite, pour que le traitement des pixels par ce consommateur soit de meilleure qualit. Par consquent, le producteur doit appeler la mthode setHints () de l'interface ImageConsumer avec comme paramtre TOPDOWNLEFTRIGHT.
Programmer en java Page 377

Dao Issiaka- 3me anne SI

L'interface java.awt.image.ImageConsumer

Cette interface est implmente par les classes qui ont besoin des donnes d'une image. Un producteur d'image, dont la classe doit implmenter l'interface ImageProducer, invoque chacune des diffrentes mthodes de cette interface pour transmettre au consommateur d'images tous les renseignements dcrivant une image.
Champs
public final static int RANDOMPIXELORDER public final static int TOPDOWNLEFTRIGHT public final static int COMPLETESCANLINES

La mthode setHints () est appele avec comme paramtre l'une de ces trois constantes combine ventuellement avec l'une des deux qui suivent, pour transmettre au consommateur dans quel ordre seront transmis les pixels de l'image pendant les appels successifs la mthode setPixels (). Le producteur peut envoyer ces pixels dans un ordre alatoire, de haut en bas et de gauche droite, ou par ligne entire mais dans un ordre indtermin.
public final static int SINGLEPASS

La mthode setHints () peut recevoir en paramtre cette constante, pour signifier au consommateur que l'image sera gnre par le producteur en une seule passe.
public final static int SINGLEFRAME

La mthode setHints () peut recevoir en paramtre cette constante, pour signifier au consommateur qu'une seule image sera gnre par le producteur. Dans le cas contraire, un ensemble d'images peuvent tre transmises au consommateur pour fabriquer une animation et chaque fois qu'une image est complte imageComplete () est appele avec SINGLEFRAMEDONE en paramtre ou SINGLEFRAMEDONE quand l'animation est termine.
public public public public final final final final static static static static int int int int IMAGEERROR IMAGEABORTED STATICIMAGEDONE SINGLEFRAMEDONE

La mthode imageComplete () est appele avec comme paramtre l'une de ces quatre constantes, pour indiquer au consommateur si la gnration de l'image a rencontr une erreur, si elle a t interrompue, si l'image final est termine ou si la gnration d'une image d'un ensemble en comportant plusieurs est complte.
Mthodes
public void setDimensions (int width, int height)

Cette mthode est appele par le producteur d'images pour transmettre au consommateur la largeur width et la hauteur height de l'image produite.
public void setProperties (Hashtable props)

Cette mthode est appele par le producteur d'images pour transmettre au consommateur les proprits props de l'image.
Programmer en java Page 378

Dao Issiaka- 3me anne SI

public void setColorModel (ColorModel model)

Cette mthode est appele par le producteur d'images pour transmettre au consommateur le modle de couleurs le plus courant utilis pour dcrire l'image.
public void setHints (int hints)

Cette mthode est appele par le producteur d'images pour transmettre au consommateur les proprits hints de l'image. hints est une combinaison des constantes RANDOMPIXELORDER, TOPDOWNLEFTRIGHT ou COMPLETESCANLINES, SINGLEPASS et SINGLEFRAME et permet au consommateur de prparer et d'optimiser son environnement en fonction de la manire dont sera gnre l'image.
public void setPixels (int x, int y, int width, int height, ColorModel model, byte pixels [ ], int off, int scansize) (int x, int y, int width, int height, ColorModel model, int pixels [ ], int off, int scansize)

public void setPixels

L'une de ces deux mthodes est appele par le producteur d'images pour transmettre au consommateur les valeurs des pixels de la portion d'image de taille width et height au point (x,y). La premire mthode reoit les pixels dans un tableau de type byte, l'autre dans un tableau de type int. Ces pixels utilisent le modle de couleur model. Les donnes du tableau pixels sont prendre en compte partir de l'indice offset, et comprennent un nombre de scansize pixels par ligne.
public void imageComplete (int status)

Cette mthode appele par le producteur d'images doit tre implmente pour prendre en compte le statut status de la gnration d'images (gal IMAGEERROR, IMAGEABORTED, STATICIMAGEDONE ou SINGLEFRAMEDONE).
Exemple

Applet Compteur.
Gestion d'animations

L'utilisation des threads et des images permet de raliser rapidement des animations en Java. Comme le montrent les trois exemples suivant, le principe de programmation d'une animation est presque toujours le mme : Vous crez un thread dont la mthode run () utilise une boucle qui chaque tour affiche une nouvelle image puis arrte le thread courant pendant un laps de temps avec la mthode sleep () de la classe Thread. Bien que comme au cinma, une animation sera en apparence bien fluide 25 images par seconde (quivalent un laps de temps entre chaque image de 40 millisecondes), vitez un laps de temps de rafrachissement aussi court, car les machines ont souvent du mal suivre. Si comme dans certains des exemples qui suivent, vous utilisez la mthode
Programmer en java Page 379

Dao Issiaka- 3me anne SI

repaint () pour mettre jour l'image d'une animation, le redessin du fond du composant effectu par la mthode update () de la classe Component est inutile si vous devez transfrer une image l'cran occupant toute la surface du composant. N'oubliez pas alors d'outrepasser la mthode update () pour qu'elle appelle directement la mthode paint () sans redessiner le fond de l'image. Ceci vitera un clignotement dsagrable.

Enchanement d'images tlcharges

Cette premire applet utilise les 8 images de taille gale contenues dans le fichier fleches.gif. Elles sont extraites de l'image tlcharge grce l'utilisation de la classe de filtre CropImageFilter, puis un thread provoque leur affichage l'une aprs l'autre intervalle rgulier pour donner l'effet anim :

Voici le programme Java correspondant ( copier dans un fichier dnomm AnimationFleche.java et invoqu partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; import java.awt.image.*; public class AnimationFleche extends { private Thread threadAnimation private Image imagesAnimation [ ] private int imageCourante Applet implements Runnable = null; = new Image [8]; = 0;

public void init () { try { // Cration de l'image globale mmorisant 8 dessins de flches Image multiImages = getImage (getCodeBase (), "fleches.gif"); // Cration d'un MediaTracker pour rcuprer les 8 images MediaTracker imageTracker = new MediaTracker (this); for (int i = 0; i < imagesAnimation.length; i++) { // Chacune des 8 images est extraite de l'image principale imagesAnimation [i] = createImage (new FilteredImageSource (multiImages.getSource (), new CropImageFilter (i * 50, 0, 50, 50))); imageTracker.addImage (imagesAnimation [i], 0);
Programmer en java Page 380

Dao Issiaka- 3me anne SI

} imageTracker.waitForID (0); // En cas d'erreur, dclenchement d'une exception if (imageTracker.isErrorAny ()) throw new IllegalArgumentException ("Images non chargees"); } catch (Exception e) { } } public void start () { // Cration et dmarrage d'un thread d'animation threadAnimation = new Thread (this); threadAnimation.start (); } public void stop () { threadAnimation.stop (); } public void run () { while (threadAnimation.isAlive ()) try { // Redessin de l'applet et passage l'image suivante repaint (); imageCourante = ++imageCourante % 8; // Attente de 70 ms avant de passer l'image suivante Thread.sleep (70); } catch (InterruptedException exception) { } } // Mthode outrepasse pour qu'elle dessine directement l'image public void update (Graphics gc) { paint (gc); } public void paint (Graphics gc) { // Dessin de l'image courante gc.drawImage (imagesAnimation [imageCourante], 0, 0, this); } }

Utilisation du double buffering

Cette applet montre l'intrt d'utiliser le systme du double buffering pour grer l'animation d'une image gnre par un programme. Le principe en est simple : au lieu de dessiner directement l'cran un dessin qui volue chaque laps de temps, vous utilisez une image dans laquelle vous dessinez puis que vous transfrez l'cran. Ceci vite l'effet de clignotement d'une animation dmontr par l'applet suivante, qui affiche un texte dfilant horizontalement :
Programmer en java Page 381

Dao Issiaka- 3me anne SI

Voici le programme Java correspondant ( copier dans un fichier dnomm ScrollText.java et invoqu partir d'un fichier HTML) :
import java.applet.Applet; import java.awt.*; public class ScrollText extends Applet implements Runnable { private String texte; private Thread threadAnimation; private Dimension tailleApplet; private int positionTexte; private FontMetrics metrics; private int largeurTexte; public void start () { // Mise en blanc du fond de l'applet setBackground (Color.white); tailleApplet = size (); // Rcupration du texte afficher texte = getParameter ("Texte"); positionTexte = tailleApplet.width; // Cration et dmarrage du thread d'animation threadAnimation = new Thread (this); threadAnimation.start(); } public void stop () { threadAnimation.stop (); } public void run () { try { while (threadAnimation.isAlive ()) { // Redessin de l'applet et calcul d'une nouvelle position repaint (); if (positionTexte > -largeurTexte) positionTexte -= tailleApplet.height / 2; else positionTexte = tailleApplet.width; // Arrte le compteur pendant 2/10 de secondes (200 ms) Thread.sleep (200); } } catch (InterruptedException e) { } } public void paint (Graphics gc) { gc.setColor (Color.black); // Cration d'une police de caractres et rcupration de sa taille

Programmer en java

Page 382

Dao Issiaka- 3me anne SI

gc.setFont (new Font ("Helvetica", Font.BOLD, tailleApplet.height 4)); if (metrics == null) { metrics = gc.getFontMetrics (); largeurTexte = metrics.stringWidth (texte); } // Utilisation d'un rectangle de clipping // pour crer une bordure au bord de l'applet gc.clipRect (2, 0, tailleApplet.width - 4, tailleApplet.height); // Dessin du texte gc.drawString (texte, positionTexte + 2, tailleApplet.height - metrics.getDescent () 2); } }

Si vous consultez le source de ce fichier HTML , vous pourrez voir que le paramtre Texte de cette applet permet de modifier le texte affiche :
<APPLET CODE="ScrollText" CODEBASE="../classes" ALT="ScrollText" WIDTH=250 HEIGHT=40 ALIGN=middle> <PARAM NAME="Texte" VALUE="Texte d&eacute;filant horizontalement..."> </APPLET>

Maintenant, voici la mme applet modifie pour viter l'effet de clignotement :

La modification apporte porte sur la manire de programmer la mthode paint () de l'applet ScrollText :
// ... public class ScrollText extends Applet implements Runnable { // start (), stop () et run () : mme code que prcdemment private Image imageTexte; public void paint (Graphics gc) { // Cration d'une image de la taille de l'applet if (imageTexte == null) imageTexte = createImage (tailleApplet.width, tailleApplet.height); Graphics gcImage = imageTexte.getGraphics (); // Mme dessin mais cette fois-ci dans l'image gcImage.setColor (Color.white); gcImage.fillRect (0, 0, tailleApplet.width, tailleApplet.height); gcImage.setColor (Color.black); gcImage.setFont (new Font ("Helvetica", Font.BOLD, tailleApplet.height - 4)); if (metrics == null) {
Programmer en java Page 383

Dao Issiaka- 3me anne SI

metrics = gcImage.getFontMetrics (); largeurTexte = metrics.stringWidth (texte); } gcImage.clipRect (2, 0, tailleApplet.width - 4, tailleApplet.height); gcImage.drawString (texte, positionTexte + 2, tailleApplet.height - metrics.getDescent () 2); // Dessin de l'image l'cran gc.drawImage (imageTexte, 0, 0, this); } // Mthode outrepasse pour viter de dessiner le fond public void update (Graphics gc) { paint (gc); } }

Horloge avec image de fond

Cette applet est aussi un exemple d'utilisation du systme du double buffering et montre la possibilit de dessiner par dessus une image charge partir d'un fichier. Au dbut du programme, le fond de l'horloge est tlcharg, puis toutes les secondes une nouvelle image est mise jour en copiant ce fond dans le double buffer puis en dessinant les aiguilles par dessus leur nouvelle position :

Voici le programme Java correspondant ( copier dans un fichier dnomm Horloge.java et invoqu partir d'un fichier HTML) :
import import import import java.applet.Applet; java.awt.*; java.awt.image.*; java.util.Date;

public class Horloge extends Applet implements Runnable { private Thread threadHorloge; private Image fondHorloge; public void init () { try { // Chargement du fond de l'horloge avec un MediaTracker fondHorloge = getImage (getCodeBase (), "starclock.gif"); MediaTracker imageTracker = new MediaTracker (this); imageTracker.addImage (fondHorloge, 0); imageTracker.waitForID (0); if (imageTracker.isErrorAny ()) fondHorloge = null; } catch (Exception e) { }
Programmer en java Page 384

Dao Issiaka- 3me anne SI

} public void start () { // Lancement d'un thread pour mettre jour l'horloge threadHorloge = new Thread (this); threadHorloge.start (); } public void stop () { threadHorloge.stop (); } public void run () { try { while (threadHorloge.isAlive ()) { // Rcupration du temps courant pour calculer // le dure d'arrt du thread en fonction du temps // d'excution de la mthode afficher () long tempsCourant = System.currentTimeMillis (); afficher (new Date (tempsCourant)); long dureeArret = 1000 - ( System.currentTimeMillis () - tempsCourant); if (dureeArret > 0) Thread.sleep (dureeArret); } } catch (InterruptedException exception) { } } private Image horloge; private void afficher (Date tempsCourant) { // Cration d'une image aux dimensions de l'applet Dimension taille = size (); if (horloge == null) horloge = createImage (taille.width, taille.height); // Rcupration des heures, minutes et secondes int heures = tempsCourant.getHours (); int minutes = tempsCourant.getMinutes (); int secondes = tempsCourant.getSeconds (); // Pour chaque aiguille, conversion du temps en radian // et rcupration du polygone utilisant cet angle double angleHeure = (180 - heures * 60 - minutes) * Math.PI / 360; Polygon pointsHeure = calculerAiguille (angleHeure, taille.width / 4., taille.height / 4.); double angleMinute = (900 - minutes * 60 - secondes) * Math.PI / 1800; Polygon pointsMinute = calculerAiguille (angleMinute, 3. * taille.width / 8., 3. * taille.height / 8.);
Programmer en java Page 385

Dao Issiaka- 3me anne SI

double angleSeconde = (15 - secondes) * Math.PI / 30; Polygon pointsSeconde = calculerAiguille (angleSeconde, 2. * taille.width / 5., 2. * taille.height / 5.); Graphics gcImage = horloge.getGraphics (); if (fondHorloge != null) // Dessin de l'image de fond d'horloge avec redimensionnement gcImage.drawImage (fondHorloge, 0, 0, taille.width, taille.height, this); else { // Si l'image de fond d'horloge est absente // remplissage avec une couleur et dessin d'un cercle gcImage.setColor (new Color (0x638494)); gcImage.fillRect (0, 0, taille.width, taille.height); gcImage.setColor (Color.white); gcImage.drawOval (0, 0, taille.width - 1, taille.height - 1); } // Translation au centre de l'horloge gcImage.translate (taille.width / 2, taille.height / 2); // Dessin des aiguilles (les secondes utilisent une ligne) gcImage.setColor (Color.white); gcImage.drawPolygon (pointsHeure); gcImage.drawPolygon (pointsMinute); gcImage.drawLine (pointsSeconde.xpoints [0], pointsSeconde.ypoints [0], pointsSeconde.xpoints [2], pointsSeconde.ypoints [2]); // Mise jour l'cran repaint (); } // Dessin d'une aiguille 3 heures (0 rad) private int [] xAiguille = {-15, 33, 100, 33, -15}; private int [] yAiguille = { 0, 10, 0, -10, 0}; private Polygon pointsAiguille = new Polygon (xAiguille, yAiguille, xAiguille.length); private Polygon calculerAiguille (double angle, double width, double height) { Polygon points = new Polygon (); // Calcul de la rotation de chaque point de l'aiguille for (int i = 0; i < pointsAiguille.npoints; i++) points.addPoint ((int)( ( pointsAiguille.xpoints [i] * Math.cos (angle) + pointsAiguille.ypoints [i] * Math.sin (angle)) * width / 100), (int)( ( pointsAiguille.xpoints [i] * -Math.sin (angle) + pointsAiguille.ypoints [i] * Math.cos (angle)) * height / 100)); return points; }

Programmer en java

Page 386

Dao Issiaka- 3me anne SI

public void update (Graphics gc) { paint (gc); } public void paint (Graphics gc) { // Dessin de l'image l'cran if (horloge != null) gc.drawImage (horloge, 0, 0, this); } }

Cette applet pourrait tre amliore en lui permettant de rcuprer en paramtre l'image de fond, le choix d'afficher les secondes ou non, l'ajout d'effets sonores toutes les secondes ou toutes les heures en utilisant l'interface AudioClip,...

Programmer en java

Page 387

Dao Issiaka- 3me anne SI

Plus loin avec Java...


Les volutions du langage Conclusion

Les volutions du langage

Le langage Java volue rapidement : aprs les premires versions 1.0 de test sorties fin 1995, la version 1.1 est apparue au printemps 1997, la version 2 (anciennement 1.2) en dcembre 1998 (disponible pour Windows, Solaris et Linux chez Javasoft), suivie d'autres versions tous les 2 ans environ. Ce paragraphe vous prsente les principales volutions apportes Java au cours des versions 1.1 et 2 : ces dveloppements ont surtout enrichis la bibliothque de classes Java mais certains portent aussi sur le noyau du langage lui-mme.

Classes internes (inner classes) : ce type de classes a accs toutes les champs de la classe dans laquelle elles sont dfinies. Les fichiers de classes, d'images, de sons,... dont peut avoir besoin un programme Java, peuvent tre rassembls dans un seul fichier au format JAR (Java ARchvive). Ceci permet de charger une applet en seule requte HTTP et de rduire la taille des fichiers car ce format reprend le format de compression ZIP. Le chargement des applets est ainsi acclr. Un nouveau systme de gestion des vnements utilisant un modle de dlgation des vnements. JavaBeansTM : ce nouveau package permet de crer des classes de composants rutilisables et que l'on peut facilement assembler ensemble dans les environnements de dveloppement rapide (RAD), comme le permettent d'autres produits comme ActiveX de Microsoft. Internationalisation : gestion de ressources pour permettre de grer les diffrentes versions d'un programme suivant la langue de l'utilisateur. La possibilit d'enregistrer les objets (srialisation) et de les recrer partir d'une sauvegarde. Remote Method Invocation : ces nouveaux packages permettent d'invoquer des mthodes distance sur des objets fonctionnant sur d'autres Machines Virtuelles Java et ventuellement mme sur un autre ordinateur d'un rseau. Ceci permet de mettre en pratique la programmation objet distribu. JDBCTM (Java DataBase Connectivity) : ce package permet d'accder des bases de donnes via des requtes SQL. ... JFC (Java Foundation Classes) : cette ensemble de classes vient enrichir de manire significative la gestion de l'interface graphique actuelle AWT. Il se dcompose en diffrents types de fonctionnalits : o Swing : ces nouvelles classes dfinissent un nouvel ensemble de
Page 388

Programmer en java

Dao Issiaka- 3me anne SI

composants reprenant les composants classiques (bouton, liste,...) enrichi de composants plus complexes (arbre, tableau,...). o Java 2D : ces nouvelles classes du package java.awt permettent d'effectuer des oprations plus riches de dessins : dfinitions et compositions de formes, transformations, antialiasing, gestion plus riche des polices de caractres... o Drag and drop (glisser-dposer pour les puristes) : gestion du transfert de donnes entre applications Java et applications natives du systme. Collections de donnes : de nouvelles classes sont ajoutes au package java.util, permettant de grer des listes chanes, des ensembles,... et d'effectuer des oprations de tris, de recherche,... Intgration de CORBA (Common Object Request Broker Architecture) dans Java. Amliorations diverses des classes existantes et des performances. ...

A ces versions de base, s'ajoutent des bibliothques d'extensions dveloppes par Javasoft, qui fonctionnent soit avec Java 1.1, soit avec Java 2 :

Swing (compatible Java 1.1) : cette bibliothque intgre dans Java 2, est aussi utilisable avec Java 1.1. Servlets (compatible Java 1.1) : les servlets permettent de raliser des programmes CGI (Common Gateway Interface) en Java sur un serveur Internet. Ce type de programme permet par exemple de programmer un compteur de page ou un moteur de recherche. JavaMail (compatible Java 1.1) : cette bibliothque permet de grer une boite email (envoi/lecture de message sur un serveur de mail). Vous trouverez un exemple d'utilisation de JavaMail dans les astuces. Java 3D (compatible Java 2) : cette bibliothque permet de programmer de raliser des scnes virtuelles en 3D, et permet de grer les clairages, les textures, les animations d'objets 3D. ...

Ce manuel prsente la version 2 du noyau du langage Java et la version 1.0 de la bibliothque Java (qui permet de faire dj beaucoup de choses), suivie de la description de la bibliothque d'extension Java 3D.
Conclusion

Un des principaux atouts de Java est sa portabilit rsume dans la phrase Write once, run anywhereTM (Ecrivez une fois, faites tourner n'importe o). A l'usage, vous verrez que certaines des premires versions des navigateurs ne permettent pas toujours de faire tourner vos applets de la manire attendue. Les principaux problmes surviennent surtout pour les mthodes des interfaces du package java.applet qui sont justement implmentes par chaque navigateur... Si vous voulez utiliser ces fonctionnalits, testez si possible vos applets sur diffrents navigateurs pour vrifier leur bon fonctionnement.

Programmer en java

Page 389

Dao Issiaka- 3me anne SI

Certaines personnes reprocheront aussi au systme d'interface graphique AWT de Java de n'tre que le plus petit dnominateur commun entre toutes les fonctionnalits fournies par les diffrents systmes existants (Mac OS, Windows, X11/Motif,...). Bien que ceci soit plutt vrai, le package java.awt a le mrite d'exister et de satisfaire les besoins de la plupart des applets et applications. Mais la nouvelle bibliothque Swing qui est utilisable avec Java 1.1 et/ou Java 2 a considrablement enrichi les possibilits de gestion de l'interface graphique tout en offrant un modle de conception trs ouvert. Personnellement, je trouve que Java est un langage trs agrable et se matrisant trs rapidement. Pour vous donner un ordre d'ide, j'ai appris le langage en une cinquantaine d'heures (en lisant deux ouvrages), et j'ai ralis ensuite en une quarantaine d'heures une premire version du dmineur Java Mine (trs proche de la version finale fournie sur ce site). A ce jour, je n'ai trouv que peu de personnes critiques sur ce langage (et encore que sur des points de dtails mon avis ngligeables tels que les assertions, l'absence de template, l'utilisation de paramtres constants,...). C'est peut-tre bien l que rside la vritable explication de son succs prsent et futur : aprs tout un langage n'est qu'un outil du dveloppeur, et si celui-ci est satisfait par son utilisation, l'outil en question a de bonnes chances de succs... J'espre que ces pages auront pu rassasier vos esprits curieux, et vous auront convaincu. Pour terminer, je ne ferai pas de citation (je suis plutt mauvais dans ce domaine) mais je tiens remercier toutes les personnes de mon entourage qui m'ont soutenu dans ce travail de longue haleine, ne serait-ce que par leur curiosit... et particulirement Diem My, mon petit Thomas et Sophie la petite dernire.

Si vous avez encore un peu de temps consacrer ce site, MERCI de donner votre avis grce au formulaire accompagnant ce site.

Programmer en java

Page 390

Dao Issiaka- 3me anne SI

Java 3D
Dmarrer en Java 3D Un premier exemple Principes 3D Les classes de bases

Java 3D est une bibliothque de classes d'extension Java destine crer des scnes 3D en ralit virtuelle (avec utilisation de formes complexes, d'clairages, de textures, d'animations, de sons,...). Ce chapitre dcrit les notions de base utiles pour programmer avec cette bibliothque. Dmarrer en Java 3D Prrequis

Ce manuel s'adresse aux personnes connaissant la programmation en Java et dsirant s'initier Java 3D. Si vous ne connaissez pas Java, commencez par apprendre ce langage en utilisant par exemple le manuel Du C/C++ Java ou un autre de la liste des liens utiles. Des connaissances en programmation 3D ne sont pas obligatoires mais des notions en gomtrie 3D (un point dans l'espace dfini par ses coordonnes (x,y,z), a vous dit quelque chose ?) faciliteront votre apprentissage. Tous les exemples de ce manuel sont compatibles avec la version 1.1 de bibliothque Java 3D.
Tlchargement

Java 3D est disponible sur le site https://java3d.dev.java.net/. La version complte de cette bibliothque est actuellement disponible sous Windows, Solaris, SGI, HP-UX et Linux. La version Windows est disponible sous OpenGL ou DirectX. La version pour Mac OS X est disponible sur le site d'Apple. Comme Java 3D est une extension, vous devez avoir dj install Java 2 pour pouvoir l'utiliser. Sur son site, Sun fournit aussi des documentations en anglais. Voici la liste des plus intressantes :

L'ensemble des classes Java 3D et leur interface de programmation (Java 3D API Documentation) sous forme de fichiers HTML visualiser avec un navigateur. Ce manuel qui dcrit partiellement les classes les plus importantes de Java 3D en franais est suffisant pour dbuter en Java 3D mais la documentation des API Java 3D en anglais est indispensable pour avoir une rfrence complte des classes. Les spcifications de Java 3D au format Acrobat Reader (Java 3D API Specification). Un document complet sur Java 3D mais assez indigeste pour les dbutants en 3D.
Page 391

Programmer en java

Dao Issiaka- 3me anne SI

Un tutorial complet se dnommant Getting Started with Java 3D. Ce tutorial est disponible sous forme de fichiers au format Acrobat Reader rassembls dans un fichier ZIP.

Installation

Il est conseill d'installer Java 3D dans le mme rpertoire que le JDK, pour simplifier l'arborescence de l'installation de votre JDK. Java 3D installe essentiellement :

Des DLLs (Dynamic Link Library) dans le rpertoire bin du JRE (Java Runtime Environment). Les fichiers vecmath.jar, j3dcore.jar, j3daudio.jar et j3dutils.jar dans le rpertoire lib/ext du JRE. Selon l'environnement de programmation utilis vous devrez peut-tre rajouter ces fichiers JAR dans votre CLASSPATH (essayez d'abord sans modification car les extensions sont normalement automatiquement importes). Un ensemble d'exemples disponibles dans le rpertoire demo/java3d du JDK. Les plus intressantes : o FourByFour (fbf.html) o GearTest (GearBox.class)
o Morphing

Les exemples fournis avec Java 3D fonctionnent gnralement sous forme d'application ou d'applet. Comme Java 3D ncessite Java 2 pour fonctionner, vous pourrez utiliser les versions actuelles de Netscape Navigator et d'Internet Explorer pour visualiser les applets qu'avec le plug-in Java. Le plus simple reste d'ouvrir une fentre de commandes et d'utiliser les commandes java pour lancer les applications et appletviewer pour lancer les applets.

Programmer en java

Page 392

Dao Issiaka- 3me anne SI

Architecture

Figure 1. Architecture Java 3D La ralit virtuelle est grande consommatrice de calculs. Pour acclrer son travail, Java 3D utilise le plus possible les optimisations 3D offertes par le systme sur lequel la Machine Virtuelle Java tourne :

Quand vous utilisez une version version OpenGL de Java 3D, certaines fonctionnalits de l'API font appel des mthodes native de la DLL Java 3D/OpenGL. Ces mthodes elles, utilisent des fonctions de la DLL OpenGL Open du systme. La DLL OpenGL du systme utilise l'acclrateur graphique disponible sur la carte graphique. La puissance de traitement de Java 3D dpend donc de la puissance de votre microprocesseur mais aussi de celle de votre carte graphique. Vrifiez que que le driver de votre carte est jour pour profiter plein de sa capacit de traitement.

Les classes de l'API Java 3D appartiennent au package javax.media.j3d (fichier j3dcore.jar). Le package javax.vecmath (fichier vecmath.jar) rassemble les classes ddies d au calcul vectoriel et matriciel dont Java 3D a besoin. Ces classes sont dans un package isol pour tre rutilisables dans d'autres contextes de programmation. Bien que les classes des packages javax.media.j3d et javax.vecmath soient suffisantes pour ur programmer toutes les fonctionnalits offertes par Java 3D, des classes utilitaires facilitant la programmation sont fournies dans les packages commenant par com.sun.j3d... (fichiers j3dutils.jar et j3daudio.jar).

Programmer en java

Page 393

Dao Issiaka- 3me anne SI

Un premier exemple

Voici un premier exemple utilisant Java 3D et mettant en oeuvre les principes gnraux de cette bibliothque. Cette classe est programme pour fonctionner en tant qu'applet ou comme application. Recopiez-la dans un fichier Applet3D.java, que vous compilez avec l'instruction javac Applet3D.java pour ensuite l'excuter avec java, grce l'instruction java Applet3D. Cet exemple affiche un cube avec 6 faces de couleur diffrente. Comme aucune rotation n'est effectue sur ce cube, le rsultat n'est pas trs impressionnant puisque vous n'en voyez qu'une seule face ! Mais cet exemple va servir comme base pour la suite du manuel...

import import import import import import

java.applet.Applet; java.awt.*; javax.media.j3d.*; com.sun.j3d.utils.universe.SimpleUniverse; com.sun.j3d.utils.geometry.ColorCube; com.sun.j3d.utils.applet.MainFrame;

// Applet de base pour visualiser des scnes 3D public class Applet3D extends Applet { // Mthode appele l'initialisation de l'applet public void init () { // Cration d'un composant de classe Canvas3D permettant de visualiser une scne 3D // Avec JFree-D, utiliser new Canvas3D (null) dans la ligne suivante Canvas3D canvas = new Canvas3D (SimpleUniverse.getPreferredConfiguration ()); setLayout (new BorderLayout ()); add (canvas, BorderLayout.CENTER); // Cration de la scne 3D visualiser BranchGroup scene = createSceneTree (); // Cration d'un univers 3D rattach au composant 3D SimpleUniverse universe = new SimpleUniverse (canvas); // Rattachement de la scne 3D l'univers universe.addBranchGraph (scene); // Positionnement pour avoir une vue correcte sur la scne 3D // (permet de voir une scne 3D contenue dans un cube d'1 unit // de ct et centr sur le centre du repre). universe.getViewingPlatform ().setNominalViewingTransform (); } public BranchGroup createSceneTree ()
Programmer en java Page 394

Dao Issiaka- 3me anne SI

{ // Racine de l'arbre des objets reprsents dans la scne 3D BranchGroup root = new BranchGroup(); // Cration d'un cube color dont deux des sommets opposs sont // situs en (-0.5,-0.5,-0.5) et (0.5,0.5,0.5) ColorCube cube = new ColorCube (0.5); // Ajout du cube la racine de l'arbre root.addChild (cube); return root; } // Mthode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args) { // La classe com.sun.j3d.utils.applet.MainFrame est une classe // qui cre automatiquement une fentre avec l'applet passe en paramtre new MainFrame (new Applet3D (), args, 150, 150); } }

La classe MainFrame utilise dans la mthode main () de tous les exemples de ce manuel est une classe utilitaire qui affiche l'applet passe en paramtre son constructeur dans une fentre de dimensions donnes. Cette classe permet aussi d'interprter les arguments de la ligne de commande comme des paramtres de l'applet. Par exemple, le code HTML qui utilise la classe Applet3D, suivant :
<APPLET CODE="Applet3D.class" WIDTH=150 HEIGHT=150> <PARAM NAME="param" VALUE="paramValue"> </APPLET>

aura l'quivalent suivant avec la commande java : java Applet3D param=paramValue


Principes 3D Construction d'un univers 3D

L'exemple prcdent utilise tous les lments ncessaires pour programmer avec Java 3D. De quoi a-t-on besoin ?

Programmer en java

Page 395

Dao Issiaka- 3me anne SI

Figure 2. Composants d'un univers 3D

Une instance de Canvas3D : Ce composant AWT qui drive de la classe java.awt.Canvas, est la zone de l'cran o est visualise une scne 3D. Cette zone peut tre vue comme la pellicule d'un appareil photo : elle ne permet pas de capturer tous les objets autour de l'appareil mais juste d'avoir une vue plus ou moins large sur un ensemble d'objets en 3 dimensions. Une scne 3D visualiser : cette scne est un ensemble d'une ou plusieurs formes (shape) gomtriques simples (paralllpipde, sphre, cylindre ou cne) ou complexes (ensemble de points relis entre eux, texte 3D). Sur chacune de ces formes 3D, on peut effectuer des transformations (translation, rotation, homothtie) pour les positionner dans l'espace et les animer. L'ensemble de ces formes et de ces transformations est reprsent par un graphe de type arbre dont la racine est une instance de BranchGroup. Une instance de SimpleUniverse : Cet objet relie l'instance de Canvas3D avec la scne 3D visualiser. Cet objet modlise l'espace dans lequel on positionne l'appareil photo. A cet espace sont rattachs une instance de Canvas3D et une scne 3D. La classe SimpleUniverse est une classe utilitaire qui permet de crer des instances par dfaut des classes VirtualUniverse, Locale, ViewPlatform, View, PhysicalBody et PhysicalEnvironment, ncessaires Java 3D.

Dans la classe Applet3D, la cration de l'arbre reprsentant la scne visualiser est isole dans la mthode createSceneTree (). Tous les exemples qui suivent dans ce manuel outrepassent cette mthode pour montrer les diffrents types de scnes qu'il est possible de crer en Java 3D.
Repre 3D

Une scne 3D est compose d'un ensemble de formes 3D. Chacune de ces formes est construit par un assemblage de triangles ou de quadrilatres plans. Ces formes simples sont dcrites grce aux coordonnes (x,y,z) de leurs sommets. Pour s'orienter correctement dans la scne 3D laquelle vous allez ajouter des formes 3D, il faut donc connatre comment est positionn le repre 3D sous-jacent tout espace 3D.

Programmer en java

Page 396

Dao Issiaka- 3me anne SI

Figure 3. Orientation d'un repre 3D Quand vous utilisez la classe SimpleUniverse, le centre du repre 3D est dans l'axe du milieu du composant Canvas3D. L'axe x va vers la droite, l'axe y vers le haut. Pour que le repre soit direct, l'axe z est orient vers l'observateur. Sur la figure, les flches circulaires indiquent le sens positif de rotation autour de chaque axe. La mthode setNominalViewingTransform () utilise dans la classe Applet3D positionne l'instance de Canvas3D une certaine distance sur l'axe z entre l'observateur et l'origine du repre. La largeur du composant Canvas3D permet alors de voir entirement un cube d'une unit de ct et les points de coordonnes (-1,0,0) et (1,0,0) dans le plan z=0. Ce paramtrage est celui utilis par dfaut par la classe SimpleUniverse mais il est tout fait possible de le changer pour avoir une ou plusieurs vues diffrentes sur une scne 3D. En 3D, l'axe y est orient vers le haut et non vers le bas comme gnralement en dessin 2D sur ordinateur.

Transformation 3D

Les transformations sont utilises en 3D pour positionner et animer une forme 3D dans l'espace. Java 3D utilise la classe Transform3D pour dcrire une opration de translation, de rotation ou d'homothtie (changement d'chelle, scale en anglais). Cette opration est associe une instance de la classe TransformGroup et ajoute l'arbre de la scne pour l'appliquer sur une forme. Voici l'applet CubeSides drivant de la classe Applet3D : Cet exemple effectue sur un cube deux rotations de PI / 6 radian (30) autour des axes x et y. Ces deux rotations permettent l'observateur de dcouvrir les couleurs de 3 des faces du cube.

Programmer en java

Page 397

Dao Issiaka- 3me anne SI

import javax.media.j3d.*; import com.sun.j3d.utils.geometry.ColorCube; import com.sun.j3d.utils.applet.MainFrame; public class CubeSides extends Applet3D { // Mthode de la classe Applet3D outrepasse public BranchGroup createSceneTree () { // Racine de l'arbre des objets reprsents dans la scne 3D BranchGroup root = new BranchGroup (); // Cration d'une rotation de PI / 6 autour de l'axe X Transform3D rotationXAxis = new Transform3D (); rotationXAxis.rotX (Math.PI / 6); TransformGroup rotationXAxisGroup = new TransformGroup (rotationXAxis); // Cration d'une rotation de -PI / 6 autour de l'axe Y Transform3D rotationYAxis = new Transform3D (); rotationYAxis.rotY (-Math.PI / 6); TransformGroup rotationYAxisGroup = new TransformGroup (rotationYAxis); // Cration d'un cube color ColorCube cube = new ColorCube (0.5); // Construction de la branche de l'arbre de la scne rotationYAxisGroup.addChild (cube); rotationXAxisGroup.addChild (rotationYAxisGroup); root.addChild (rotationXAxisGroup); return root; } // Mthode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args) { new MainFrame (new CubeSides (), args, 150, 150); } }

L'ordre dans lequel sont effectus les transformations a une importance. Si vous enchanez diffremment les rotations sur les axes x et y dans la mthode createSceneTree () de la classe CubeSides, vous n'obtiendrez pas le mme rsultat :
// Construction de la branche de l'arbre de la scne // Rotation autour de l'axe y puis de l'axe x rotationYAxisGroup.addChild (cube); rotationXAxisGroup.addChild (rotationYAxisGroup); root.addChild (rotationXAxisGroup); // Construction de la branche de l'arbre de la scne // Rotation autour de l'axe x puis de l'axe y rotationXAxisGroup.addChild (cube); rotationYAxisGroup.addChild (rotationXAxisGroup); root.addChild (rotationYAxisGroup);

Programmer en java

Page 398

Dao Issiaka- 3me anne SI

Arbre d'une scne 3D

Un arbre reprsentant une scne 3D est constitu de noeuds (node) qui sont soit des feuilles (leaf), soit des groupes (group). Les noeuds relis entre eux ont une relation parent-enfant (parent-child). Tous les noeuds ont un parent sauf la racine (root) et peuvent avoir un ou plusieurs enfants sauf les feuilles.

L'arbre de la scne cr par la classe CubeSides est constitu d'une seule branche :

Figure 4. Arbre de la scne


CubeSides

La feuille au bout de la branche, symbolise par un triangle , est une forme gomtrique (shape) qui est une instance de la classe ColorCube. Le groupe rattach l'instance de la classe SimpleUniverse est une instance de la classe BranchGroup. Entre ces deux noeuds, deux groupes de transformation ont t insrs : l'un excute une rotation autour de l'axe y de -PI/6 rad puis l'autre une seconde rotation autour de l'axe x de PI/6 rad.

Les relations parent-enfant entre les noeuds d'un arbre sont cres avec la mthode addChild () grce l'instruction parent.addChild (enfant);. Un programme Java 3D doit compter autant d'appels la mthode addChild () que de relations parent-enfant.

Voici l'applet MultiCubes drivant de la classe Applet3D : cet exemple cre une scne 3D reprsente par un cercle de 12 cubes centr autour de l'axe z. Une rotation de 45 est applique ensuite autour de l'axe x, pour mieux voir cet ensemble.

import import import import

javax.media.j3d.*; javax.vecmath.Vector3f; com.sun.j3d.utils.geometry.ColorCube; com.sun.j3d.utils.applet.MainFrame;


Page 399

Programmer en java

Dao Issiaka- 3me anne SI

public class MultiCubes extends Applet3D { // Mthode de la classe Applet3D outrepasse public BranchGroup createSceneTree () { // Racine de l'arbre des objets reprsents dans la scne 3D BranchGroup root = new BranchGroup (); // Cration d'une rotation de -PI / 4 autour de l'axe x Transform3D rotationXAxis = new Transform3D (); rotationXAxis.rotX (-Math.PI / 4); TransformGroup rotationXAxisGroup = new TransformGroup (rotationXAxis); // Cration d'un cercle construit avec 12 cubes Group cubeCircle = createCubeCircle (12); // Construction de l'arbre de la scne rotationXAxisGroup.addChild (cubeCircle); root.addChild (rotationXAxisGroup); return root; } // Cre un cercle avec cubeCount cubes public Group createCubeCircle (int cubeCount) { Group cubeCircle = new Group (); // Boucle de cration de cubeCount cubes for (int i = 0; i < cubeCount; i++) { // Cration d'une translation de (0.7,0,0) Transform3D translation = new Transform3D (); translation.setTranslation (new Vector3f (0.7f, 0, 0)); TransformGroup translationGroup = new TransformGroup (translation); // Cration d'une rotation variable autour de l'axe z Transform3D rotationZAxis = new Transform3D (); rotationZAxis.rotZ (2 * Math.PI * i / cubeCount); TransformGroup rotationZAxisGroup = new TransformGroup (rotationZAxis); // Cration d'un cube color ColorCube cube = new ColorCube (0.1); // Dplacement du cube de 0.7 unit sur l'axe x translationGroup.addChild (cube); // Rotation variable pour rpartir l'ensemble des cubes // autour du centre du repre rotationZAxisGroup.addChild (translationGroup); // Ajout d'une branche la racine de l'arbre cubeCircle.addChild (rotationZAxisGroup); } return cubeCircle; } // Mthode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args) {
Programmer en java Page 400

Dao Issiaka- 3me anne SI

new MainFrame (new MultiCubes (), args, 150, 150); } }

Figure 5. Arbre de la scne MultiCubes La figure prcdente reprsente l'arbre de la scne cre par la mthode createSceneTree () de la classe MultiCubes (les douze branches reprsentant les douze cubes ne sont pas toutes dessines). Cet arbre est construit comme suit :

Les douze cubes subissent tous le mme type de transformation : une translation de 0.7 unit le long de l'axe x puis une rotation de i*PI/6 radian autour de l'axe z, i tant compris entre 0 et 11. Chaque feuille qui correspond un cube est donc lie deux groupes de transformation : ce sous-ensemble forme une branche rattache au groupe , racine de l'arbre qui rassemble les douze cubes. Cet ensemble forme un arbre cohrent reprsentant le cercle des douze cubes. Cet arbre pourrait tre directement rattache la racine de la scne 3D. Le cercle de douze cubes subit une rotation de -PI/4 radian autour de l'axe x. L'opration la plus simple pour appliquer cette transformation chacun des cubes est de rattacher le groupe reprsentant le cercle un seul groupe de transformation effectuant cette rotation. La racine de la scne 3D doit tre une instance de la classe BranchGroup et ce groupe est donc reli au dernier groupe de transformation .

La cration un groupe intermdiaire permet de manipuler le cercle de cubes par sa racine. Mais tout groupe peut avoir plusieurs enfants et la programmation de l'arbre suivant aurait donn le mme rsultat :

Programmer en java

Page 401

Dao Issiaka- 3me anne SI

Figure 6. Arbre simplifi de la scne MultiCubes

En observant le rsultat de l'application MultiCubes et l'arbre de la scne qu'elle affiche, vous pouvez maintenant comprendre comment Java 3D utilise un arbre pour calculer la position des formes d'une scne 3D dans l'espace :

Un arbre est un graphe ayant des proprits particulires : A partir de sa racine, il est possible d'numrer toutes les feuilles et il existe un chemin unique reliant la racine chacune des feuilles. En Java 3D, une feuille reprsentant une forme gomtrique est un assemblage de triangles ou de quadrilatres dcrits par les coordonnes (x,y,z) de leurs sommets. Le chemin qui relie la racine une feuille est un ensemble de groupes. Java 3D part de chaque feuille puis remonte le chemin jusqu' la racine de l'arbre, en appliquant aux coordonnes des sommets l'opration correspondant chacun des groupes de transformation rencontrs. Les transformations sont donc appliques dans l'ordre, d'une feuille vers la racine.

L'arbre d'une scne 3D peut contenir des groupes de transformation et des formes 3D, mais aussi d'autres types d'lments utiliss par Java 3D : des noeuds reprsentant des lumires, des fonds d'cran, des comportements (animation et raction aux vnements), des sources de sons,... Les classes reprsentant un groupe drivent des classes javax.media.j3d.Node et javax.media.j3d.Group. Les classes reprsentant une feuille drivent des classes javax.media.j3d.Node et javax.media.j3d.Leaf.
java.lang.Object o javax.media.j3d.SceneGraphObject javax.media.j3d.Node javax.media.j3d.Group javax.media.j3d.BranchGroup javax.media.j3d.OrderedGroup javax.media.j3d.SharedGroup javax.media.j3d.Switch javax.media.j3d.TransformGroup javax.media.j3d.Leaf javax.media.j3d.Background
Page 402

Programmer en java

Dao Issiaka- 3me anne SI

javax.media.j3d.Behavior javax.media.j3d.BoundingLeaf javax.media.j3d.Clip javax.media.j3d.Fog javax.media.j3d.Light javax.media.j3d.Link javax.media.j3d.Morph javax.media.j3d.Shape3D javax.media.j3d.Sound javax.media.j3d.Soundscape javax.media.j3d.ViewPlatform javax.media.j3d.NodeComponent

...

Globalement, une scne 3D est documente par la reprsentation graphique de son arbre. Il est vivement conseill de dessiner un tel arbre quand vous crez vos scnes 3D : ceci permet d'effectuer mentalement l'assemblage des diffrentes formes d'une scne 3D, et ce type de documentation est bien plus lisible que des centaines de lignes de programme. Faites attention la cohrence de votre arbre :

Si vous tentez d'affecter deux parents un noeud, Java 3D dclenchera une exception MultipleParentException. Si vous crez des branches inutiles, Java 3D ne signalera aucune erreur l'excution et le rsultat ne correspondra pas vos attentes : Ce type d'erreur survient quelques fois la suite d'un copier/coller trop rapide d'une instruction addChild () pour ajouter un groupe de transformation une branche existante. Si la modification du parent a t oublie, vous pourrez obtenir par exemple ceci :

// Ajout d'une nouvelle transformation transform2 root.addChild (transform2); // ... root.addChild (transform1); transform1.addChild (object); root n'a pas t chang en transform2. Ainsi l'instruction root.addChild (transform2); cre une nouvelle branche inutile puisque la transformation transform2 est seule sur cette branche, et n'est pas applique transform1.

Optimisations Java 3D

Java 3D utilise principalement deux optimisations pour amliorer les performances des calculs d'affichage 3D : La compilation des noeuds d'une scne 3D et la capacit d'un noeud.
Compilation

La compilation de chacun des noeuds d'une scne 3D permet d'obtenir une reprsentation interne que Java 3D manipule de manire optimum. La mthode compile () de la classe BranchGroup compile tous les noeuds d'un arbre partir de sa racine et la mthode isCompiled () de la classe SceneGraphObject de savoir si un noeud a t compil.
Programmer en java Page 403

Dao Issiaka- 3me anne SI

La classe Applet3D peut tre optimise en ajoutant l'instruction scene.compile (); dans la mthode init ().
Capacit d'un noeud

Il n'est pas possible d'interroger ou de modifier une proprit d'un noeud compil ou vivant (noeud utilis dans une scne attache un univers), si ce noeud n'en a pas la capacit (capability). Cette capacit peut tre donne un noeud non compil et pas encore vivant en appelant la mthode setCapability () de la classe SceneGraphObject dont hritent toutes les classes des objets manipuls dans une scne 3D. Les classes drives de SceneGraphObject dfinissent un ensemble de constantes de capacit ALLOW_..._READ, ALLOW_..._WRITE ou ENABLE_.... Ces constantes sont passes en paramtre la mthode setCapability () pour autoriser la lecture ou la modification de la proprit correspondante d'un noeud quand il sera compil ou vivant. Par exemple, pour autoriser la modification d'un groupe de transformation vivant, il faut appeler setCapability (TransformGroup.ALLOW_TRANSFORM_WRITE) sur celui-ci : cette capacit permet d'appeler la mthode setTransform () pour changer la transformation et animer une forme 3D l'cran. Si le groupe de transformation n'a pas la capacit ALLOW_TRANSFORM_WRITE, une exception de classe CapabilityNotSetException sera dclenche l'appel de setTransform (). Quand la racine de l'arbre d'une scne 3D est rattache un univers avec la mthode addBranchGraph (), Java 3D vrifie les diffrentes capacits de chacun des noeuds en utilisant la mthode getCapability () et optimise la reprsentation interne des objets 3D. Dans ce manuel, les capacits associes aux mthodes des classes drives de SceneGraphObject sont indiques entre parenthses aprs chacune des mthodes auxquelles elles s'appliquent.
Les classes de base

Ce paragraphe prsente les principales classes utilises au cours de ce chapitre pour construire une scne 3D. Les classes Canvas3D qui drive de la classe java.awt.Canvas et com.sun.j3d.utils.universe.SimpleUniverse qui drive de la classe javax.media.j3d.VirtualUniverse et leurs mthodes ne sont pas documentes ici : elles permettent de configurer finement l'environnement Java 3D. Toutes les classes Java 3D d'exceptions hritent de la classe RuntimeException.
La classe javax.media.j3d.SceneGraphObject

Cette classe abstract est la super classe des classes Node et NodeComponent, elles-mmes les super classes des classes utilises pour construire l'arbre d'une scne 3D et pour dcrire la construction gomtrique et l'apparence d'une forme 3D. La classe SceneGraphObject intgre les principes utiliss par Java 3D pour amliorer les performances des calculs d'affichage 3D : La compilation des noeuds d'une scne 3D et la capacit d'un noeud.

Programmer en java

Page 404

Dao Issiaka- 3me anne SI

Principales mthodes
public final boolean isCompiled () public final boolean isLive ()

Ces mthodes renvoient true si un noeud a t compil ou s'il est vivant (s'il appartient une scne 3D rattache un univers).
public final boolean getCapability (int capability) public final void setCapability (int capability) throws RestrictedAccessException public final void clearCapability (int capability) throws RestrictedAccessException

Ces mthodes permettent d'interroger, d'activer ou de dsactiver la capacit capability d'un noeud, en passant en paramtre une des constantes ALLOW_..._READ, ALLOW_..._WRITE ou ENABLE_... dfinies dans les classes drives. Ces constantes correspondent aux mthodes de ces classes qu'il est possible d'appeler quand un noeud est compil ou vivant. Par exemple, il faut appeler setCapability (Appearance.ALLOW_COLORING_ATTRIBUTES_WRITE) sur une instance de la classe Appearance pour pouvoir appeler setColoringAttributes () et modifier la couleur d'une forme dj affiche. Les mthodes setCapability () et clearCapability () doivent tre appeles avant de compiler ou afficher un noeud sinon elles dclenchent une exception RestrictedAccessException. Un nouveau noeud n'a aucune capacit sa cration. N'activez sur un noeud que les capacits dont vous aurez effectivement besoin une fois que ce noeud sera vivant.

Il n'est pas possible de passer en paramtre la mthode setCapability () la combinaison de plusieurs capacits (group.setCapability
(TransformGroup.ALLOW_TRANSFORM_READ | TransformGroup.ALLOW_TRANSFORM_WRITE); n'active pas les deux

capacits). Ce n'est pas parce qu'un noeud a une capacit en modification (ALLOW_..._WRITE) qu'il a la capacit en lecture (ALLOW_..._READ).

public java.lang.Object getUserData () public void setUserData (java.lang.Object userData)

Ces mthodes permettent d'interroger ou de modifier l'objet userData associ ce noeud. Libre vous de l'utiliser ou non pour stocker les informations supplmentaires que vous voulez associer ce noeud.
La classe javax.media.j3d.Node

Cette classe abstract drive de la classe SceneGraphObject et reprsente un noeud utilis dans l'arbre d'une scne 3D. C'est la super classe des classes Leaf et Group, et regroupe les capacits en rapport avec le calcul des limites (bounds), l'interception par la souris et la collision avec les autres formes 3D. Chaque noeud ne peut tre utilis qu'une seule fois dans un arbre. En cas de besoin, il est possible d'utiliser les mthodes cloneNode () ou cloneTree () de cette classe pour copier facilement un noeud ou un arbre dont la racine est ce noeud.

Programmer en java

Page 405

Dao Issiaka- 3me anne SI

Principaux champs (constantes de capacit)


public public public public public public public public static static static static static static static static final final final final final final final final int int int int int int int int ALLOW_COLLIDABLE_READ ALLOW_COLLIDABLE_WRITE ALLOW_PICKABLE_READ ALLOW_PICKABLE_WRITE ALLOW_BOUNDS_READ ALLOW_BOUNDS_WRITE ALLOW_AUTO_COMPUTE_BOUNDS_READ ALLOW_AUTO_COMPUTE_BOUNDS_WRITE

Ces capacits sont passes en paramtre aux mthodes setCapability () et clearCapability () pour autoriser ou interdire l'appel aux mthodes correspondantes de la classe Node (setCapability (ALLOW_AUTO_COMPUTE_BOUNDS_READ) autorise l'appel de la mthode getBoundsAutoCompute () quand le noeud sera affich).
public static final int ENABLE_PICK_REPORTING public static final int ENABLE_COLLISION_REPORTING

Principales mthodes
public Node getParent () throws RestrictedAccessException

Renvoie le parent de ce noeud ou null s'il n'en a pas. Si le noeud est compil ou vivant une exception de classe RestrictedAccessException est dclenche.
public Node cloneTree () throws RestrictedAccessException

Renvoie une copie de l'arbre dont la racine est ce noeud.


public Node cloneNode (boolean forceDuplicate) throws RestrictedAccessException

Renvoie une copie de ce noeud. Cette mthode peut tre ventuellement tre appele par la mthode cloneTree (). Toutes les classes drives SubClassNode qui ne sont pas abstract doivent implmenter cette mthode comme suit :
public Node cloneNode (boolean forceDuplicate) { SubClassNode node = new SubClassNode (); node.duplicateNode (this, forceDuplicate); return node; } public boolean getCollidable () (capacit ALLOW_COLLIDABLE_READ) public void setCollidable (boolean collidable)

(capacit
ALLOW_COLLIDABLE_WRITE)

Ces mthodes permettent d'interroger ou de modifier la sensibilit d'un noeud et tous ses enfants la collision avec d'autres formes (true par dfaut).
public boolean getPickable ()

(capacit ALLOW_PICKABLE_READ)

public void setPickable (boolean pickable) (capacit ALLOW_PICKABLE_WRITE)

Programmer en java

Page 406

Dao Issiaka- 3me anne SI

Ces mthodes permettent d'interroger ou de modifier la sensibilit d'un noeud et tous ces enfants pour pouvoir l'intercepter avec la souris ou un autre priphrique (true par dfaut).
La classe javax.media.j3d.Leaf

Cette classe abstract drive des classes SceneGraphObject, Node et reprsente une feuille dans l'arbre d'une scne 3D. C'est la super classe des classes reprsentant les formes 3D, les fonds d'cran, les comportements, les sources de lumire, les sources sonores. Elle ne dfinit qu'un constructeur par dfaut public.
La classe javax.media.j3d.Group

Cette classe drive des classes SceneGraphObject, Node et reprsente un groupe dans l'arbre d'une scne 3D. C'est la super classe des classes utilises comme groupe et comme transformation.
Champs (constantes de capacit)
public static final int ALLOW_CHILDREN_READ public static final int ALLOW_CHILDREN_WRITE public static final int ALLOW_CHILDREN_EXTEND

Ces capacits permettent d'autoriser l'interrogation et la modification de la liste des enfants dont ce groupe est le parent.
public static final int ALLOW_COLLISION_BOUNDS_READ public static final int ALLOW_COLLISION_BOUNDS_WRITE

Ces capacits permettent d'autoriser l'interrogation et la modification des limites utilises pour la collision de l'objet 3D reprsent par ce groupe.
Principales mthodes
public void addChild (Node child)

(capacit
ALLOW_CHILDREN_EXTEND)

public void insertChild (Node child, int index) public void setChild (Node child, int index)

(capacit
ALLOW_CHILDREN_EXTEND)

(capacit ALLOW_CHILDREN_WRITE)

Ces mthodes permettent d'ajouter, d'insrer ou de modifier l'enfant child l'indice index de ce groupe.
public void removeChild (int index)

(capacit ALLOW_CHILDREN_WRITE)

Retire l'enfant de ce groupe l'indice index.


public Node getChild (int index)

(capacit ALLOW_CHILDREN_READ)

public java.util.Enumeration getAllChildren () (capacit ALLOW_CHILDREN_READ)

Programmer en java

Page 407

Dao Issiaka- 3me anne SI

public int numChildren ()

(capacit ALLOW_CHILDREN_READ)

Ces mthodes permettent d'interroger sur ce groupe l'enfant l'indice index, la liste de tous les enfants sous forme d'numration ou le nombre d'enfants.
public Bounds getCollisionBounds ()

(capacit
ALLOW_COLLISION_BOUNDS_READ)

public void setCollisionBounds (Bounds bounds)

(capacit
ALLOW_COLLISION_BOUNDS_WRITE)

Ces mthodes permettent d'interroger ou de modifier les limites utilises pour la collision de l'objet 3D reprsent par ce groupe.
Exemples

Applets MultiCubes, Clown, WaterGlass, TextTranslation.


La classe javax.media.j3d.BranchGroup

Cette classe drive des classes SceneGraphObject, Node, Group et reprsente le groupe utilis comme racine de l'arbre d'une scne 3D. Un groupe de cette classe peut tre utilis plusieurs fois dans une scne 3D mais seule une instance de cette classe peut tre rattache une instance des classes SimpleUniverse ou Locale utilises dans un univers 3D, avec la mthode addBranchGraph ().
Champ (constante de capacit)
public static final int ALLOW_DETACH

Cette capacit permet d'autoriser le dtachement de ce groupe de son parent.


Principales mthodes
public void compile ()

Compile l'arbre dont la racine est ce groupe.


public void detach () (capacit ALLOW_DETACH)

Dtache ce groupe de son parent.


Exemples

Toutes les applets 3D.


La classe javax.media.j3d.TransformGroup

Cette classe drive des classes SceneGraphObject, Node, Group et reprsente un groupe de transformation utilis pour appliquer une transformation gomtrique tous les enfants de
Programmer en java Page 408

Dao Issiaka- 3me anne SI

ce groupe. La description gomtrique de la transformation est mmorise dans une instance de la classe Transform3D.
Champs (constantes de capacit)
public static final int ALLOW_TRANSFORM_READ public static final int ALLOW_TRANSFORM_WRITE

Ces capacits permet d'autoriser l'interrogation et la modification de la transformation mmorise par ce groupe.
Constructeurs
public TransformGroup () public TransformGroup (Transform3D transform)

Principales mthodes
public void getTransform (Transform3D transform)

(capacit
ALLOW_TRANSFORM_READ)

Copie la transformation mmorise par ce groupe dans l'objet transform.


public void setTransform (Transform3D transform)

(capacit
ALLOW_TRANSFORM_WRITE)

Recopie la transformation transform dans celle mmorise par ce groupe.


Exemples

Applets CubeSides, MultiCubes, SimpleObjects, HelloWorld3D, ObjectFileDemo, Clown, SphereConstruction, WaterGlass, SimpleTexturedObjects, LitPlane, MouseApplet3D, TextTranslation, AlphaTest, Clock3D, SunEarthMoonMotion.
La classe javax.media.j3d.Transform3D

Cette classe mmorise la transformation gomtrique applique par un groupe de classe TransformGroup. La classe Transform3D utilise une matrice 4x4 qui permet de stocker toutes les transformations gomtriques utiles en 3D : translation, rotation, homothtie, symtrie, projection. Les calculs des points l'cran utilisent la multiplication de matrices de transformations entre elles et le produit de ces matrices avec les coordonnes (x,y,z) des points 3D. La classe Transform3D s'adresse autant aux personnes connaissant ces principes d'utilisation des matrices en 3D qu' celles dsirant crer des transformations gomtriques sans se soucier de leur implmentation. Les mthodes dcrites ci-dessous s'adressent aux nophytes par soucis de simplification. Ils suffit de les appliquer sur la transformation identit cr avec le constructeur par dfaut de la classe Transform3D.
Principaux constructeurs
public Transform3D () public Transform3D (Transform3D transform)
Programmer en java Page 409

Dao Issiaka- 3me anne SI

Ces constructeurs crent une instance de Transform3D initialise avec une transformation identit ou par recopie de transform.
Principales mthodes
public final void setIdentity ()

Modifie cette transformation en une transformation identit (qui n'a aucun effet).
public final void setTranslation (Vector3f transl)

Modifie cette transformation en une translation utilisant les valeurs sur les trois axes x, y, z de transl.
public void rotX (double angle) public void rotY (double angle) public void rotZ (double angle)

Ces mthodes permettent de modifier cette transformation en une rotation d'angle angle radians autour de l'axe x, y ou z. Le sens positif de rotation est donn par la figure de l'orientation d'un repre 3D.
public final void setScale (double scale) public final void setScale (Vector3d scales)

Ces mthodes permettent de modifier cette transformation soit en une homothtie de facteur scale sur les trois axes x, y, z (agrandissement si scale > 1 ou rduction si scale < 1), soit en une homothtie utilisant les facteurs sur les trois axes x, y, z de scales.
public final void mul (Transform3D transform2)

Permet de multiplier la matrice de cette transformation avec celle de l'instance transform2. transform1.mul (transform2) correspond en interne matriceTransform1 = matriceTransform1 * matriceTransform2. Comme le montre la figure ci-dessous, un groupe de transformation utilisant la multiplication des deux matrices des transformations transform1 et transform2 a le mme effet que celui de chaner deux groupes de transformation utilisant les transformations transform1 et transform2. Faites attention l'ordre dans lequel vous faites vos multiplications car la multiplication de matrice n'est pas commutative.

Figure 7. Multiplication de matrices de transformation

Programmer en java

Page 410

Dao Issiaka- 3me anne SI

Les transformations sont toujours relatives au centre du repre. N'oubliez pas ceci surtout pour les rotations ou les homothties appliques aprs une translation ! Les mthodes rotX (), rotY (), rotZ (), setScale () et setTranslation () appeles sur une mme instance de la classe Transform3D ne sont pas cumulatives et chaque appel l'une des mthodes rotX (), rotY (), rotZ () annule la transformation prcdente. Par scurit, il vaut mieux crer deux instances diffrentes des classes Transform3D et TransformGroup pour cumuler deux transformations ou utiliser la mthode mul ().
Exemples

Applets CubeSides, MultiCubes, SimpleObjects, HelloWorld3D, ObjectFileDemo, Clown, SphereConstruction, WaterGlass, SimpleTexturedObjects, LitPlane, TextTranslation, Clock3D, SunEarthMoonMotion.
Les classes algbriques

Certaines des classes fournies avec Java 3D sont utiles pour reprsenter les vecteurs, les coordonnes d'un point ou les matrices. Comme ces classes ont un intrt pour le calcul algbrique plus vaste que le seul domaine de la 3D, elles appartiennent un package indpendant javax.vecmath. Comme le montre la hirarchie de ce package ci-dessous, la plupart de ces classes manipulent des coordonnes ayant 2, 3 ou 4 valeurs de type float ou double, voir de type byte ou int pour certaines classes. Le nombre de valeurs stockes et leur type est utilis comme suffixe du nom de la classe : par exemple, une instance de classe Point4f stocke 4 valeurs de type float et une instance classe Vector3d stocke 3 valeurs de type double.
java.lang.Object o javax.vecmath.AxisAngle4d o javax.vecmath.AxisAngle4f o javax.vecmath.GMatrix o javax.vecmath.GVector o javax.vecmath.Matrix3d o javax.vecmath.Matrix3f o javax.vecmath.Matrix4d o javax.vecmath.Matrix4f o javax.vecmath.Tuple2d javax.vecmath.Point2d javax.vecmath.Vector2d o javax.vecmath.Tuple2f javax.vecmath.Point2f javax.vecmath.TexCoord2f javax.vecmath.Vector2f o javax.vecmath.Tuple3b javax.vecmath.Color3b o javax.vecmath.Tuple3d javax.vecmath.Point3d javax.vecmath.Vector3d o javax.vecmath.Tuple3f javax.vecmath.Color3f javax.vecmath.Point3f javax.vecmath.TexCoord3f javax.vecmath.Vector3f
Page 411

Programmer en java

Dao Issiaka- 3me anne SI

o o o

javax.vecmath.Tuple3i javax.vecmath.Point3i javax.vecmath.Tuple4b javax.vecmath.Color4b javax.vecmath.Tuple4d javax.vecmath.Point4d javax.vecmath.Quat4d javax.vecmath.Vector4d javax.vecmath.Tuple4f javax.vecmath.Color4f javax.vecmath.Point4f javax.vecmath.Quat4f javax.vecmath.Vector4f javax.vecmath.Tuple4i javax.vecmath.Point4i

Les classes Point3f, Vector3f et Color3f reprsentant un point et un vecteur, ainsi que leur super classe Tuple3f utilisant le type float sont dcrites ci-dessous brivement. La classe Tuple3d et ses classes drives Point3d et Vector3d utilises par certaines mthodes Java 3D dcrites dans ce manuel dclarent les mmes champs et mthodes.
La classe javax.vecmath.Tuple3f

Cette classe abstract qui implmente l'interface java.io.Serializable est la super classe des classes Point3f, Vector3f, Color3f et TexCoord3f. Elle mmorise 3 coordonnes dans les champs public x, y, z de type float et fournit un ensemble de mthodes pour effectuer des oprations mathmatiques de base (addition, soustraction, valeur oppose, encadrement,...).
Champs
public float x public float y public float z

La classe javax.vecmath.Point3f

Cette classe drive de la classe Tuple3f et reprsente les coordonnes (x, y, z) d'un point 3D.
Principaux constructeurs
public public public public Point3f Point3f Point3f Point3f () (float x, float y, float z) (float [ ] p1) (Point3f point)

Ces constructeurs crent un point initialis partir des paramtres x, y, z, p1 ou point. Le constructeur par dfaut initialise 0 les champs x, y et z du point.
Principales mthodes
public final float distance (Point3f p1) public final float distanceSquared (Point3f p1)

Ces mthodes renvoient la distance ou la distance au carr entre ce point et le point p1.
Programmer en java Page 412

Dao Issiaka- 3me anne SI

Exemples

Applets Pyramid, LightEffect, TextTranslation. Classe AxisShape.


La classe javax.vecmath.Vector3f

Cette classe drive de la classe Tuple3f et reprsente les coordonnes (x, y, z) d'un vecteur 3D.
Constructeurs
public public public public Vector3f Vector3f Vector3f Vector3f () (float x, float y, float z) (float [ ] v1) (Vector3f vector)

Ces constructeurs crent un vecteur initialis partir des paramtres x, y, z, v1 ou vector. Le constructeur par dfaut initialise 0 les champs x, y et z du vecteur.
Principales mthodes
public final float length () public final float lengthSquared ()

Ces mthodes renvoient la longueur (norme) ou la longueur au carr de ce vecteur.


public final void normalize ()

Normalise ce vecteur, pour que ce vecteur soit de mme direction avec une norme gale 1.
public final float dot (Vector3f v1)

Renvoie le produit scalaire entre ce vecteur et v1.


public final void cross (Vector3f v1, Vector3f v2)

Mmorise dans ce vecteur le produit vectoriel entre v1 et v2.


public final float angle (Vector3f v1)

Renvoie l'angle en radian entre ce vecteur et v1.


Exemples

Applets MultiCubes, SimpleObjects, Clown, SphereConstruction, SimpleTexturedObjects, LightEffect, LitApplet3D, SunEarthMoonMotion.


La classe javax.vecmath.Color3f

Cette classe drive de la classe Tuple3f et reprsente les composantes RGB Rouge, Vert, Bleu d'une couleur exprimes entre 0.f et 1.f (correspondant au champs x, y, z).

Programmer en java

Page 413

Dao Issiaka- 3me anne SI

Constructeurs
public public public public Color3f Color3f Color3f Color3f () (float r, float g, float b) (float [ ] c1) (Color3f color)

Ces constructeurs crent une couleur initialise partir des paramtres r, g, b, c1 ou color. Le constructeur par dfaut initialise 0 les champs x, y et z de la couleur.
Exemples

Applets Pyramid, LightEffect, LitApplet3D, SunEarthMoonMotion.

Programmer en java

Page 414

Dao Issiaka- 3me anne SI

Objets 3D
Les formes de bases Les constructions gomtriques Les fonds d'cran L'importation de scnes 3D

Suite la prsentation des notions utiles en Java 3D, ce chapitre dcrit les diffrentes techniques de cration des objets 3D par :

l'assemblage de formes de base la description de formes gomtriques l'application d'un effet 3D un texte l'importation de scnes existantes.

Les formes de base Les diffrentes formes

Les objets 3D affichs avec Java 3D sont manipuls soit sous forme de feuilles ajoutes l'arbre d'une scne 3D, soit sous forme de groupes contenant des feuilles . Les feuilles sont des formes 3D de classe Shape3D. Cette classe dcrit la construction gomtrique de l'objet et ses diffrents attributs d'apparence. Pour simplifier la construction de scnes 3D, le package com.sun.j3d.utils.geometry fournit les classes utilitaires suivantes :

Les classes Box, Sphere, Cylinder et Cone reprsentant les objets de formes paralllpipde, sphre, cylindre et cne. La classe ColorCube reprsentant un cube avec 6 faces de couleur diffrente. La classe Text2D permettant d'afficher un texte sans paisseur (le texte 3D est construit gomtriquement avec la classe javax.media.j3d.Text3D).

L'assemblage de formes paralllpipdique, sphrique, cylindrique ou conique permet de construire beaucoup d'objets 3D aux formes complexes. Cet assemblage s'effectue en appliquant des homothties, des rotations et des translations sur chaque objet simple. Voici l'applet SimpleObjects drivant de la classe Applet3D : cet exemple met en scne les quatre objets de forme simple et de classes Box, Sphere, Cylinder et Cone sur un fond d'cran blanc :

Programmer en java

Page 415

Dao Issiaka- 3me anne SI

import import import import

javax.media.j3d.*; javax.vecmath.*; com.sun.j3d.utils.geometry.*; com.sun.j3d.utils.applet.MainFrame;

public class SimpleObjects extends Applet3D { // Mthode de la classe Applet3D outrepasse public BranchGroup createSceneTree () { // Racine de l'arbre des objets reprsents dans la scne 3D BranchGroup root = new BranchGroup (); // Instantiation des quatre classes de forme simple et // cration de 4 transformations pour les placer dans l'espace // Cration d'un paralllpipde Box box = new Box (0.3f, 0.2f, 0.2f, null); Transform3D boxTranslation = new Transform3D (); boxTranslation.setTranslation (new Vector3f (-0.4f, 0.4f, 0)); TransformGroup boxTranslationGroup = new TransformGroup (boxTranslation); // Cration d'une sphre Sphere sphere = new Sphere (0.3f); Transform3D sphereTranslation = new Transform3D (); sphereTranslation.setTranslation (new Vector3f (0.4f, 0.4f, 0)); TransformGroup sphereTranslationGroup = new TransformGroup (sphereTranslation); // Cration d'un cylindre Cylinder cylinder = new Cylinder (0.3f, 0.5f); Transform3D cylinderTransformation = new Transform3D (); cylinderTransformation.setTranslation (new Vector3f (-0.4f, -0.4f, 0)); // Cration d'une rotation pour mieux apercevoir la forme du cylindre Transform3D rotation = new Transform3D (); rotation.rotX (Math.PI / 6); // Multiplication des deux transformations pour les cumuler cylinderTransformation.mul (rotation); TransformGroup cylinderTransformationGroup = new TransformGroup (cylinderTransformation); // Cration d'un cone Cone cone = new Cone (0.3f, 0.5f); Transform3D coneTransformation = new Transform3D (); coneTransformation.setTranslation (new Vector3f (0.4f, -0.4f, 0)); coneTransformation.mul (rotation); TransformGroup coneTransformationGroup = new TransformGroup (coneTransformation);
Programmer en java Page 416

Dao Issiaka- 3me anne SI

// Cration d'un fond blanc pour apercevoir les objets qui sont noirs par dfaut Background background = new Background (1, 1, 1); background.setApplicationBounds (new BoundingBox ()); // Construction de l'arbre de la scne 3D boxTranslationGroup.addChild (box); sphereTranslationGroup.addChild (sphere); cylinderTransformationGroup.addChild (cylinder); coneTransformationGroup.addChild (cone); root.addChild (boxTranslationGroup); root.addChild (sphereTranslationGroup); root.addChild (cylinderTransformationGroup); root.addChild (coneTransformationGroup); root.addChild (background); return root; } // Methode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args) { new MainFrame (new SimpleObjects (), args, 150, 150); } }

Figure 8. Arbre de la scne SimpleObjects La figure prcdente reprsente l'arbre de la scne cre par la mthode createSceneTree () de la classe SimpleObjects. Les instances des classes Box, Sphere, Cylinder et Cone ont t reprsentes sous forme de feuilles pour des commodits de reprsentation, mais ces objets sont en fait des groupes dont la classe hrite des classes com.sun.j3d.utils.geometry.Primitive et Group. Chacun de ces groupes a un certains nombre d'enfants de classe Shape3D reprsentant les diffrentes parties de la forme 3D. Le noeud reprsente le fond d'cran. La classe Clown est aussi un exemple plus complexe d'assemblage de formes simples reprsentant un clown.

Programmer en java

Page 417

Dao Issiaka- 3me anne SI

La classe javax.media.j3d.Shape3D

Cette classe drive des classes SceneGraphObject, Node, Leaf et reprsente une feuille utilise comme forme 3D dans l'arbre d'une scne 3D. A une forme 3D sont associs une construction gomtrique et des attributs d'apparence appliqus la forme 3D. A partir de la version 1.2 de Java 3D, il est possible d'associer plusieurs constructions gomtriques une mme forme 3D si elles sont quivalentes (il n'est pas possible de mlanger par exemple une description de texte 3D avec celle d'une forme gomtrique).
Champs (constantes de capacit)
public static final int ALLOW_GEOMETRY_READ public static final int ALLOW_GEOMETRY_WRITE

Ces capacits permettent d'autoriser l'interrogation et la modification de la liste des constructions gomtriques associes cette forme 3D.
public static final int ALLOW_APPEARANCE_READ public static final int ALLOW_APPEARANCE_WRITE

Ces capacits permettent d'autoriser l'interrogation et la modification des attributs d'apparence utiliss par cette forme 3D.
public static final int ALLOW_COLLISION_BOUNDS_READ public static final int ALLOW_COLLISION_BOUNDS_WRITE

Ces capacits permettent d'autoriser l'interrogation et la modification des limites utilises pour la collision de cette forme 3D.
public static final int ALLOW_APPEARANCE_OVERRIDE_READ public static final int ALLOW_APPEARANCE_OVERRIDE_WRITE

Constructeurs
public Shape3D () public Shape3D (Geometry geometry) public Shape3D (Geometry geometry, Appearance appearance)

Principales mthodes
public Geometry getGeometry ()

(capacit ALLOW_GEOMETRY_READ)

public void setGeometry (Geometry geometry) (capacit ALLOW_GEOMETRY_WRITE)

Ces mthodes permettent d'interroger ou de modifier la construction gomtrique geometry de cette forme 3D. A partir de la version 1.2 de Java 3D, ces mthodes permettent de manipuler la construction gomtrique d'indice 0.
public Geometry getGeometry (int index)

(capacit ALLOW_GEOMETRY_READ)

public java.util.Enumeration getAllGeometries () (capacit ALLOW_GEOMETRY_READ) public int numGeometries ()

(capacit ALLOW_GEOMETRY_READ)

Programmer en java

Page 418

Dao Issiaka- 3me anne SI

Ces mthodes permettent d'interroger sur cette forme 3D la construction gomtrique d'indice index, la liste de toutes les constructions gomtriques sous forme d'numration ou son nombre (compatible partir de la version 1.2 de Java 3D).
public void addGeometry (Geometry geometry)

(capacit
ALLOW_GEOMETRY_WRITE)

public void insertGeometry (Geometry geometry, int index) public void setGeometry (Geometry geometry, int index)

(capacit
ALLOW_GEOMETRY_WRITE)

(capacit
ALLOW_GEOMETRY_WRITE)

Ces mthodes permettent d'ajouter, d'insrer ou de modifier la construction gomtrique geometry l'indice index de cette forme 3D (compatible partir de la version 1.2 de Java 3D).
public void removeGeometry (int index)

(capacit ALLOW_GEOMETRY_WRITE)

Retire la construction gomtrique de cette forme 3D (compatible partir de la version 1.2 de Java 3D).
public Appearance getAppearance () public void setAppearance (Appearance appearance)

(capacit ALLOW_APPEARANCE_READ) (capacit


ALLOW_APPEARANCE_WRITE)

Ces mthodes permettent d'interroger ou de modifier les attributs d'apparence utilises par cette forme 3D.
public Bounds getCollisionBounds ()

(capacit
ALLOW_COLLISION_BOUNDS_READ)

public void setCollisionBounds (Bounds bounds)

(capacit
ALLOW_COLLISION_BOUNDS_WRITE)

Ces mthodes permettent d'interroger ou de modifier les limites utilises pour la collision de cette forme 3D.
Exemples

Applets Pyramid, HelloWorld3D, LitApplet3D, TextTranslation, SunEarthMoonMotion. Classe AxisShape.

Programmer en java

Page 419

Dao Issiaka- 3me anne SI

La classe com.sun.j3d.utils.geometry.ColorCube

Cette classe drive des classes SceneGraphObject, Node, Leaf, Shape3D et reprsente un cube centr sur l'origine du repre dont les 6 faces sont de couleur diffrente. Elle est surtout utile pour des fins de dmonstration.
Constructeurs
public ColorCube () public ColorCube (double scale)

Ces constructeurs permettent de crer un cube dont les deux coins opposs ont pour coordonnes (-scale, -scale, -scale) et (scale, scale, scale). Par dfaut, scale est gal 1.
Exemples

Applets Applet3D, CubeSides, MultiCubes, AlphaTest.


La classe com.sun.j3d.utils.geometry.Primitive

Cette classe abtract drive des classes SceneGraphObject, Node, Group et est utilise comme super classe des classes Box, Sphere, Cylinder et Cone du package com.sun.j3d.utils.geometry. En tant que groupe, elle reprsente un conteneur de plusieurs formes 3D qui constituent un objet 3D et regroupe un ensemble de paramtres applicables chacune de ces formes. Par exemple, elle comporte une mthode setAppearance (Appearance appearance) qui permet de modifier les attributs d'apparence de toutes les formes 3D qu'elle regroupe.
Principaux champs
public static final int GENERATE_NORMALS public static final int GENERATE_TEXTURE_COORDS public static final int GEOMETRY_NOT_SHARED

Ces constantes sont passes en paramtre aux constructeurs des classes drives pour que le gnrateur de construction gomtrique calcule les normales (utiles pour l'clairage) ou les coordonnes utilises pour appliquer les textures. GEOMETRY_NOT_SHARED indique qu'une construction gomtrique spare doit tre cre pour les formes 3D de cette instance.
public static final int ENABLE_APPEARANCE_MODIFY

Cette constante est passe en paramtre aux constructeurs des classes drives pour activer les capacits ALLOW_APPEARANCE_READ and ALLOW_APPEARANCE_WRITE sur les instances de la classe Shape3D cres.
public static final int ENABLE_GEOMETRY_PICKING

Cette constante est passe en paramtre aux constructeurs des classes drives pour activer la capacit ALLOW_INTERSECT sur les constructions gomtriques cres.
Principales mthodes
public abstract Shape3D getShape (int partid)
Programmer en java Page 420

Dao Issiaka- 3me anne SI

Renvoie la forme 3D gnre l'indice partid. Les classes drives de la classe Primitive dfinisse un ensemble de constantes gales aux indices des diffrentes formes 3D composant un objet.
public void setAppearance ()

(capacit
ENABLE_APPEARANCE_MODIFY)

public abstract void setAppearance (Appearance appearance)

(capacit
ENABLE_APPEARANCE_MODIFY)

Ces mthodes permettent de modifier les attributs d'apparence de toutes les formes 3D dont le parent est ce groupe. La mthode sans paramtre leur applique des attributs de classe Material utilisant une couleur noire sans clairage et blanche sous clairage.
public void setAppearance (int partid, Appearance appearance)

(capacit
ENABLE_APPEARANCE_MODIFY)

Modifie les attributs d'apparence utiliss par la forme 3D l'indice partid.


public Appearance getAppearance () (capacit ENABLE_APPEARANCE_MODIFY)

Renvoie les attributs d'apparence utiliss par la forme 3D l'indice 0.


La classe com.sun.j3d.utils.geometry.Box

Cette classe drive des classes SceneGraphObject, Node, Group, Primitive et reprsente un paralllpipde centr sur l'origine du repre. Elle implmente les mthodes getShape (int partid) et setAppearance (Appearance appearance) de la classe Primitive.
Champs
public public public public public public static static static static static static final final final final final final int int int int int int FRONT BACK RIGHT LEFT TOP BOTTOM

Ces constantes dsignent les diffrentes faces du paralllpipde (respectivement devant, derrire, droite, gauche, haut et bas). La classe Box utilise une forme 3D pour chaque face et ces constantes sont utilises en paramtre de la mthode getShape () pour interroger chaque instance de Shape3D.
Constructeurs
public Box () public Box (float xdim, float ydim, float zdim, Appearance appearance) public Box (float xdim, float ydim, float zdim, int primflags, Appearance appearance)

Programmer en java

Page 421

Dao Issiaka- 3me anne SI

Ces constructeurs permettent de crer un paralllpipde dont les deux coins opposs ont pour coordonnes (-xdim, -ydim, -zdim) et (xdim, ydim, zdim). primflags peut tre gal une des constantes dcrites dans la classe Primitive ou une combinaison de ces constantes. Par dfaut, xdim, ydim, zdim sont gaux 1, primflags GENERATE_NORMALS et appearance null ce qui cre un paralllpipde de couleur blanche uniquement sous clairage.
Exemples

Applet SimpleObjects, SimpleTexturedObjects, Clock3D.


La classe com.sun.j3d.utils.geometry.Sphere

Cette classe drive des classes SceneGraphObject, Node, Group, Primitive et reprsente une sphre centre sur l'origine du repre. Elle implmente les mthodes getShape (int partid) et setAppearance (Appearance appearance) de la classe Primitive.
Champs
public static final int BODY

Cette constante est utilise en paramtre de la mthode getShape () pour interroger l'instance de Shape3D reprsentant la sphre.
Constructeurs
public Sphere public Sphere public Sphere public Sphere public Sphere appearance) () (float (float (float (float radius, radius, radius, radius, Appearance appearance) int primflags, Appearance appearance) int primflags, int divisions) int primflags, int divisions, Appearance

Ces constructeurs permettent de crer une sphre de rayon radius. La construction gomtrique de la sphre est un assemblage de quadrilatres et divisions reprsente le nombre divisions utilises sur chaque axe pour dcomposer la sphre en facettes. primflags peut tre gal une des constantes dcrites dans la classe Primitive ou une combinaison de ces constantes. Par dfaut, radius est gal 1, divisions 15, primflags GENERATE_NORMALS et appearance null ce qui cre une sphre de couleur blanche uniquement sous clairage.
Exemples

Applets SimpleObjects, Clown, SphereConstruction, SimpleTexturedObjects, LightEffect, SunEarthMoonMotion.


La classe com.sun.j3d.utils.geometry.Cylinder

Cette classe drive des classes SceneGraphObject, Node, Group, Primitive et reprsente un cylindre centr sur l'origine du repre, dont l'axe central est confondu avec l'axe y. Elle implmente les mthodes getShape (int partid) et setAppearance (Appearance appearance) de la classe Primitive.

Programmer en java

Page 422

Dao Issiaka- 3me anne SI

Champs
public static final int BODY public static final int BOTTOM public static final int TOP

Ces constantes dsignent les 3 parties du cylindre (respectivement la partie cylindrique, et les disques bas et haut). Ces constantes sont utilises en paramtre de la mthode getShape () pour interroger chaque instance de Shape3D du cylindre.
Constructeurs
public Cylinder public Cylinder public Cylinder public Cylinder appearance) public Cylinder () (float radius, float height) (float radius, float height, Appearance appearance) (float radius, float height, int primflags, Appearance (float radius, float height, int primflags, int xdivision, int ydivision, Appearance appearance)

Ces constructeurs permettent de crer un cylindre de rayon radius et de hauteur height. La construction gomtrique du cylindre est un assemblage de quadrilatres ; xdivision et ydivision reprsentent le nombre divisions utilises sur l'axe x et sur la hauteur pour dcomposer le cylindre en facettes. primflags peut tre gal une des constantes dcrites dans la classe Primitive ou une combinaison de ces constantes. Par dfaut, radius est gal 1 , height 2, xdivision 15, ydivision 1, primflags GENERATE_NORMALS et appearance null ce qui cre un cylindre de couleur blanche uniquement sous clairage.
Exemples

Applets SimpleObjects, Clown, WaterGlass, SimpleTexturedObjects, Clock3D.


La classe com.sun.j3d.utils.geometry.Cone

Cette classe drive des classes SceneGraphObject, Node, Group, Primitive et reprsente un cne centr sur l'origine du repre, dont l'axe central est confondu avec l'axe y. L'origine du repre est mi hauteur de la hauteur du cne. La classe Cone implmente les mthodes getShape (int partid) et setAppearance (Appearance appearance) de la classe Primitive.
Champs
public static final int BODY public static final int CAP

Ces constantes dsignent les 2 parties du cne (respectivement la partie conique et le disque infrieur). Ces constantes sont utilises en paramtre de la mthode getShape () pour interroger chaque instance de Shape3D du cne.
Constructeurs
public Cone () public Cone (float radius, float height) public Cone (float radius, float height, int primflags, Appearance appearance)
Programmer en java Page 423

Dao Issiaka- 3me anne SI

public Cone (float radius, float height, int primflags, int xdivision, int ydivision, Appearance appearance)

Ces constructeurs permettent de crer un cne de rayon radius et de hauteur height. La construction gomtrique du cne est un assemblage de quadrilatres ; xdivision et ydivision reprsentent le nombre divisions utilises sur l'axe x et sur la hauteur pour dcomposer la surface du cne en facettes. primflags peut tre gal une des constantes dcrites dans la classe Primitive ou une combinaison de ces constantes. Par dfaut, radius est gal 1 , height 2, xdivision 15, ydivision 1, primflags GENERATE_NORMALS et appearance null ce qui cre un cne de couleur blanche uniquement sous clairage.
Exemples

Applets SimpleObjects, Clown, SimpleTexturedObjects.


Les constructions gomtriques Les diffrents types de constructions gomtriques

Une forme 3D peut avoir une des constructions gomtriques suivantes :


Un ensemble de points isols. Les classes PointArray et IndexedPointArray sont utilises pour stocker ces points. Un ensemble de lignes ou d'artes. Les classes LineArray, LineStripArray, IndexedLineArray et IndexedLineStripArray sont utilises pour stocker les extrmits de ces lignes. Une surface plus ou moins complexe constitue par l'assemblage de facettes triangulaires ou de quadrilatres. Les classes drives de GeometryArray diffrentes de celles cites prcdemment sont utilises pour stocker les sommets (vertex/vertices en anglais) de ces facettes. Un texte avec une profondeur lui donnant un effet 3D (classe Text3D). Une image (raster) situe un point de l'espace (classe Raster).

Les classes qui utilisent ces types de construction gomtrique hritent toutes de la classe Geometry :
java.lang.Object o javax.media.j3d.SceneGraphObject javax.media.j3d.NodeComponent javax.media.j3d.Geometry javax.media.j3d.CompressedGeometry javax.media.j3d.GeometryArray javax.media.j3d.PointArray javax.media.j3d.LineArray javax.media.j3d.TriangleArray javax.media.j3d.QuadArray javax.media.j3d.GeometryStripArray javax.media.j3d.LineStripArray javax.media.j3d.TriangleStripArra y javax.media.j3d.TriangleFanArray javax.media.j3d.IndexedGeometryArray
Page 424

Programmer en java

Dao Issiaka- 3me anne SI

javax.media.j3d.IndexedPointArray javax.media.j3d.IndexedLineArray javax.media.j3d.IndexedTriangleAr ray javax.media.j3d.IndexedQuadArray javax.media.j3d.IndexedGeometrySt ripArray javax.media.j3d.IndexedLine StripArray javax.media.j3d.IndexedTria ngleStripArray javax.media.j3d.IndexedTria ngleFanArray javax.media.j3d.Raster javax.media.j3d.Text3D

Chacune des classes CompressedGeometry, GeometryArray, Raster et Text3D n'est pas quivalente l'autre dans le sens o il n'est pas possible de dfinir une forme 3D avec la classe Shape3D en mlangeant les classes GeometryArray et Text3D par exemple. Dans ce cas, il faut crer deux instances de Shape3D diffrentes. Une mme instance de construction gomtrique peut tre ventuellement partage par diffrentes formes 3D.
Les diffrents algorithmes de construction

Les classes qui drivent de la classe GeometryArray vous donnent un large choix d'algorithmes pour dcrire comment sont construites les facettes d'une surface partir de la liste de ses sommets :

Figure 9. Algorithmes de construction gomtrique des classes GeometryArray


CLASSES
PointArray

DESCRIPTION DE L'ALGORITHME UTILIS Dcrit un ensemble de points isols afficher partir du tableau des sommets s. Dcrit un ensemble de lignes, construites en reliant deux par deux chacun des sommets du tableau s. Dcrit un ensemble de triangles formant les facettes d'une surface.
Page 425

LineArray

TriangleArray

Programmer en java

Dao Issiaka- 3me anne SI

Les triangles sont construits en utilisant trois par trois les sommets du tableau s.
QuadArray

Dcrit un ensemble de quadrilatres formant les facettes d'une surface. Les quadrilatres sont construits en utilisant quatre par quatre les sommets du tableau s. Les sommets de chaque quadrilatre doivent tre coplanaires (appartenir au mme plan). Les classes LineStripArray, TriangleStripArray et TriangleFanArray qui drivent de cette classe permettent d'optimiser la rutilisation des points du tableau s qui sont en commun dans une bande (strip). Dcrit un ensemble de lignes, construites en reliant chacun des sommets du tableau s les uns aprs les autres.

GeometryStripArray

LineStripArray

TriangleStripArray Dcrit un ensemble de triangles formant les facettes d'une bande.

Les triangles sont construits en respectant le schma indiqu par la figure 9.


TriangleFanArray

Dcrit un ensemble de triangles formant les facettes d'un ventail (fan). Les triangles sont construits en reliant le premier sommet tous les autres sommets du tableau s.

Les classes de formes de base suffisent dans la plupart des cas mais l'utilisation des classes cidessus permettent d'imaginer n'importe quelle surface et d'optimiser sa reprsentation. Vous pouvez aussi utiliser la classe com.sun.j3d.utils.geometry.GeometryInfo qui simplifie la programmation des constructions gomtriques. Le constructeur de cette classe prend en paramtre une constante dsignant l'algorithme de construction des facettes utiliser avec la liste des sommets. Ces algorithmes correspondent aux classes drivant de la classe GeometryArray comme suit :
PARAMTRE GeometryInfo
TRIANGLE_ARRAY QUAD_ARRAY TRIANGLE_FAN_ARRAY TRIANGLE_STRIP_ARRAY POLYGON_ARRAY TriangleArray QuadArray TriangleStripArray TriangleFanArray

CLASSE QUIVALENTE

Pas d'quivalent.

Programmer en java

Page 426

Dao Issiaka- 3me anne SI

Permet de dcrire un polygone ayant ventuellement des trous.

Constructions gomtriques indices


javax.media.j3d.Geometry javax.media.j3d.GeometryAr ray o o o o o javax.media.j3d.Poin tArray javax.media.j3d.Line Array javax.media.j3d.Tria ngleArray javax.media.j3d.Quad Array javax.media.j3d.Geom etryStripArray javax.media.j3 d.LineStripArr ay javax.media.j3 d.TriangleStri pArray javax.media.j3 d.TriangleFanA rray javax.media.j3d.Geometry javax.media.j3d.GeometryArray o javax.media.j3d.IndexedGeometr yArray javax.media.j3d.IndexedP ointArray javax.media.j3d.IndexedL ineArray javax.media.j3d.IndexedT riangleArray javax.media.j3d.IndexedQ uadArray javax.media.j3d.IndexedG eometryStripArray javax.media.j3d.In dexedLineStripArra y javax.media.j3d.In dexedTriangleStrip Array javax.media.j3d.In dexedTriangleFanAr ray

Toutes les classes qui hritent de la classe IndexedGeometryArray ont le mme nom prfix par Indexed que les classes qui drivent directement de la classe GeometryArray (par exemple IndexedQuadArray pour QuadArray). Ces classes utilisent leur liste de sommets en respectant le mme algorithme que leur classes "soeur" mais l'ensemble des sommets est un tableau d'indices au lieu d'tre un tableau de coordonnes, comme le montre la figure cidessous.

Figure 10. Comparaison des constructions gomtriques non indices/indices Cette figure montre deux manires de construire les 4 faces d'une pyramide, l'une avec la classe TriangleFanArray l'autre avec la classe IndexedTriangleFanArray. La pyramide peut tre dcompose en deux ventails, l'un avec trois triangles centr en s0 et l'autre avec un
Programmer en java Page 427

Dao Issiaka- 3me anne SI

seul triangle centr en s1. L'instance de la classe TriangleFanArray n'a besoin que d'un seul tableau avec les coordonnes des 8 sommets pour dcrire les faces. L'instance de la classe IndexedTriangleFanArray a besoin de deux tableaux :

Le tableau contenant les coordonnes des 4 sommets de la pyramide. Le tableau dcrivant les faces en utilisant les indices renvoyant un sommet du premier tableau.

L'usage des constructions gomtriques indices est souvent plus complexe programmer mais permet d'conomiser en mmoire et sur certains calculs des sommets pour Java 3D. Dans le cas de la pyramide, la moiti de ces calculs est conomise car les calculs sur s1, s2 et s3 ne seront excuts qu'une seule fois avec la classe IndexedTriangleFanArray. Cette complexit est simplifie grce la classe com.sun.j3d.utils.geometry.GeometryInfo qui calcule automatiquement une instance de IndexedGeometryArray partir d'une construction gomtrique non indice. Voici l'applet Pyramid drivant de la classe Applet3D : cet exemple construit une pyramide colore. Une couleur diffrente a t donne chaque sommet, ce qui donne par dfaut cet effet de dgrad obtenu par interpolation des couleurs.

import import import import

javax.media.j3d.*; javax.vecmath.*; com.sun.j3d.utils.geometry.*; com.sun.j3d.utils.applet.MainFrame;

public class Pyramid extends Applet3D { public BranchGroup createSceneTree () { // Racine de l'arbre des objets reprsents dans la scne 3D BranchGroup root = new BranchGroup (); // Construction de la branche de l'arbre de la scne root.addChild (createPyramid ()); return root; } public Shape3D createPyramid () { // Cration des sommets et de leur couleur Point3f s0 = new Point3f (0, 0.5f, 0); Point3f s1 = new Point3f (0, -0.5f, 0.7f); Point3f s2 = new Point3f (0.7f, -0.5f, -0.3f); Point3f s3 = new Point3f (-0.7f, -0.5f, -0.3f); Color3f s0Color = new Color3f (1, 0, 0); // Rouge
Programmer en java Page 428

Dao Issiaka- 3me anne SI

Color3f s1Color = new Color3f (0, 1, 0); // Vert Color3f s2Color = new Color3f (0, 0, 1); // Bleu Color3f s3Color = new Color3f (1, 1, 0); // Jaune // Construction de 2 ventails avec les points et leur couleur GeometryInfo geometryInfo = new GeometryInfo (GeometryInfo.TRIANGLE_FAN_ARRAY); geometryInfo.setCoordinates (new Point3f [ ] {s0, s1, s2, s3, s1, s2, s1, s3}); geometryInfo.setColors (new Color3f [ ] {s0Color, s1Color, s2Color, s3Color, s1Color, s2Color, s1Color, s3Color}); geometryInfo.setStripCounts (new int [ ] {5, 3}); // Forme cre avec cette construction gomtrique return new Shape3D (geometryInfo.getIndexedGeometryArray ()); } // Mthode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args) { new MainFrame (new Pyramid (), args, 100, 100); } }

L'ordre dans lequel sont cits les sommets des facettes est important. Pour qu'une facette extrieure soit visible, ses sommets doivent respecter le sens direct, c'est dire qu'ils doivent tre numrs dans le sens inverse des aiguilles d'une montre quand la facette est face vous.
La classe javax.media.j3d.NodeComponent

Cette classe abstract drive de la classe SceneGraphObject. C'est la super classe des classes Geometry et Appearance et de toutes les classes d'attributs. Elle dfinit quelques mthodes utilises pour la duplication des classes drives. Contrairement aux instances de la classe Node, les objets de classes NodeComponent peuvent tre rfrencs plusieurs fois : une mme instance de construction gomtrique peut tre utilise par plusieurs formes 3D diffrentes.
La classe javax.media.j3d.Geometry

Cette classe abstract drive des classes SceneGraphObject et NodeComponent. C'est la super classe de toutes les classes de constructions gomtriques GeometryArray, Text3D, Raster, CompressedGeometry. Les instances de ces classes sont passes en paramtre aux mthodes addGeometry (), insertGeometry () et setGeometry () de la classe Shape3D.
Champ (constante de capacit)
public static final int ALLOW_INTERSECT

Cette capacit permet d'utiliser cette construction gomtrique dans les calculs d'intersection.

Programmer en java

Page 429

Dao Issiaka- 3me anne SI

La classe javax.media.j3d.GeometryArray

Cette classe abstract drive des classes SceneGraphObject, NodeComponent, Geometry. Toutes les classes qui en hritent permettent de crer une construction gomtrique sous forme d'un ensemble de points, de lignes, de facettes triangulaires ou de quadrilatres. Cette classe peut stocker au plus quatre types de donnes diffrentes :

Les coordonnes des sommets de la construction gomtrique. Les couleurs de ces sommets. La couleur d'une forme 3D peut tre aussi change en utilisant les attributs d'apparence. Les normales de ces sommets. Les normales sont utiles pour calculer les effets d'clairage. Les coordonnes de texture.

Toutes les valeurs (coordonnes, couleurs,...) passes en paramtre une instance de GeometryArray sont recopies dans des structures internes. Les classes GeometryInfo et NormalGenerator du package com.sun.j3d.utils.geometry sont dveloppes ici plutt que les nombreuses mthodes de la classe GeometryArray et de ses sous-classes, car ces deux classes permettent plus simplement de gnrer des constructions gomtriques optimises de classe GeometryArray.
Principaux champs (constantes de capacit)
public public public public public public public public static static static static static static static static final final final final final final final final int int int int int int int int ALLOW_COORDINATE_READ ALLOW_COORDINATE_WRITE ALLOW_COLOR_READ ALLOW_COLOR_WRITE ALLOW_NORMAL_READ ALLOW_NORMAL_WRITE ALLOW_TEXCOORD_READ ALLOW_TEXCOORD_WRITE

Ces capacits permettent d'autoriser la lecture ou la modification des coordonnes des sommets, de leur couleur, de leur normale ou leurs coordonnes de texture.
La classe com.sun.j3d.utils.geometry.GeometryInfo

Cette classe utilitaire permet de gnrer des constructions gomtriques de classe GeometryArray. Comme pour cette classe, elle peut stocker les coordonnes des sommets, leur couleur, leur normale et leurs coordonnes de texture. Accompagne des classes NormalGenerator, Triangulator, Stripifier, elle vite la programmation des tches suivantes au moment de la cration de constructions gomtriques :

Le calcul des normales. L'optimisation par utilisation des classes de bandes (strip). L'optimisation par utilisation de constructions gomtriques indices. La dcomposition de formes polygonales en facettes triangulaires.

Une fois renseignes les coordonnes des sommets et ventuellement les autres paramtres d'une construction gomtrique, une instance de classe GeometryArray configure avec toutes les donnes peut tre gnre grce aux mthodes getGeometryArray () et getIndexedGeometryArray ().
Programmer en java Page 430

Dao Issiaka- 3me anne SI

Champs
public public public public public static static static static static final final final final final int int int int int TRIANGLE_ARRAY QUAD_ARRAY TRIANGLE_FAN_ARRAY TRIANGLE_STRIP_ARRAY POLYGON_ARRAY

Ces constantes sont passes en paramtre au constructeur de la classe GeometryInfo pour spcifier quel algorithme de construction gomtrique est utilis pour le tableau des sommets. La constante POLYGON_ARRAY indique que les sommets reprsentent le contour d'une surface polygonale. Il n'est pas obligatoire que cette surface soit plane et la mthode setContourCounts () permet d'indiquer si cette surface comporte des trous. La surface polygonale est automatiquement dcompose en facettes triangulaires.
Constructeur
public GeometryInfo (int primitive)

Cre une instance de la classe GeometryInfo. primitive peut tre gal TRIANGLE_ARRAY, QUAD_ARRAY, TRIANGLE_FAN_ARRAY, TRIANGLE_STRIP_ARRAY, POLYGON_ARRAY pour indiquer quel algorithme utilis.
Principales mthodes
public void setCoordinates (Point3f [] coordinates) public void setCoordinates (float [] coordinates)

Ces mthodes permettent de modifier la liste des sommets des facettes. Les valeurs passes en paramtre sont recopies.
public void setStripCounts (int [] coordinateIndices)

Si l'instance de GeometryInfo est cre avec TRIANGLE_FAN_ARRAY ou TRIANGLE_STRIP_ARRAY comme algorithme, le tableau coordinateIndices indique le nombre de sommets utiliss pour construire chaque bande partir du tableau des sommets. coordinateIndices.length est gal au nombre de bandes. Si les sommets dcrivent une seule bande l'appel cette mthode n'est pas obligatoire. Dans l'exemple de la pyramide, coordinateIndices est initialis {5, 3}.
public void setContourCounts (int [] contourCounts)

Si l'instance de GeometryInfo a t cre avec POLYGON_ARRAY comme algorithme, le tableau contourCounts indique le nombre de sommets utiliss pour construire le contour du polygone puis les trous partir du tableau des sommets. coordinateIndices.length est gal au nombre de trous + 1. Si le polygone n'a pas de trou, l'appel cette mthode n'est pas obligatoire.
public void setColors (Color3f [] colors) public void setColors (Color4f [] colors)

Ces mthodes permettent de modifier la couleur des sommets. Les attributs d'apparence positionns sur la forme 3D permettent d'interprter cette information de couleur de diffrentes faons et de positionner une couleur directement sur une forme 3D. Par dfaut, les facettes sont colores par interpolation entre les diffrentes couleurs de ses sommets.
Programmer en java Page 431

Dao Issiaka- 3me anne SI

public void setNormals (Vector3f [] normals) public void setNormals (float [] normals)

Ces mthodes permettent de modifier les normales des sommets. Vous pouvez aussi utiliser la classe NormalGenerator pour viter de programmer leur calcul. Toutes les normales doivent avoir une longueur (norme) gale 1.
public public public public void void void void setTextureCoordinates (Point2f [] texCoords) setTextureCoordinates2 (float [] texCoords) setTextureCoordinates (Point3f [] texCoords) setTextureCoordinates3 (float [] texCoords)

Ces mthodes permettent de modifier les coordonnes de texture 2D ou 3D de chaque sommet.


public GeometryArray getGeometryArray () public IndexedGeometryArray getIndexedGeometryArray ()

Ces mthodes renvoient une instance des classes GeometryArray ou IndexedGeometryArray passer en paramtre aux mthodes addGeometry (), insertGeometry () et setGeometry () de la classe Shape3D. Si l'instance de GeometryInfo a t cre avec POLYGON_ARRAY comme algorithme, la surface dcrite par les sommets sera d'abord transforme en facettes triangulaires.
Exemples

Applets Pyramid, LitPlane. Classe AxisShape.


La classe com.sun.j3d.utils.geometry.NormalGenerator

Cette classe utilitaire permet de calculer les normales aux sommets d'une construction gomtrique de classe GeometryInfo. Pour rappel, la normale un sommet est le vecteur dont la direction est orthogonale au plan auquel appartient ce sommet. Les normales sont utiles en 3D pour calculer les effets d'clairage. La mthode generateNormals () utilise un angle de pli (crease) pour gnrer les normales. Soit alpha l'angle entre les normales des sommets en commun de deux facettes adjacentes : si alpha < creaseAngle, une normale moyenne sera utilise plutt que les deux normales gomtriques, ce qui donne un effet visuel adoucissant l'angle. Utilisez creaseAngle gal 0 pour obtenir un effet de pli entre toutes les facettes.

Programmer en java

Page 432

Dao Issiaka- 3me anne SI

Figure 11. Angle de pli


Constructeurs
public NormalGenerator () public NormalGenerator (double creaseAngle)

Ces constructeurs crent une instance de la classe NormalGenerator. creaseAngle est l'angle de pli en radian compris entre 0 et PI (par dfaut gal 44 en radian).
Principale mthode
public void generateNormals (GeometryInfo geometry)

Gnre les normales des sommets de geometry.


Exemples

Classes AxisShape, LitPlane.


Construction d'une surface autour d'un axe central

Voici un exemple de classe ralisant une construction gomtrique, partir d'un profil projet autour d'un axe central. Ceci correspond aux objets fabriques sur un tour de potier. La classe AxisShape calcule les facettes de ce type de surface en utilisant un tableau points de points 2D comme profil. L'axe y est l'axe de symtrie centrale. Le profil est appliqu tous les 2*PI/divisions radians sur tout un tour pour obtenir les sommets des facettes la forme 3D. L'algorithme de construction gomtrique des quadrilatres est utilis ici mais il est aussi possible d'utiliser d'autres algorithmes comme celui en bande de la classe TriangleStripArray. Les classes GeometryInfo et NormalGenerator sont finalement utilises pour simplifier le calcul des normales et obtenir une instance de IndexedGeometryArray sans peine.

Programmer en java

Page 433

Dao Issiaka- 3me anne SI

Figure 12. Forme 3D construite autour d'un axe central


import javax.media.j3d.*; import javax.vecmath.*; import com.sun.j3d.utils.geometry.*; public class AxisShape extends Shape3D { private Point2f [] points; private int divisions; public AxisShape (Point2f [] points, int divisions) { this.points = points; this.divisions = divisions; if ( points [0].x != 0 || points [points.length - 1].x != 0) throw new IllegalArgumentException ("First and last point x must be

0"); // Construction du contour avec des quadrilatres // utilisant le nombre de divisions en paramtre Point3f [] coords = new Point3f [(points.length - 1) * divisions * 4]; for (int i = 0, k = 0; i < divisions; i++) for (int j = 0; j < points.length - 1; j++) { double angle = 2 * Math.PI * i / divisions; float cos = (float)Math.cos (angle); float sin = (float)Math.sin (angle); // Calcul des 4 points de la facette Point3f point1 = new Point3f (points [j].x * cos, points [j].y, points [j].x * sin); Point3f point4 = new Point3f (points [j + 1].x * cos, points [j + 1].y, points [j + 1].x * sin); angle = 2 * Math.PI * (i + 1) / divisions; cos = (float)Math.cos (angle); sin = (float)Math.sin (angle); Point3f point2 = new Point3f (points points points Point3f point3 = new Point3f (points points points [j].x * cos, [j].y, [j].x * sin); [j + 1].x * cos, [j + 1].y, [j + 1].x * sin);

Programmer en java

Page 434

Dao Issiaka- 3me anne SI

// Contruction de la facette coords [k++] = point1; coords [k++] = point2; coords [k++] = point3; coords [k++] = point4; } // Utilisation de la classe utilitaire de construction gomtrique GeometryInfo geometryInfo = new GeometryInfo (GeometryInfo.QUAD_ARRAY); geometryInfo.setCoordinates (coords); // Gnration des normales new NormalGenerator ().generateNormals (geometryInfo); // Recopie dans la construction gomtrique de cette forme setGeometry (geometryInfo.getIndexedGeometryArray ()); } // Implmentation de la copie public Node cloneNode (boolean forceDuplicate) { AxisShape node = new AxisShape (points, divisions); node.duplicateNode (this, forceDuplicate); return node; } }

Voici l'applet AxisShapeDemo drivant de la classe Applet3D : cet exemple cre la forme 3D d'un vase partir de son profil pour tester la classe AxisShape.

import javax.media.j3d.*; import javax.vecmath.*; import com.sun.j3d.utils.applet.MainFrame;

public class AxisShapeDemo extends Applet3D { public BranchGroup createSceneTree () { // Racine de l'arbre des objets reprsents dans la scne 3D BranchGroup root = new BranchGroup (); // Cration d'un vase partir de son profil AxisShape shape = new AxisShape (new Point2f [] {new Point2f (0, 0.7f), new Point2f (0.2f, 0.7f), new Point2f (0.15f, 0.65f),

Programmer en java

Page 435

Dao Issiaka- 3me anne SI

new Point2f (0.15f, 0.55f), new Point2f (0.3f, 0.1f), new Point2f (0.3f, 0.4f), new Point2f (0.1f, 0.63f), new Point2f (0.3f, 0.7f), new Point2f (0, 0.7f)}, 16); // Construction de la branche de l'arbre de la scne root.addChild (shape); return root; } // Mthode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args) { new MainFrame (new AxisShapeDemo (), args, 150, 150); } }

La classe javax.media.j3d.Text3D

Cette classe drive des classes SceneGraphObject, NodeComponent, Geometry et permet de crer une construction gomtrique de texte 3D partir d'une chane de caractres. Ce texte est dessin avec une police de caractres 3D de classe Font3D la position donne dans le plan (x,y) et lev suivant l'axe z. Voir aussi l'applet TextTranslation pour un exemple de gnration de texte sur plusieurs lignes.
Champs
public static final int ALIGN_FIRST public static final int ALIGN_CENTER public static final int ALIGN_LAST

Ces constantes sont utilises pour aligner le texte sur son premier caractre, au centre ou sur son dernier caractre par rapport la position du texte.
public public public public static static static static final final final final int int int int PATH_LEFT PATH_RIGHT PATH_UP PATH_DOWN

Ces constantes sont utilises pour indiquer le sens d'criture du texte (vers la gauche, la droite, le haut ou le bas).
public public public public static static static static final final final final int int int int ALLOW_STRING_READ ALLOW_STRING_WRITE ALLOW_FONT3D_READ ALLOW_FONT3D_WRITE
Page 436

Programmer en java

Dao Issiaka- 3me anne SI

public public public public public public public public

static static static static static static static static

final final final final final final final final

int int int int int int int int

ALLOW_POSITION_READ ALLOW_POSITION_WRITE ALLOW_ALIGNMENT_READ ALLOW_ALIGNMENT_WRITE ALLOW_PATH_READ ALLOW_PATH_WRITE ALLOW_CHARACTER_SPACING_READ ALLOW_CHARACTER_SPACING_WRITE

Ces capacits permettent d'autoriser la lecture ou la modification de la chane de caractres de ce texte 3D, de sa police de caractres, de sa position, de son alignement, du sens d'criture ou de l'espacement entre ses caractres.
public static final int ALLOW_BOUNDING_BOX_READ

Cette capacit permet d'autoriser l'interrogation de la boite englobante de ce texte 3D.


Constructeurs
public Text3D () public Text3D (Font3D public Text3D (Font3D public Text3D (Font3D public Text3D (Font3D alignment, int path) font3D) font3D, String string) font3D, String string, Point3f position) font3D, String string, Point3f position, int

Ces constructeurs permettent de crer un texte 3D partir de la chane de caractres string positionne au point position en utilisant la police de caractres font3D, l'alignement alignment et le sens d'criture path. Par dfaut, font3D est gal null, string null, position (0, 0, 0), alignment ALIGN_FIRST et path PATH_RIGHT.
Principales mthodes
public String getString ()

(capacit ALLOW_STRING_READ)

public void setString (String string) (capacit ALLOW_STRING_WRITE)

Ces mthodes permettent d'interroger ou de modifier la chane de caractres affiche par ce texte 3D.
public Font3D getFont3D ()

(capacit ALLOW_FONT3D_READ)

public void setFont3D (Font3D font3d) (capacit ALLOW_FONT3D_WRITE)

Ces mthodes permettent d'interroger ou de modifier la police de caractres de ce texte 3D.


public void getPosition (Point3f position) (capacit ALLOW_POSITION_READ) public void setPosition (Point3f position) (capacit ALLOW_POSITION_WRITE)

Ces mthodes permettent d'interroger ou de modifier la position de ce texte 3D. Le texte est align sur le premier caractre, au centre ou sur le dernier caractre par rapport ce point
Programmer en java Page 437

Dao Issiaka- 3me anne SI

suivant l'alignement utilis. Si le sens d'criture est horizontal, la ligne de base du texte est aligne verticalement sur ce point. Si le sens d'criture est vertical, le texte est aligne gauche de ce point.
public int getAlignment ()

(capacit ALLOW_ALIGNMENT_READ)

public void setAlignment (int alignment) (capacit ALLOW_ALIGNMENT_WRITE)

Ces mthodes permettent d'interroger ou de modifier l'alignement de ce texte 3D. alignment peut tre gal ALIGN_FIRST, ALIGN_CENTER ou ALIGN_LAST.
public int getPath ()

(capacit ALLOW_PATH_READ)

public void setPath (int path) (capacit ALLOW_PATH_WRITE)

Ces mthodes permettent d'interroger ou de modifier le sens d'criture de ce texte 3D. path peut tre gal PATH_LEFT, PATH_RIGHT, PATH_UP ou PATH_DOWN.
public float getCharacterSpacing ()

(capacit
ALLOW_CHARACTER_SPACING_READ)

public void setCharacterSpacing (float characterSpacing)

(capacit
ALLOW_CHARACTER_SPACING_WRITE)

Ces mthodes permettent d'interroger ou de modifier l'espacement entre caractres de ce texte 3D. Cette distance est l'espace supplmentaire ajout entre chaque caractre du texte. Une valeur de 1 correspond au plus large des caractres dans la police utilise. Par dfaut, cet espacement vaut 0.
public void getBoundingBox (BoundingBox bounds)

(capacit
ALLOW_BOUNDING_BOX_READ)

Met jour le paramtre bounds avec les coordonnes de la boite englobante de ce texte 3D. Voici l'applet HelloWorld3D drivant de la classe Applet3D. Cet exemple dessine le texte "Hello World 3D" en 3D :

import java.awt.Font; import javax.media.j3d.*; import javax.vecmath.*;


Programmer en java Page 438

Dao Issiaka- 3me anne SI

import com.sun.j3d.utils.applet.MainFrame; public class HelloWorld3D extends Applet3D { public BranchGroup createSceneTree () { // Racine de l'arbre des objets reprsents dans la scne 3D BranchGroup root = new BranchGroup (); Font3D font = new Font3D (new Font ("Helvetica", Font.PLAIN, 1), new FontExtrusion ()); // Cration d'un texte centr sur l'origine Text3D textGeometry = new Text3D (font, "Hello World 3D"); textGeometry.setAlignment (Text3D.ALIGN_CENTER); Shape3D textShape = new Shape3D (textGeometry); // Cration d'une rotation de -PI / 4 autour de l'axe x Transform3D transform = new Transform3D (); transform.rotX (-Math.PI / 6); // Cration d'une dformation pour voir le texte entirement l'cran Transform3D scale = new Transform3D (); scale.setScale (0.25); // Multiplication des deux transformations pour les cumuler transform.mul (scale); TransformGroup transformGroup = new TransformGroup (transform); // Construction de la branche de l'arbre de la scne transformGroup.addChild (textShape); root.addChild (transformGroup); return root; } // Mthode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args) { new MainFrame (new HelloWorld3D (), args, 300, 70); } }

Autre exemple

Applet TextTranslation.
La classe javax.media.j3d.Font3D

Cette classe reprsente une police de caractres 3D, cre partir d'une police de caractres AWT de classe java.awt.Font et une instance de FontExtrusion qui dfinit le profil des caractres dans la profondeur. La hauteur du texte 3D est celle de la police de caractres utilise l'instantiation de la classe java.awt.Font.
Principal constructeur
public Font3D (java.awt.Font font, FontExtrusion extrudePath)

Exemple

Applet HelloWorld3D, TextTranslation.


Programmer en java Page 439

Dao Issiaka- 3me anne SI

La classe javax.media.j3d.FontExtrusion

Cette classe est utilise par la classe Font3D pour dfinir le profil des caractres dans la profondeur (suivant l'axe z).
Principaux constructeurs
public FontExtrusion () public FontExtrusion (java.awt.Shape extrusionShape)

Ces constructeurs dfinissent le profil des caractres. Par dfaut, c'est une ligne de 0.2 unit de haut.
Exemple

Applet HelloWorld3D, TextTranslation.


Les fonds d'cran La classe javax.media.j3d.Background

Cette classe drive des classes SceneGraphObject, Node, Leaf et reprsente le fond d'cran d'une scne 3D. L'ajout d'une instance de Background dans l'arbre d'une scne 3D permet de changer la couleur noir de fond utilise par dfaut. Ce fond est toujours dessin en premier avant le reste de la scne 3D, et peut tre une couleur unie ou une image associe ventuellement une sous-scne. Il est reprsent par un noeud dans l'arbre d'une scne 3D. Les fonds d'cran sont appliqus un espace limit. Cette limite (application bounds), null par dfaut, permet d'avoir plusieurs fonds d'cran actifs sur des zones diffrentes. Il faut obligatoirement dterminer cette limite pour que le fond d'cran soit pris en compte.
Champs (constantes de capacit)
public public public public public public static static static static static static final final final final final final int int int int int int ALLOW_COLOR_READ ALLOW_COLOR_WRITE ALLOW_IMAGE_READ ALLOW_IMAGE_WRITE ALLOW_GEOMETRY_READ ALLOW_GEOMETRY_WRITE

Ces capacits permettent d'autoriser la lecture ou la modification de la couleur, de l'image ou de l'arbre de la sous-scne utiliss pour le fond d'cran.
public static final int ALLOW_APPLICATION_BOUNDS_READ public static final int ALLOW_APPLICATION_BOUNDS_WRITE

Ces capacits permettent d'autoriser la lecture ou la modification des limites dans lesquelles est appliqu le fond d'cran.

Programmer en java

Page 440

Dao Issiaka- 3me anne SI

Constructeurs
public public public public public Background Background Background Background Background () (Color3f color) (float r, float g, float b) (ImageComponent2D image) (BranchGroup branch)

Ces constructeurs permettent de crer un fond d'cran de couleur unie color (ou r g b), utilisant une image image ou une sous-scne branch. Par dfaut, color est gal au noir, image et branch null.
Principales mthodes
public void getColor (Color3f color) public void setColor (Color3f color)

(capacit ALLOW_COLOR_READ) (capacit ALLOW_COLOR_WRITE)

public void setColor (float r, float g, float b) (capacit ALLOW_COLOR_WRITE)

Ces mthodes permettent d'interroger ou de modifier la couleur du fond d'cran.


public ImageComponent2D getImage ()

(capacit ALLOW_IMAGE_READ)

public void setImage (ImageComponent2D image) (capacit ALLOW_IMAGE_WRITE)

Ces mthodes permettent d'interroger ou de modifier l'image du fond d'cran. Si une image est utilise, la couleur n'est plus prise en compte.
public BranchGroup getGeometry ()

(capacit ALLOW_GEOMETRY_READ)

public void setGeometry (BranchGroup branch) (capacit ALLOW_GEOMETRY_WRITE)

Ces mthodes permettent d'interroger ou de modifier l'arbre de la sous-scne du fond d'cran. Cette scne est dessine par dessus la couleur ou l'image de fond. Elle est projete l'infini et doit tenir dans une sphre d'une unit de rayon.
public Bounds getApplicationBounds ()

(capacit
ALLOW_APPLICATION_BOUNDS_READ)

public BoundingLeaf getApplicationBoundingLeaf ()

(capacit
ALLOW_APPLICATION_BOUNDS_READ)

public void setApplicationBounds (Bounds (capacit region) ALLOW_APPLICATION_BOUNDS_WRITE) public void setApplicationBoundingLeaf (BoundingLeaf region)

(capacit
ALLOW_APPLICATION_BOUNDS_WRITE)

Programmer en java

Page 441

Dao Issiaka- 3me anne SI

Ces mthodes permettent d'interroger ou de modifier la limite dans lesquelles est appliqu le fond d'cran.
Exemples

Applets SimpleObjects, ObjectFileDemo, SimpleTexturedObjects, LightEffect, SunEarthMoonMotion.


La classe javax.media.j3d.Bounds

Cette classe abstract est la super classe des classes BoundingBox, BoundingSphere et BoundingPolytope. Ces classes reprsentent en Java 3D les limites spatiales utilises notamment pour les fonds d'cran, l'clairage et les comportements. La classe Bounds dclare un ensemble de mthodes abstract non dcrites ici qui permettent de calculer la combinaison ou l'intersection d'un ensemble de limites.
La classe javax.media.j3d.BoundingBox

Cette classe drive de la classe Bounds et reprsente une limite paralllpipdique spcifie par deux coins opposs de la limite.
Principaux constructeurs
public BoundingBox () public BoundingBox (Point3d lower, Point3d upper)

Ces constructeurs permettent de crer une limite paralllpipdique dont les deux points opposs sont lower et upper (par dfaut gaux aux points (-1,-1,-1) et (1,1,1)).
Principales mthodes
public public public public public public void void void void void void getLower getUpper setLower setLower setUpper setUpper (Point3d p1) (Point3d p1) (double xmin, double ymin, double zmin) (Point3d p1) (double xmax, double ymax, double zmax) (Point3d p1)

Ces mthodes permettent d'interroger ou de modifier les deux points opposs de cette limite.
Exemples

Applets SimpleObjects, ObjectFileDemo, SimpleTexturedObjects, LightEffect.


La classe javax.media.j3d.BoundingSphere

Cette classe drive de la classe Bounds et reprsente une limite sphrique.


Principaux constructeurs
public BoundingSphere () public BoundingSphere (Point3d center, double radius)

Programmer en java

Page 442

Dao Issiaka- 3me anne SI

Ces constructeurs permettent de crer une limite sphrique centre en center et de rayon radius (par dfaut gaux l'origine et 1).
Principales mthodes
public public public public double getRadius () void getCenter (Point3d center) void setRadius (double r) void setCenter (Point3d center)

Ces mthodes permettent d'interroger ou de modifier la rayon ou le centre de cette limite.


Exemples

Applets LightEffect, LitApplet3D, MouseApplet3D, TextTranslation, AlphaTest, TextTranslation, Clock3D, SunEarthMoonMotion.


La classe javax.media.j3d.BoundingLeaf

Cette classe drive des classes SceneGraphObject, Node, Leaf. Ce type de noeud qui mmorise une limite spatiale de classe Bounds peut tre partag par un ensemble de noeuds d'un arbre 3D ayant besoin d'une limite. Ceci vite de crer une instance de limite pour chaque noeud de cet ensemble . Par exemple, une instance de la classe BoundingLeaf peut reprsenter les limites d'une pice qui seront utilises par les sources lumineuses et sonores de cette pice. Une instance de cette classe est reprsente par un noeud dans l'arbre d'une scne 3D. N'oubliez pas d'ajouter les instances de la classe BoundingLeaf l'arbre de la scne 3D, pour que Java 3D puisse prendre en compte les groupes de transformations parents susceptibles de modifier la limite associe.
Champs (constantes de capacit)
public static final int ALLOW_REGION_READ public static final int ALLOW_REGION_WRITE

Ces capacits permettent d'autoriser la lecture ou la modification de la limite.


Constructeurs
public BoundingLeaf () public BoundingLeaf (Bounds region)

Ces constructeurs permettent de crer une limite (region est gal null par dfaut).
Principales mthodes
public Bounds getRegion ()

(capacit ALLOW_REGION_READ)

public void setRegion (Bounds region) (capacit ALLOW_REGION_WRITE)

Ces mthodes permettent d'interroger ou de modifier la limite de cet instance.

Programmer en java

Page 443

Dao Issiaka- 3me anne SI

Exemple

Applet Clock3D.
L'importation de scnes 3D

La programmation d'une scne 3D est souvent longue et n'est pas toujours la manire la plus simple pour subvenir tous les besoins d'un programme. Java 3D fournit le package com.sun.j3d.loaders avec les interfaces Loader et Scene dont l'implmentation vise permettre l'importation de fichiers crs avec d'autres logiciels 3D : ceci permet de mettre en scne dans Java 3D des objets 3D issus de bibliothques existantes ou de crer vos objets avec un logiciel 3D pour l'importer ensuite dans Java 3D. Java 3D fournit deux classes implmentant ces interfaces :
com.sun.j3d.loaders.objectfile.ObjectFile Fichiers .obj Wavefront com.sun.j3d.loaders.lw3d.Lw3dLoader

Fichiers .lws Lightwave 3D

Les diteurs de logiciels 3D fournissent le mme type de classe pour la plupart des autres formats de fichiers. Voici l'applet ObjectFileDemo drivant de la classe Applet3D : cet exemple affiche le fichier p51_mustang.obj fourni avec les exemples de Java 3D. Sans effet d'clairage, les formes 3D dfinies dans ce fichier sont noires, c'est pourquoi un fond bleu est ajout la scne 3D.

import import import import

javax.media.j3d.*; com.sun.j3d.loaders.objectfile.ObjectFile; com.sun.j3d.loaders.Scene; com.sun.j3d.utils.applet.MainFrame;

public class ObjectFileDemo extends Applet3D { public BranchGroup createSceneTree () { // Racine de l'arbre des objets reprsents dans la scne 3D BranchGroup root = new BranchGroup (); // Cration d'un fond bleu ciel pour apercevoir l'avion qui est noir par dfaut Background background = new Background (0.4f, 0.6f, 0.8f); background.setApplicationBounds (new BoundingBox ()); root.addChild (background);
Programmer en java Page 444

Dao Issiaka- 3me anne SI

try { // Chargement du fichier p51_mustang.obj ObjectFile loader = new ObjectFile (); Scene scene = loader.load ("p51_mustang.obj"); BranchGroup objectRoot = scene.getSceneGroup (); // Cration d'une rotation de PI / 6 autour de l'axe x Transform3D transform = new Transform3D (); transform.rotX (Math.PI / 6); // Modification de l'chelle transform.setScale (0.1); TransformGroup transformGroup = new TransformGroup (transform); transformGroup.addChild (objectRoot); root.addChild (transformGroup); } catch (Exception e) { System.err.println (e); } return root; } // Mthode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args) { new MainFrame (new ObjectFileDemo (), args, 150, 120); } }

Figure 13. Arbre de la scne ObjectFileDemo


L'interface com.sun.j3d.loaders.Loader

Cette interface est implmente pour importer des sources de donnes 3D. Les exceptions Runtime de classes IncorrectFormatException et ParsingErrorException sont dclenches par les mthodes load () pour indiquer respectivement que les donnes ne sont pas au format attendu ou que la lecture des donnes rencontrer un problme.
Champs
public static final int LOAD_BACKGROUND_NODES public static final int LOAD_LIGHT_NODES public static final int LOAD_FOG_NODES
Programmer en java Page 445

Dao Issiaka- 3me anne SI

public public public public

static static static static

final final final final

int int int int

LOAD_SOUND_NODES LOAD_BEHAVIOR_NODES LOAD_VIEW_GROUPS LOAD_ALL

Ces constantes ou une combinaison de ces constantes sont passes en paramtre la mthode setFlags () pour indiquer quelles parties de la scne doit tre charge.
Mthodes
public int getFlags () public void setFlags (int flags)

Ces mthodes permettent d'interroger ou de modifier les indicateurs de chargement flags. flags peut tre gal l'une des constantes LOAD_... ou la combinaison de ces constantes avec l'oprateur |, et indiquent quelle partie de la scne doit tre charge.
public Scene load (String fileName) throws java.io.FileNotFoundException, IncorrectFormatException, ParsingErrorException public String getBasePath () public void setBasePath (String pathName)

La mthode load () permettent de charger une scne partir du fichier fileName. Les mthodes getBasePath () et setBasePath () permettent d'interroger ou de modifier le chemin utilis pour trouver les ventuels fichiers rfrencs par le contenu de fileName. Par dfaut, ce chemin est le mme rpertoire que celui du fichier fileName.
public Scene load (java.net.URL url) throws java.io.FileNotFoundException, IncorrectFormatException, ParsingErrorException public java.net.URL getBaseUrl () public void setBaseUrl (java.net.URL url)

La mthode load () permettent de charger une scne partir de l'URL url. Les mthodes getBaseUrl () et setBaseUrl () permettent d'interroger ou de modifier le chemin utilis pour trouver les ventuels fichiers rfrencs par le contenu d'url. Par dfaut, ce chemin est le mme rpertoire que celle de l'url.
public Scene load (java.io.Reader reader) throws java.io.FileNotFoundException, IncorrectFormatException, ParsingErrorException

Charge une scne partir de la source de donnes reader. Le chemin utilis pour trouver les ventuels fichiers rfrencs par le contenu de reader est le rpertoire courant de l'utilisateur (issu de la proprit systme user.dir).
Exemple

Applet ObjectFileDemo.

Programmer en java

Page 446

Dao Issiaka- 3me anne SI

L'interface com.sun.j3d.loaders.Scene

Cette interface permet d'interroger les diffrentes parties d'une scne 3D importe par les mthodes load () de la classe implmentant l'interface Loader.
Mthodes
public public public public public public public public public public BranchGroup getSceneGroup () java.lang.String getDescription () java.util.Hashtable getNamedObjects () Background [] getBackgroundNodes () Light [] getLightNodes () Fog [] getFogNodes () Sound [] getSoundNodes () Behavior [] getBehaviorNodes () TransformGroup [] getViewGroups () float [] getHorizontalFOVs ()

Ces mthodes permettent d'interroger les diffrentes parties de la scne 3D. L'instance de la classe BranchGroup renvoye par getSceneGroup () peut tre directement rattache une instance de SimpleUniverse.
Exemple

Applet ObjectFileDemo.

Programmer en java

Page 447

Dao Issiaka- 3me anne SI

Les attributs d'apparence


Les diffrents attributs Les attributs de couleur Les attributs d'affichage des facettes Les attributs de transparence et de rendu Les attributs de texture

Ce chapitre dcrit comment modifier les attributs d'apparence des objets 3D que vous avez crs. Ceux-ci permettent de modifier les couleurs, la transparence, les paramtres de rendu et la texture des objets 3D.
Les diffrents attributs

A chaque forme 3D de classe Shape3D, peuvent tre affects des attributs d'apparence rassembls dans une instance de la classe Appearance. Ces attributs permettent de modifier les aspects suivants d'un objet 3D :

Attributs de couleur (via les classes ColoringAttributes et Material) Attributs d'affichage des facettes (via les classes PolygonAttributes, PointAttributes, LineAttributes) Attributs de transparence et de rendu (via les classes TransparencyAttributes et RenderingAttributes) Attributs de texture (via les classes Texture, TextureAttributes, TexCoordGeneration)

Le tableau suivant prsente la liste dtaille de tous les attributs d'apparence dcrits dans ce chapitre, avec leur valeur par dfaut :
ATTRIBUT CLASSE PROPRIT VALEUR PAR DFAUT noir (0,0,0)

Couleur Modle de nuance Couleur mise Couleur

ColoringAttributes

color

ColoringAttributes

shadeModel

SHADE_GOURAUD

Material Material

emissiveColor ambientColor

noir (0,0,0) gris

Programmer en java

Page 448

Dao Issiaka- 3me anne SI

d'ambiance Couleur de diffusion Couleur de spcularit Brillance

(0.2,0.2,0.2)

Material

diffuseColor

blanc (1,1,1)

Material

specularColor

blanc (1,1,1)

Material

shininess

64

Mode d'affichage PolygonAttributes Elimination des facettes Taille des points Antialiasing des points Epaisseur des artes Type de trait Antialiasing des artes Mode de transparence Transparence Visibilit Utilisation des couleurs des sommets Utilisation de la texture

polygonMode

POLYGON_FILL

PolygonAttributes

cullFace

CULL_BACK

PointAttributes

pointSize

PointAttributes

pointAntialiasingEnable false

LineAttributes

lineWidth

LineAttributes

linePattern

PATTERN_SOLID

LineAttributes

lineAntialiasingEnable

false

TransparencyAttributes transparencyMode

NONE

TransparencyAttributes transparency

RenderingAttributes

visible

true

RenderingAttributes

ignoreVertexColors

false

Texture

enable

true

Programmer en java

Page 449

Dao Issiaka- 3me anne SI

Image de la texture Mode d'application de la texture Couleur de mlange

Texture

image

null

TextureAttributes

textureMode

REPLACE

TextureAttributes

textureBlendColor

noir (0,0,0)

Cette liste n'est pas exhaustive mais vous donne un aperu des possibilits d'utilisation des attributs d'apparence en Java 3D et satisferont la plupart de vos besoins. Toutes ces classes drivent des classes SceneGraphObject et NodeComponent.
La classe javax.media.j3d.Appearance

Cette classe drive des classes SceneGraphObject et NodeComponent. La modification des attributs d'apparence d'une forme 3D s'effectue en passant en paramtre une instance de cette classe la mthode setAppearance () de la classe Shape3D. Plutt que de mmoriser directement tous les attributs d'apparence, la classe Appearance rfrence un ensemble d'instances de classes drivant de la classe NodeComponent et reprsentant les diffrents attributs d'apparence. Ceci permet de partager certains attributs entre diffrentes formes. Les valeurs par dfaut de ces attributs sont modifis en appelant la mthode set... () correspondante.
Champs (constantes de capacit)
public public public public public public public public public public public public public public public public public public public public public public static static static static static static static static static static static static static static static static static static static static static static final final final final final final final final final final final final final final final final final final final final final final int int int int int int int int int int int int int int int int int int int int int int ALLOW_COLORING_ATTRIBUTES_READ ALLOW_COLORING_ATTRIBUTES_WRITE ALLOW_POLYGON_ATTRIBUTES_READ ALLOW_POLYGON_ATTRIBUTES_WRITE ALLOW_POINT_ATTRIBUTES_READ ALLOW_POINT_ATTRIBUTES_WRITE ALLOW_LINE_ATTRIBUTES_READ ALLOW_LINE_ATTRIBUTES_WRITE ALLOW_TRANSPARENCY_ATTRIBUTES_READ ALLOW_TRANSPARENCY_ATTRIBUTES_WRITE ALLOW_RENDERING_ATTRIBUTES_READ ALLOW_RENDERING_ATTRIBUTES_WRITE ALLOW_MATERIAL_READ ALLOW_MATERIAL_WRITE ALLOW_TEXTURE_READ ALLOW_TEXTURE_WRITE ALLOW_TEXTURE_ATTRIBUTES_READ ALLOW_TEXTURE_ATTRIBUTES_WRITE ALLOW_TEXGEN_READ ALLOW_TEXGEN_WRITE ALLOW_TEXTURE_UNIT_STATE_READ ALLOW_TEXTURE_UNIT_STATE_WRITE

Ces capacits permettent d'autoriser la lecture ou la modification des diffrentes instances d'attributs d'apparence.
Programmer en java Page 450

Dao Issiaka- 3me anne SI

Constructeur
public Appearance ()

Cre une instance de la classe Appearance avec tous ses attributs initialiss null.
Principales mthodes Mthode
public ColoringAttributes getColoringAttributes () public void setColoringAttributes (ColoringAttributes coloringAttributes)

Capacit
ALLOW_COLORING_ATTRIBUTES_READ ALLOW_COLORING_ATTRIBUTES_WRITE

public Material getMaterial () ALLOW_MATERIAL_READ public void setMaterial (Material material) ALLOW_MATERIAL_WRITE

public PolygonAttributes getPolygonAttributes () public void setPolygonAttributes (PolygonAttributes polygonAttributes) public PointAttributes getPointAttributes () public void setPointAttributes (PointAttributes pointAttributes) public LineAttributes getLineAttributes () public void setLineAttributes (LineAttributes lineAttributes) public TransparencyAttributes getTransparencyAttri butes () public void setTransparencyAttributes (TransparencyAttributes transparencyAttributes) public RenderingAttributes getRenderingAttributes () public void setRenderingAttributes (RenderingAttributes renderingAttributes) public Texture getTexture () public void setTexture (Texture texture)

ALLOW_POLYGON_ATTRIBUTES_READ ALLOW_POLYGON_ATTRIBUTES_WRITE

ALLOW_POINT_ATTRIBUTES_READ ALLOW_POINT_ATTRIBUTES_WRITE

ALLOW_LINE_ATTRIBUTES_READ ALLOW_LINE_ATTRIBUTES_WRITE

ALLOW_TRANSPARENCY_ATTRIBUTES_R EAD ALLOW_TRANSPARENCY_ATTRIBUTES_W RITE ALLOW_RENDERING_ATTRIBUTES_READ ALLOW_RENDERING_ATTRIBUTES_WRIT E

ALLOW_TEXTURE_READ ALLOW_TEXTURE_WRITE

public TextureAttributes getTextureAttributes () public void setTextureAttributes (TextureAttributes textureAttributes) public TexCoordGeneration

ALLOW_TEXTURE_ATTRIBUTES_READ ALLOW_TEXTURE_ATTRIBUTES_WRITE

ALLOW_TEXGEN_READ

Programmer en java

Page 451

Dao Issiaka- 3me anne SI

getTexCoordGeneration () public void setTexCoordGeneration (TexCoordGeneration texCoordGeneration) public TextureUnitState [] getTextureUnitState () public void setTextureUnitState (TextureUnitState [] stateArray)

ALLOW_TEXGEN_WRITE

ALLOW_TEXTURE_UNIT_STATE_READ ALLOW_TEXTURE_UNIT_STATE_WRITE

Ces mthodes permettent d'interroger ou de modifier les diffrents attributs d'apparence. Les valeurs par dfault des instances null d'attributs sont les mmes que celles dfinies par le constructeur par dfaut de leur classe d'attributs.
Exemples

Applets Clown, SphereConstruction, WaterGlass, SimpleTexturedObjects, LitPlane, LitApplet3D, Clock3D, SunEarthMoonMotion.


Les attributs de couleur

La couleur d'une forme 3D est dtermine l'aide des critres suivants :


1. Les couleurs des sommets attribues pour les constructions gomtriques de classe GeometryArray et l'attribut ignoreVertexColors de la classe RenderingAttributes. 2. La couleur des attributs de la classe ColoringAttributes. 3. Les normales des constructions gomtriques de classe GeometryArray et les couleurs des attributs de la classe Material. 4. L'utilisation de lumires pour clairer la scne 3D.

Ces critres sont optionnels et la couleur affiche par Java 3D dpend de leur combinaison comme le montre le tableau suivant, qui teste toutes les combinaisons possibles :
CRITRES Couleurs des sommets +
ignoreVertexColors = false

Normales CRITRE Couleur de + DOMINANT Lumires ColoringAttributes Couleurs de


Material

Programmer en java

Page 452

Dao Issiaka- 3me anne SI

Chaque cellule des colonnes Critres contient ou non un symbole pour indiquer si ce critre est vrai ou faux. La colonne Critre dominant permet chaque ligne du tableau de dduire la couleur qui sera choisie par Java 3D pour une combinaison donne :
CRITRE DOMINANT Couleurs des sommets Couleur des attributs de la classe ColoringAttributes Combinaison des couleurs des attributs de la classe Material actives sous la lumire Couleur d'mission des attributs de la classe Material Couleur des attributs d'apparence par dfaut (blanche par dfaut) COULEUR FINALE

Remarques

Pour les versions < 1.2 de Java 3D, l'attribut ignoreVertexColors n'existe pas et est implicitement gal false.

Programmer en java

Page 453

Dao Issiaka- 3me anne SI

Pour que l'clairage prenne en compte les couleurs des attributs de la classe Material, les constructions gomtriques de classe GeometryArray doivent contenir aussi leurs normales.

Conclusions

Si l'attribut ignoreVertexColors est gal true, la couleur des sommets est ignore. La couleur des sommets attribues pour les constructions gomtriques est toujours utilise si l'attribut ignoreVertexColors est gale false (sa valeur par dfaut). C'est le cas de la classe ColorCube qui dfinit une couleur pour chacune des facettes de sa construction gomtrique. Sans lumire, la couleur d'une forme 3D ayant des attributs d'apparence de la classe Material est la couleur d'mission de l'instance de la classe Material. C'est le cas des classes Box, Sphere, Cylinder et Cone : l'exemple SimpleObjects utilise un fond blanc pour apercevoir ces formes dont la couleur d'mission est noire.

Voici l'applet Clown drivant de la classe Applet3D et reprsentant un clown. Le clown est construit avec 8 formes de bases sphrique, cylindrique et conique sur lesquels sont appliqus des transformations. Chaque forme reoit une couleur donnant le rsultat suivant :

import import import import

javax.media.j3d.*; javax.vecmath.*; com.sun.j3d.utils.geometry.*; com.sun.j3d.utils.applet.MainFrame;

public class Clown extends Applet3D { // Mthode de la classe Applet3D outrepasse public BranchGroup createSceneTree () { // Racine de l'arbre des objets reprsents dans la scne 3D BranchGroup root = new BranchGroup (); // Cration du groupe reprsentant le clown Group clown = createClown (); // Cration d'une rotation de PI / 4 autour de l'axe y Transform3D transform = new Transform3D (); transform.rotY (Math.PI / 4); // Cration d'une dformation pour donner les bonnes proportions l'cran
Programmer en java Page 454

Dao Issiaka- 3me anne SI

Transform3D scale = new Transform3D (); scale.setScale (0.07); // Multiplication des deux transformations pour les cumuler transform.mul (scale); TransformGroup transformGroup = new TransformGroup (transform); // Construction de l'arbre de la scne transformGroup.addChild (clown); root.addChild (transformGroup); return root; } // Cre les diffrentes formes du clown public Group createClown () { final int defaultShade = ColoringAttributes.SHADE_GOURAUD; // Cration du corps Cylinder body = new Cylinder (1.75f, 10f); Appearance shapeAppearance = new Appearance (); // Application d'une couleur bleue shapeAppearance.setColoringAttributes ( new ColoringAttributes (0.4f, 0.6f, 1f, defaultShade)); body.setAppearance (shapeAppearance); // Cration du bras gauche Cylinder leftArm = new Cylinder (0.65f, 13f); shapeAppearance = new Appearance (); // Application d'une couleur peau shapeAppearance.setColoringAttributes ( new ColoringAttributes (1f, 0.8f, 0.6f, defaultShade)); leftArm.setAppearance (shapeAppearance); Transform3D leftArmTransformation = new Transform3D (); leftArmTransformation.setTranslation (new Vector3f (2.1f, -1.5f, 0)); // Cration d'une rotation pour dtacher le bras du corps Transform3D rotation = new Transform3D (); rotation.rotZ (Math.PI / 18); // Multiplication des deux transformations pour les cumuler leftArmTransformation.mul (rotation); TransformGroup leftArmTransformationGroup = new TransformGroup (leftArmTransformation); // Cration du bras droit (on pourrait utiliser aussi de leftArm.cloneTree ()) Cylinder rightArm = new Cylinder (0.65f, 13f); rightArm.setAppearance (shapeAppearance); Transform3D rightArmTransformation = new Transform3D (); rightArmTransformation.setTranslation (new Vector3f (-2.1f, -1.5f, 0)); // Cration d'une rotation pour dtacher le bras du corps rotation = new Transform3D (); rotation.rotZ (-Math.PI / 18); // Multiplication des deux transformations pour les cumuler rightArmTransformation.mul (rotation); TransformGroup rightArmTransformationGroup = new TransformGroup (rightArmTransformation); // Cration de la jambe gauche Cylinder leftLeg = new Cylinder (0.85f, 15f); shapeAppearance = new Appearance ();
Programmer en java Page 455

Dao Issiaka- 3me anne SI

// Application d'une couleur violette shapeAppearance.setColoringAttributes ( new ColoringAttributes (0.4f, 0, 0.4f, defaultShade)); leftLeg.setAppearance (shapeAppearance); Transform3D leftLegTransformation = new Transform3D (); leftLegTransformation.setTranslation (new Vector3f (0.9f, -12.5f, 1)); // Cration d'une rotation pour donner l'allure de la marche rotation = new Transform3D (); rotation.rotX (-Math.PI / 25); // Multiplication des deux transformations pour les cumuler leftLegTransformation.mul (rotation); TransformGroup leftLegTransformationGroup = new TransformGroup (leftLegTransformation); // Cration de la jambe droite Cylinder rightLeg = new Cylinder (0.85f, 15f); rightLeg.setAppearance (shapeAppearance); Transform3D rightLegTransformation = new Transform3D (); rightLegTransformation.setTranslation (new Vector3f (-0.9f, -12.5f, 1)); // Cration d'une rotation pour donner l'allure de la marche rotation = new Transform3D (); rotation.rotX (Math.PI / 25); // Multiplication des deux transformations pour les cumuler rightLegTransformation.mul (rotation); TransformGroup rightLegTransformationGroup = new TransformGroup (rightLegTransformation); // Cration de la tte Sphere head = new Sphere (1.6f); shapeAppearance = new Appearance (); // Application d'une couleur peau shapeAppearance.setColoringAttributes ( new ColoringAttributes (1f, 0.8f, 0.6f, defaultShade)); head.setAppearance (shapeAppearance); Transform3D headTransformation = new Transform3D (); headTransformation.setTranslation (new Vector3f (0, 8, 0)); // Cration d'une dformation pour allonger la tte Transform3D scale = new Transform3D (); scale.setScale (new Vector3d (1, 2, 1)); // Multiplication des deux transformations pour les cumuler headTransformation.mul (scale); TransformGroup headTransformationGroup = new TransformGroup (headTransformation); // Cration du nez Sphere nose = new Sphere (0.5f); shapeAppearance = new Appearance (); // Application d'une couleur rouge shapeAppearance.setColoringAttributes ( new ColoringAttributes (1, 0, 0, defaultShade)); nose.setAppearance (shapeAppearance); Transform3D noseTransformation = new Transform3D (); noseTransformation.setTranslation (new Vector3f (0, 7.4f, 1.7f)); TransformGroup noseTransformationGroup = new TransformGroup (noseTransformation);

Programmer en java

Page 456

Dao Issiaka- 3me anne SI

// Cration du chapeau Cone hat = new Cone (2f, 4); shapeAppearance = new Appearance (); // Application d'une couleur orange shapeAppearance.setColoringAttributes ( new ColoringAttributes (1, 0.6f, 0, defaultShade)); hat.setAppearance (shapeAppearance); Transform3D hatTransformation = new Transform3D (); hatTransformation.setTranslation (new Vector3d (0, 11, 0)); TransformGroup hatTransformationGroup = new TransformGroup (hatTransformation); // Racine de l'arbre des objets reprsentant le clown Group clown = new Group (); // Construction de l'arbre leftArmTransformationGroup.addChild (leftArm); rightArmTransformationGroup.addChild (rightArm); leftLegTransformationGroup.addChild (leftLeg); rightLegTransformationGroup.addChild (rightLeg); headTransformationGroup.addChild (head); noseTransformationGroup.addChild (nose); hatTransformationGroup.addChild (hat); clown.addChild (body); clown.addChild (leftArmTransformationGroup); clown.addChild (rightArmTransformationGroup); clown.addChild (leftLegTransformationGroup); clown.addChild (rightLegTransformationGroup); clown.addChild (headTransformationGroup); clown.addChild (noseTransformationGroup); clown.addChild (hatTransformationGroup); return clown; } // Mthode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args) { new MainFrame (new Clown (), args, 200, 200); } }

Programmer en java

Page 457

Dao Issiaka- 3me anne SI

Figure 14. Arbre de la scne Clown La figure prcdente reprsente l'arbre de la scne cre par la mthode createSceneTree de la classe Clown. On y retrouve les 8 formes simples composant le clown auxquelles est applique une transformation.
La classe javax.media.j3d.ColoringAttributes

()

Cette classe drive des classes SceneGraphObject et NodeComponent. Une instance de la classe ColoringAttributes passe en paramtre la mthode setColoringAttributes () de la classe Appearance permet de modifier les attributs de couleur et le mode de nuance (shade) applicables une forme 3D. Consultez le tableau de choix des couleurs pour dterminer comment s'applique la couleur dfinie par cet attribut.
Champs
public public public public static static static static final final final final int int int int SHADE_FLAT SHADE_GOURAUD FASTEST NICEST

Ces constantes reprsentent le mode utilis pour colorer les facettes d'une forme 3D. SHADE_FLAT colore les facettes avec une couleur unie et SHADE_GOURAUD avec un dgrad rsultat de l'interpolation des diffrentes couleurs de ses sommets.
public public public public static static static static final final final final int int int int ALLOW_COLOR_READ ALLOW_COLOR_WRITE ALLOW_SHADE_MODEL_READ ALLOW_SHADE_MODEL_WRITE

Ces capacits permettent d'autoriser la lecture ou la modification de la couleur et du modle de nuance.


Constructeurs
public ColoringAttributes () public ColoringAttributes (float red, float green, float blue, int shadeModel) public ColoringAttributes (Color3f color, int shadeModel)

Programmer en java

Page 458

Dao Issiaka- 3me anne SI

Ces constructeurs crent une instance de la classe ColoringAttributes initialise avec la couleur (red, green, blue) ou color et le modle de nuance shadeModel (par dfaut gaux la couleur blanche et SHADE_GOURAUD).
Principales mthodes
public void getColor (Color3f color) public void setColor (Color3f color)

(capacit ALLOW_COLOR_READ) (capacit ALLOW_COLOR_WRITE)

public void setColor (float r, float g, float b) (capacit ALLOW_COLOR_WRITE)

Ces mthodes permettent d'interroger ou de modifier la couleur dfinie par cet attribut.
public int getShadeModel ()

(capacit ALLOW_SHADE_MODEL_READ)

public void setShadeModel (int shadeModel) (capacit ALLOW_SHADE_MODEL_WRITE)

Ces mthodes permettent d'interroger ou de modifier le modle de nuance dfini par cet attribut.
Exemples

Applets Clown, WaterGlass, LitApplet3D, Clock3D.


La classe javax.media.j3d.Material

Cette classe drive des classes SceneGraphObject et NodeComponent. Une instance de la classe Material passe en paramtre la mthode setMaterial () de la classe Appearance permet de modifier les couleurs utilises une forme 3D claire. Consultez le tableau de choix des couleurs pour dterminer comment s'applique cet attribut. Les couleurs dfinies par cette classe se combinent entre elles sous l'effet des diffrentes sources lumineuses.
Champs (constantes de capacit)
public static final int ALLOW_COMPONENT_READ public static final int ALLOW_COMPONENT_WRITE

Ces capacits permettent d'autoriser la lecture ou la modification des couleurs de cet attribut.
Constructeurs
public Material () public Material (Color3f ambientColor, Color3f emissiveColor, Color3f diffuseColor, Color3f specularColor, float shininess)

Ces constructeurs crent une instance de la classe Material initialise avec les couleurs ambientColor, emissiveColor, diffuseColor, specularColor et l'effet de brillance
Programmer en java Page 459

Dao Issiaka- 3me anne SI

shininess. Par dfaut ambientColor est gal (0.2,0.2,0.2), emissiveColor diffuseColor (1,1,1), specularColor (1,1,1) et shininess 64.

(0,0,0),

Principales mthodes
public void getEmissiveColor (Color3f color)

(capacit
ALLOW_COMPONENT_READ)

public void setEmissiveColor (Color3f color)

(capacit
ALLOW_COMPONENT_WRITE)

public void setEmissiveColor (float r, float g, (capacit float b) ALLOW_COMPONENT_WRITE)

Ces mthodes permettent d'interroger ou de modifier la couleur de cet attribut mise par une forme 3D. Sur une scne 3D non claire, cette couleur a le mme effet qu'un attribut de classe ColoringAttributes.
public void getAmbientColor (Color3f color)

(capacit
ALLOW_COMPONENT_READ)

public void setAmbientColor (Color3f color)

(capacit
ALLOW_COMPONENT_WRITE)

public void setAmbientColor (float r, float g, float b)

(capacit
ALLOW_COMPONENT_WRITE)

Ces mthodes permettent d'interroger ou de modifier la couleur d'ambiance de cet attribut rflchie par la lumire d'ambiance.
public void getDiffuseColor (Color3f color)

(capacit
ALLOW_COMPONENT_READ)

public void setDiffuseColor (Color3f color)

(capacit
ALLOW_COMPONENT_WRITE)

public void setDiffuseColor (float r, float g, float b) public void setDiffuseColor (float r, float g, float b, float a)

(capacit
ALLOW_COMPONENT_WRITE)

(capacit
ALLOW_COMPONENT_WRITE)

Ces mthodes permettent d'interroger ou de modifier la couleur de diffusion de cet attribut rflchie par les lumires de la scne.
public void getSpecularColor (Color3f color)

(capacit
ALLOW_COMPONENT_READ)

Programmer en java

Page 460

Dao Issiaka- 3me anne SI

public void setSpecularColor (Color3f color)

(capacit
ALLOW_COMPONENT_WRITE)

public void setSpecularColor (float r, float g, (capacit float b) ALLOW_COMPONENT_WRITE)

Ces mthodes permettent d'interroger ou de modifier la couleur de cet attribut donnant l'effet de spcularit. Cette couleur est utilise pour afficher un point de brillance sur une forme 3D.
public float getShininess ()

(capacit ALLOW_COMPONENT_READ)

public void setShininess (float shininess) (capacit ALLOW_COMPONENT_WRITE)

Ces mthodes permettent d'interroger ou de modifier l'effet de brillance dfinie par cet attribut. shininess est compris entre 1 (pas brillant) et 128 (trs brillant).
public boolean getLightingEnable ()

(capacit ALLOW_COMPONENT_READ)

public void setLightingEnable (boolean state) (capacit ALLOW_COMPONENT_WRITE)

Ces mthodes permettent d'interroger ou de modifier l'utilisation ou non de cet attribut. Si state est gal false, l'instance de classe Material est ignore.
Exemples

Applets LitApplet3D, LitPlane, SunEarthMoonMotion.


Les attributs d'affichage des facettes

Java 3D permet d'afficher une forme 3D de plusieurs faons :


Affichage des sommets de ses facettes avec des points Affichage des artes de ses facettes Remplissage de ses facettes

La classe PolygonAttributes permet de choisir entre ces trois modes. Les classes PointAttributes et LineAttributes permettent de modifier les attributs d'affichage des points reprsentant les sommets et ceux des artes des facettes. La couleur utilise pour les points, les artes ou le remplissage des facettes est choisie en respectant les rgles du tableau de choix des couleurs. Voici l'applet SphereConstruction drivant de la classe Applet3D. Cet exemple affiche une mme sphre avec les trois modes d'affichage :

Programmer en java

Page 461

Dao Issiaka- 3me anne SI

import import import import

javax.media.j3d.*; javax.vecmath.*; com.sun.j3d.utils.geometry.*; com.sun.j3d.utils.applet.MainFrame;

public class SphereConstruction extends Applet3D { // Mthode de la classe Applet3D outrepasse public BranchGroup createSceneTree () { // Racine de l'arbre des objets reprsents dans la scne 3D BranchGroup root = new BranchGroup (); // Cration d'une sphre affiche avec ses sommets Sphere spherePoints = new Sphere (0.25f); Appearance appearance = new Appearance (); PolygonAttributes polygon = new PolygonAttributes (PolygonAttributes.POLYGON_POINT, PolygonAttributes.CULL_NONE, 0); appearance.setPolygonAttributes (polygon); PointAttributes points = new PointAttributes (1.5f, true); appearance.setPointAttributes (points); spherePoints.setAppearance (appearance); Transform3D sphereTranslation = new Transform3D (); sphereTranslation.setTranslation (new Vector3f (-0.6f, 0, 0)); TransformGroup spherePointsTranslationGroup = new TransformGroup (sphereTranslation); // Cration d'une sphre affiche avec ses artes Sphere sphereLines = new Sphere (0.25f); appearance = new Appearance (); polygon = new PolygonAttributes (PolygonAttributes.POLYGON_LINE, PolygonAttributes.CULL_NONE, 0); appearance.setPolygonAttributes (polygon); LineAttributes lines = new LineAttributes (1f, LineAttributes.PATTERN_SOLID, true); appearance.setLineAttributes (lines); sphereLines.setAppearance (appearance); // Cration d'une sphre avec des attributs d'apparence par dfaut Sphere fullSphere = new Sphere (0.25f, new Appearance ()); sphereTranslation = new Transform3D (); sphereTranslation.setTranslation (new Vector3f (0.6f, 0, 0)); TransformGroup fullSphereTranslationGroup = new TransformGroup (sphereTranslation); // Construction de l'arbre de la scne 3D spherePointsTranslationGroup.addChild (spherePoints); fullSphereTranslationGroup.addChild (fullSphere); root.addChild (spherePointsTranslationGroup);
Programmer en java Page 462

Dao Issiaka- 3me anne SI

root.addChild (sphereLines); root.addChild (fullSphereTranslationGroup); return root; } // Mthode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args) { new MainFrame (new SphereConstruction (), args, 300, 100); }

Figure 15. Arbre de la scne SphereConstruction


La classe javax.media.j3d.PolygonAttributes

Cette classe drive des classes SceneGraphObject et NodeComponent. Une instance de la classe PolygonAttributes passe en paramtre la mthode setPolygonAttributes () de la classe Appearance permet de modifier le mode d'affichage et le mode d'limination des facettes d'une forme 3D.
Champs
public static final int POLYGON_POINT public static final int POLYGON_LINE public static final int POLYGON_FILL

Ces constantes reprsentent le mode d'affichage des facettes de la forme 3D. POLYGON_POINT n'affiche que les sommets, POLYGON_LINE les artes et POLYGON_FILL provoque le remplissage des facettes.
public static final int CULL_NONE public static final int CULL_BACK public static final int CULL_FRONT

Ces constantes indiquent les facettes liminer (cull) l'affichage de la forme 3D. CULL_NONE n'limine aucune facette, CULL_BACK limine les facettes orientes vers l'arrire et CULL_FRONT limine les facettes orientes vers l'observateur.
public public public public static static static static final final final final int int int int ALLOW_MODE_READ ALLOW_MODE_WRITE ALLOW_CULL_FACE_READ ALLOW_CULL_FACE_WRITE

Programmer en java

Page 463

Dao Issiaka- 3me anne SI

Ces capacits permettent d'autoriser la lecture ou la modification du mode d'affichage des facettes ou d'limination des facettes.
public public public public static static static static final final final final int int int int ALLOW_NORMAL_FLIP_READ ALLOW_NORMAL_FLIP_WRITE ALLOW_OFFSET_READ ALLOW_OFFSET_WRITE

Principaux constructeurs
public PolygonAttributes () public PolygonAttributes (int polygonMode, int cullFace, float polygonOffset)

Ces constructeurs crent une instance de la classe PolygonAttributes initialise avec le mode d'affichage polygonMode, le mode d'limination des facettes cullFace et le dcalage de facettes en profondeur polygonOffset (par dfaut gaux POLYGON_FILL, CULL_BACK et 0).
Principales mthodes
public int getPolygonMode ()

(capacit ALLOW_MODE_READ)

public void setPolygonMode (int polygonMode) (capacit ALLOW_MODE_WRITE)

Ces mthodes permettent d'interroger ou de modifier le mode d'affichage dfini par cet attribut. polygonMode peut tre gal POLYGON_POINT, POLYGON_LINE ou POLYGON_FILL.
public int getCullFace ()

(capacit ALLOW_CULL_FACE_READ)

public void setCullFace (int cullFace) (capacit ALLOW_CULL_FACE_WRITE)

Ces mthodes permettent d'interroger ou de modifier le mode d'limination des facettes dfinie par cet attribut. cullFace peut tre gal CULL_NONE, CULL_BACK ou CULL_FRONT.
Exemple

Applet SphereConstruction.
La classe javax.media.j3d.PointAttributes

Cette classe drive des classes SceneGraphObject et NodeComponent. Une instance de la classe PointAttributes passe en paramtre la mthode setPointAttributes () de la classe Appearance permet de modifier les attributs de trac des points d'une forme 3D quand son mode d'affichage utilise le dessin des sommets.
Champs (constantes de capacits)
public public public public static static static static final final final final int int int int ALLOW_SIZE_READ ALLOW_SIZE_WRITE ALLOW_ANTIALIASING_READ ALLOW_ANTIALIASING_WRITE

Programmer en java

Page 464

Dao Issiaka- 3me anne SI

Ces capacits permettent d'autoriser la lecture ou la modification de la taille des points et de l'utilisation de mthode d'antialiasing (anticrnelage) pour les dessiner.
Constructeurs
public PointAttributes () public PointAttributes (float pointSize, boolean pointAntialiasing)

Ces constructeurs crent une instance de la classe PointAttributes initialise avec la taille en pixel des points pointSize et l'utilisation de mthode d'antialiasing pointAntialiasing (par dfaut gaux 1 et false).
Principales mthodes
public float getPointSize ()

(capacit ALLOW_SIZE_READ)

public void setPointSize (float pointSize) (capacit ALLOW_SIZE_WRITE)

Ces mthodes permettent d'interroger ou de modifier la taille en pixel des point dfinie par cet attribut.
public boolean getPointAntialiasingEnable ()

(capacit
ALLOW_ANTIALIASING_READ)

public void setPointAntialiasingEnable (boolean state)

(capacit
ALLOW_ANTIALIASING_WRITE)

Ces mthodes permettent d'interroger ou de modifier l'utilisation de mthode d'antialiasing dfinie par cet attribut. Si state est gal true, les points seront dessins avec un contour adouci ce qui vite l'effet de crnelage.
Exemple

Applet SphereConstruction.
La classe javax.media.j3d.LineAttributes

Cette classe drive des classes SceneGraphObject et NodeComponent. Une instance de la classe LineAttributes passe en paramtre la mthode setLineAttributes () de la classe Appearance permet de modifier les attributs de trac des lignes d'une forme 3D quand son mode d'affichage utilise le dessin des artes.
Champs
public static final int PATTERN_SOLID public static final int PATTERN_DASH public static final int PATTERN_DOT public static final int PATTERN_DASH_DOT

Programmer en java

Page 465

Dao Issiaka- 3me anne SI

public static final int PATTERN_USER_DEFINED

Ces constantes reprsentent le type de trait utiliser pour tracer les artes.
public public public public public public static static static static static static final final final final final final int int int int int int ALLOW_WIDTH_READ ALLOW_WIDTH_WRITE ALLOW_PATTERN_READ ALLOW_PATTERN_WRITE ALLOW_ANTIALIASING_READ ALLOW_ANTIALIASING_WRITE

Ces capacits permettent d'autoriser la lecture ou la modification de l'paisseur des artes, du type de trait et de l'utilisation de mthode d'antialiasing (anticrnelage).
Constructeurs
public LineAttributes () public LineAttributes (float lineWidth, int linePattern, boolean lineAntialiasing)

Ces constructeurs crent une instance de la classe LineAttributes initialise avec l'paisseur des artes lineWidth, le type de trait linePattern et l'utilisation de mthode d'antialiasing lineAntialiasing (par dfaut gaux 1, PATTERN_SOLID et false).
Principales mthodes
public float getLineWidth ()

(capacit ALLOW_WIDTH_READ)

public void setLineWidth (float lineWidth) (capacit ALLOW_WIDTH_WRITE)

Ces mthodes permettent d'interroger ou de modifier l'paisseur des artes dfinie par cet attribut.
public int getLinePattern ()

(capacit ALLOW_PATTERN_READ)

public void setLinePattern (int linePattern) (capacit ALLOW_PATTERN_WRITE)

Ces mthodes permettent d'interroger ou de modifier le type de trait dfini par cet attribut. linePattern peut tre gal PATTERN_SOLID, PATTERN_DASH, PATTERN_DOT, PATTERN_DASH_DOT ou PATTERN_USER_DEFINED.
public boolean getLineAntialiasingEnable ()

(capacit
ALLOW_ANTIALIASING_READ)

public void setLineAntialiasingEnable (boolean state)

(capacit
ALLOW_ANTIALIASING_WRITE)

Programmer en java

Page 466

Dao Issiaka- 3me anne SI

Ces mthodes permettent d'interroger ou de modifier l'utilisation de mthode d'antialiasing dfinie par cet attribut. Si state est gal true, les artes seront dessines en vitant l'effet de crnelage.
Exemple

Applet SphereConstruction.
Les attributs de transparence et de rendu

Java 3D permet de rendre plus ou moins transparente une forme 3D en utilisant les attributs d'apparence de la classe TransparencyAttributes. Voici l'applet WaterGlass drivant de la classe Applet3D : cet exemple rutilise une forme de classe AxisShape et un cylindre avec des attributs de transparence pour crer une scne reprsentant un verre d'eau.

import import import import

javax.media.j3d.*; javax.vecmath.*; com.sun.j3d.utils.applet.MainFrame; com.sun.j3d.utils.geometry.*;

public class WaterGlass extends Applet3D { public BranchGroup createSceneTree () { // Racine de l'arbre des objets reprsents dans la scne 3D BranchGroup root = new BranchGroup (); // Cration du groupe reprsentant le verre d'eau Group waterGlass = createWaterGlass (); // Cration d'une rotation de -PI/6 autour de l'axe z et PI/4 autour de l'axe x Transform3D transform = new Transform3D (); transform.rotX (Math.PI / 4); Transform3D rot = new Transform3D (); rot.rotZ (-Math.PI / 6); // Multiplication des deux transformations pour les cumuler transform.mul (rot); TransformGroup transformGroup = new TransformGroup (transform); // Construction de l'arbre de la scne transformGroup.addChild (waterGlass);
Programmer en java Page 467

Dao Issiaka- 3me anne SI

root.addChild (transformGroup); return root; } // Cre les diffrentes formes du verre d'eau public Group createWaterGlass () { // Cration d'un verre partir de son profil AxisShape glass = new AxisShape (new Point2f [] {new Point2f (0, 0.5f), new Point2f (0.4f, 0.5f), new Point2f (0.4f, 0.7f), new Point2f (0.45f, 0.7f), new Point2f (0.45f, 0.65f), new Point2f (0, 0.65f)}, 16); Appearance appearance = new Appearance (); appearance.setColoringAttributes ( new ColoringAttributes (1, 1, 1, ColoringAttributes.SHADE_GOURAUD)); appearance.setTransparencyAttributes ( new TransparencyAttributes (TransparencyAttributes.BLENDED, 0.7f)); glass.setAppearance (appearance); // Cration d'une cylindre pour reprsenter l'eau Cylinder water = new Cylinder (0.4f, 1f); appearance = new Appearance (); appearance.setColoringAttributes ( new ColoringAttributes (.6f, .8f, 1, ColoringAttributes.SHADE_GOURAUD)); appearance.setTransparencyAttributes ( new TransparencyAttributes (TransparencyAttributes.BLENDED, 0.8f)); water.setAppearance (appearance); // Construction de l'arbre de la scne Group waterGlass = new Group (); waterGlass.addChild (water); waterGlass.addChild (glass); return waterGlass; } // Mthode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args) { new MainFrame (new WaterGlass (), args, 150, 150); } }

Programmer en java

Page 468

Dao Issiaka- 3me anne SI

Figure 16. Arbre de la scne WaterGlass


La classe javax.media.j3d.TransparencyAttributes

Cette classe drive des classes SceneGraphObject et NodeComponent. Une instance de la classe TransparencyAttributes passe en paramtre la mthode setTransparencyAttributes () de la classe Appearance permet de modifier la transparence d'une forme 3D. La valeur de transparence est inverse celle utilise pour le canal alpha dans le codage RGBA des couleurs Java : 0 correspond une opacit totale et 1 une transparence totale.
Champs
public public public public public static static static static static final final final final final int int int int int NONE BLENDED SCREEN_DOOR FASTEST NICEST

Ces constantes reprsentent le mode de transparence appliquer la forme 3D. NONE n'applique aucune transparence, BLENDED ralise l'effet de transparence en mlangeant (blend) la couleur de la forme 3D avec celle de l'arrire plan et SCREEN_DOOR en construisant une trame ayant la couleur de la forme 3D dont les trous laissent passer la couleur de l'arrire plan.
public public public public static static static static final final final final int int int int ALLOW_MODE_READ ALLOW_MODE_WRITE ALLOW_VALUE_READ ALLOW_VALUE_WRITE

Ces capacits permettent d'autoriser la lecture ou la modification du mode et de la valeur de transparence.


public static final int ALLOW_BLEND_FUNCTION_READ public static final int ALLOW_BLEND_FUNCTION_WRITE

Principaux constructeurs
public TransparencyAttributes () public TransparencyAttributes (int transparencyMode, float transparencyValue)

Programmer en java

Page 469

Dao Issiaka- 3me anne SI

Ces constructeurs crent une instance de la classe TransparencyAttributes initialise avec le mode de transparence transparencyMode et la valeur de transparence transparencyValue (par dfaut gaux NONE et 0).
Principales mthodes
public int getTransparencyMode () public void setTransparencyMode (int transparencyMode)

(capacit ALLOW_MODE_READ) (capacit


ALLOW_MODE_WRITE)

Ces mthodes permettent d'interroger ou de modifier le mode de transparence dfini par cet attribut. transparencyMode peut tre gal NONE, BLENDED, SCREEN_DOOR, FASTEST ou NICEST.
public float getTransparency () public void setTransparency (float transparencyValue)

(capacit ALLOW_VALUE_READ) (capacit


ALLOW_VALUE_WRITE)

Ces mthodes permettent d'interroger ou de modifier la valeur de transparence dfinie par cet attribut. transparencyValue est compris entre 0 (totalement opaque) et 1 (totalement transparent).
Exemple

Applet WaterGlass.
La classe javax.media.j3d.RenderingAttributes

Cette classe drive des classes SceneGraphObject et NodeComponent. Une instance de la classe RenderingAttributes passe en paramtre la mthode setRenderingAttributes () de la classe Appearance permet de modifier les attributs de rendu. Les deux attributs les plus intressants, ceux de visibilit et d'utilisation des couleurs des sommets ne sont pas disponibles pour les versions < 1.2 de Java 3D.
Principaux champs (constantes de capacits)
public public public public static static static static final final final final int int int int ALLOW_VISIBLE_READ ALLOW_VISIBLE_WRITE ALLOW_IGNORE_VERTEX_COLORS_READ ALLOW_IGNORE_VERTEX_COLORS_WRITE

Ces capacits permettent d'autoriser la lecture ou la modification de sa visibilit ou de l'utilisation des couleurs des sommets.
public public public public public public static static static static static static final final final final final final int int int int int int ALLOW_ALPHA_TEST_VALUE_READ ALLOW_ALPHA_TEST_VALUE_WRITE ALLOW_ALPHA_TEST_FUNCTION_READ ALLOW_ALPHA_TEST_FUNCTION_WRITE ALLOW_DEPTH_ENABLE_READ ALLOW_RASTER_OP_READ
Page 470

Programmer en java

Dao Issiaka- 3me anne SI

public static final int ALLOW_RASTER_OP_WRITE

Principal constructeur
public RenderingAttributes ()

Ces constructeurs crent une instance de la classe RenderingAttributes. Par dfaut, visible est gal true et ignoreVertexColors false.
Principales mthodes
public boolean getVisible ()

(capacit ALLOW_VISIBLE_READ)

public void setVisible (boolean visible) (capacit ALLOW_VISIBLE_WRITE)

Ces mthodes permettent d'interroger ou de modifier la visibilit dfinie par cet attribut. Si visible est gal false, la forme 3D n'est pas visible mais peut tre intercepte ou entrer en collision avec d'autres objets.
public boolean getIgnoreVertexColors (capacit () ALLOW_IGNORE_VERTEX_COLORS_READ) public void setIgnoreVertexColors (boolean ignoreVertexColors)

(capacit
ALLOW_IGNORE_VERTEX_COLORS_WRITE)

Ces mthodes permettent d'interroger ou de modifier l'utilisation des couleurs des sommets dfinie par cet attribut. Si ignoreVertexColors est gal true (false par dfaut), les couleurs des sommets ne seront plus prises en compte pour dterminer la couleur de la forme 3D.
Les attributs de texture

Une texture est une image applique sur la surface d'une forme 3D. Cette technique vite de dtailler de manire trs fine la construction gomtrique d'une forme 3D pour lui donner par exemple un aspect de matire (bois, tissu, pierre,...). L'application d'une texture, technique bien plus simple et rapide, donne des rsultats trs ralistes. Pour utiliser une texture sur une forme 3D en Java 3D, il faut dfinir des coordonnes de texture sur chacun des sommets de sa construction gomtrique et modifier ses attributs d'apparence avec des instances de la classe Texture et ventuellement de la classe TextureAttributes. Comme le montre la figure suivante, les coordonnes de texture permettent de spcifier comment appliquer sur une facette d'une forme 3D l'image dfinie par une instance de la classe Texture :

Programmer en java

Page 471

Dao Issiaka- 3me anne SI

Figure 17. Application d'une texture sur une facette d'une forme 3D Considrez l'image de la texture comme si elle tait affiche dans un repre de coordonnes (s,t) entre les points (0,0) et (1,1), correspondant sa largeur et sa hauteur en pixels. Les coordonnes de texture de chaque sommet d'une forme 3D indiquent un point (s,t) de l'image. Pour chaque facette, Java 3D utilise ces coordonnes pour extraire la portion d'image correspondante et l'appliquer sur la facette. Cette portion d'image est dforme pour s'adapter aux dimensions de la facette. La texture est rpte comme un motif si certaines coordonnes de texture (s,t) sont en dehors de l'intervalle [0,1] (mode de limite par dfaut WRAP). Les images utilises pour une texture peuvent provenir d'une image dessine en Java ou d'un fichier d'image. La classe TextureLoader permet de grer facilement le chargement de fichier et la cration d'une instance de classe Texture. Pour optimiser le traitement des textures, Java 3D requiert que la largeur et la hauteur des images soient une puissance de 2 (1, 2, 4, 8, 16,...).
Exemples d'images utilises pour la texture

wood.jpg

tweed.jpg brick.jpg grain.jpg

Les coordonnes de texture d'une construction gomtrique peuvent tre spcifies grce la mthode setTextureCoordinates () de la classe GeometryInfo. Les coordonnes de texture des classes de formes simples Box, Sphere, Cylinder et Cone ne sont dfinies que si la constante GENERATE_TEXTURE_COORDS est utilise dans le paramtre primflags de leur constructeur. Elles permettent d'appliquer une texture de la manire suivante :
CLASSE
Box

MODE D'APPLICATION DE LA TEXTURE Image de la texture sur chaque face.

Programmer en java

Page 472

Dao Issiaka- 3me anne SI

Sphere

Image de la texture sur la sphre.

Cylinder Image de la texture sur la partie cylindrique, et les disques bas et haut. Cone

Image de la texture sur la partie conique, et le disque infrieur.

Voici l'applet SimpleTexturedObjects drivant de la classe Applet3D : cet exemple recre la mme scne que l'applet SimpleObjects avec les formes simples utilisant des coordonnes de texture et des attributs d'apparence avec une texture. L'image de la texture peut tre modifie grce au paramtre ImageFile. Pour une utilisation avec la commande java, la valeur du paramtre est passe de la manire suivante :
java SimpleTexturedObjects ImageFile=tweed.jpg

L'arbre de cette scne 3D est le mme que celui de l'applet SimpleObjects.

import import import import import

javax.media.j3d.*; javax.vecmath.*; com.sun.j3d.utils.geometry.*; com.sun.j3d.utils.image.TextureLoader; com.sun.j3d.utils.applet.MainFrame;

public class SimpleTexturedObjects extends Applet3D { // Mthode de la classe Applet3D outrepasse public BranchGroup createSceneTree () { // Racine de l'arbre des objets reprsents dans la scne 3D BranchGroup root = new BranchGroup (); // Rcupration du nom de fichier de l'image utilise pour la texture // pass dans le paramtre ImageFile (wood.jpg par dfaut) // Par exemple : <param name="ImageFile" value="tweed.jpg"> pour une applet // ou ImageFile=tweed.jpg en paramtre de la commande java String imageFileName = getParameter ("ImageFile"); if (imageFileName == null) imageFileName = "wood.jpg"; // Cration d'une instance de texture avec l'image Appearance woodAppearance = new Appearance (); Texture texture = new TextureLoader (imageFileName, this).getTexture (); woodAppearance.setTexture (texture);

Programmer en java

Page 473

Dao Issiaka- 3me anne SI

// Instantiation des quatre classes de forme simple // Cration d'un paralllpipde Box box = new Box (0.3f, 0.2f, 0.2f, Primitive.GENERATE_TEXTURE_COORDS, woodAppearance); Transform3D boxTranslation = new Transform3D (); boxTranslation.setTranslation (new Vector3f (-0.4f, 0.4f, 0)); TransformGroup boxTranslationGroup = new TransformGroup (boxTranslation); // Cration d'une sphre Sphere sphere = new Sphere (0.3f, Primitive.GENERATE_TEXTURE_COORDS, woodAppearance); Transform3D sphereTranslation = new Transform3D (); sphereTranslation.setTranslation (new Vector3f (0.4f, 0.4f, 0)); TransformGroup sphereTranslationGroup = new TransformGroup (sphereTranslation); // Cration d'un cylindre Cylinder cylinder = new Cylinder (0.3f, 0.5f, Primitive.GENERATE_TEXTURE_COORDS, woodAppearance); Transform3D cylinderTransformation = new Transform3D (); cylinderTransformation.setTranslation (new Vector3f (-0.4f, -0.4f, 0)); // Cration d'une rotation pour mieux apercevoir la forme du cylindre Transform3D rotation = new Transform3D (); rotation.rotX (Math.PI / 6); // Multiplication des deux transformations pour les cumuler cylinderTransformation.mul (rotation); TransformGroup cylinderTransformationGroup = new TransformGroup (cylinderTransformation); // Cration d'un cne Cone cone = new Cone (0.3f, 0.5f, Primitive.GENERATE_TEXTURE_COORDS, woodAppearance); Transform3D coneTransformation = new Transform3D (); coneTransformation.setTranslation (new Vector3f (0.4f, -0.4f, 0)); coneTransformation.mul (rotation); TransformGroup coneTransformationGroup = new TransformGroup (coneTransformation); // Cration d'un fond blanc Background background = new Background (1, 1, 1); background.setApplicationBounds (new BoundingBox ()); // Construction de l'arbre de la scne 3D boxTranslationGroup.addChild (box); sphereTranslationGroup.addChild (sphere); cylinderTransformationGroup.addChild (cylinder); coneTransformationGroup.addChild (cone); root.addChild (boxTranslationGroup); root.addChild (sphereTranslationGroup); root.addChild (cylinderTransformationGroup); root.addChild (coneTransformationGroup); root.addChild (background); return root; } // Mthode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args)
Programmer en java Page 474

Dao Issiaka- 3me anne SI

{ new MainFrame (new SimpleTexturedObjects (), args, 150, 150); } }

La classe javax.media.j3d.Texture

Cette classe abstract drive des classes SceneGraphObject et NodeComponent. C'est la super classe des classes Texture2D et Texture3D dont une instance est passe en paramtre la mthode setTexture () de la classe Appearance pour modifier la texture utilise par une forme 3D. Cette classe dfinit l'image appliquer comme texture une forme 3D.
Champs
public public public public public public static static static static static static final final final final final final int int int int int int RGB RGBA INTENSITY LUMINANCE ALPHA LUMINANCE_ALPHA

Ces constantes reprsentent le format de l'image utilise par la texture. RGB et RGBA sont les formats les plus courants car ils utilisent telles quelles les couleurs des pixels de l'image pour la texture. Les autres peuvent tre intressants utiliser pour faire varier par exemple la transparence (format ALPHA) ou la luminosit (format LUMINANCE) de la forme 3D en fonction des valeurs des pixels de l'image.
public public public public static static static static final final final final int int int int ALLOW_ENABLE_READ ALLOW_ENABLE_WRITE ALLOW_IMAGE_READ ALLOW_IMAGE_WRITE

Ces capacits permettent d'autoriser la lecture ou la modification de l'application de la texture sur la forme 3D et de l'image de la texture.
public public public public public public static static static static static static final final final final final final int int int int int int ALLOW_SIZE_READ ALLOW_FORMAT_READ ALLOW_FILTER_READ ALLOW_MIPMAP_MODE_READ ALLOW_BOUNDARY_MODE_READ ALLOW_BOUNDARY_COLOR_READ

Principales mthodes
public boolean getEnable ()

(capacit ALLOW_ENABLE_READ)

public void setEnable (boolean state) (capacit ALLOW_ENABLE_WRITE)

Ces mthodes permettent d'interroger ou de modifier l'application de la texture sur la forme 3D dfinie par cet attribut. Si state est gal false, la texture est ignore.
public ImageComponent getImage (int level) public void setImage (int level, ImageComponent image)

(capacit ALLOW_IMAGE_READ) (capacit

Programmer en java

Page 475

Dao Issiaka- 3me anne SI

ALLOW_IMAGE_WRITE)

Ces mthodes permettent d'interroger ou de modifier l'image (ou les images) utilises pour la texture. Utilisez 0 pour level. La largeur et la hauteur de l'image doivent tre une puissance de 2 (1, 2, 4, 8, 16,...).
Exemples

Applets SimpleTexturedObjects, LitPlane, SunEarthMoonMotion.


La classe javax.media.j3d.Texture2D

Cette classe drive des classes SceneGraphObject, NodeComponent, Texture. Le moyen le plus simple d'instancier cette classe est d'utiliser la mthode getTexture () de la classe TextureLoader qui permet d'avoir une texture ayant une image avec les dimensions requises et un format donn.
La classe javax.media.j3d.TextureAttributes

Cette classe drive des classes SceneGraphObject et NodeComponent. Une instance de la classe TextureAttributes passe en paramtre la mthode setTextureAttributes () de la classe Appearance permet de modifier le mode d'application de la texture sur une forme 3D.
Champs
public public public public static static static static final final final final int int int int REPLACE DECAL BLEND MODULATE

Ces constantes reprsentent le mode d'application de la texture sur les facettes de la forme 3D. REPLACE utilise la texture la place de la couleur des facettes, DECAL applique la texture comme un dcalcomanie qui laisse apparatre la couleur des facettes sur les zones transparentes de la texture, BLEND mlange la texture avec la couleur renvoye par la mthode getTextureBlendColor () et MODULATE combine la texture avec la couleur des facettes ce qui permet de calculer l'effet d'clairage sur la forme 3D.
public static final int FASTEST public static final int NICEST

Ces constantes reprsentent le mode (le plus rapide ou celui donnant le meilleur aspect) appliquer la texture pour corriger l'effet de perspective.
public public public public static static static static final final final final int int int int ALLOW_MODE_READ ALLOW_MODE_WRITE ALLOW_BLEND_COLOR_READ ALLOW_BLEND_COLOR_WRITE

Ces capacits permettent d'autoriser la lecture ou la modification du mode d'application de la texture et de la couleur de mlange.
Programmer en java Page 476

Dao Issiaka- 3me anne SI

public public public public

static static static static

final final final final

int int int int

ALLOW_TRANSFORM_READ ALLOW_TRANSFORM_WRITE ALLOW_COLOR_TABLE_READ ALLOW_COLOR_TABLE_WRITE

Principaux constructeurs
public TextureAttributes () public TextureAttributes (int textureMode, Transform3D transform, Color4f textureBlendColor, int perspectiveCorrectionMode)

Ces constructeurs crent une instance de la classe TextureAttributes initialise avec le mode d'application de la texture textureMode et la couleur de mlange textureBlendColor. Par dfaut, textureMode est gal REPLACE, textureBlendColor au noir, transform la transformation identit et perspectiveCorrectionMode NICEST.
Principales mthodes
public int getTextureMode ()

(capacit ALLOW_MODE_READ)

public void setTextureMode (int textureMode) (capacit ALLOW_MODE_WRITE)

Ces mthodes permettent d'interroger ou de modifier le mode d'application de la texture dfini par cet attribut. textureMode peut tre gal REPLACE, MODULATE, DECAL ou BLEND.
public void getTextureBlendColor (Color4f textureBlendColor) public void setTextureBlendColor (Color4f textureBlendColor)

(capacit
ALLOW_BLEND_COLOR_READ)

(capacit
ALLOW_BLEND_COLOR_WRITE)

public void setTextureBlendColor (capacit (float r, float g, float b, float ALLOW_BLEND_COLOR_WRITE) a)

Ces mthodes permettent d'interroger ou de modifier la couleur avec laquelle la texture soit tre mlange quand le mode d'application de la texture est BLEND.
Exemples

Applets LitPlane, SunEarthMoonMotion.


La classe javax.media.j3d.ImageComponent

Cette classe abstract drive des classes SceneGraphObject et NodeComponent. C'est la super classe des classes d'image ImageComponent2D et ImageComponent3D utilises pour les textures et les fonds d'cran.
Principaux champs (constantes de capacits)
public static final int ALLOW_SIZE_READ public static final int ALLOW_FORMAT_READ public static final int ALLOW_IMAGE_READ
Programmer en java Page 477

Dao Issiaka- 3me anne SI

Ces capacits permettent d'autoriser la lecture de la taille, du format ou de l'image.


La classe javax.media.j3d.ImageComponent2D

Cette classe drive des classes SceneGraphObject, NodeComponent, ImageComponent et reprsente une image 2D utilise pour les fonds d'cran et les textures. Le moyen le plus simple d'instancier cette classe est d'utiliser les mthodes getImage () ou getScaledImage () de la classe TextureLoader.
La classe com.sun.j3d.utils.image.TextureLoader

Cette classe utilitaire permet de charger une image et de gnrer une instance de classe ImageComponent2D ou Texture partir de l'une des 4 sources suivantes :

un fichier d'image une URL (Uniformed Resource Locator) dsignant une image une instance de java.awt.Image une instance de java.awt.image.BufferedImage.

Les images provenant d'un fichier ou d'une URL sont gnres sans avoir s'occuper de la gestion asynchrone du chargement d'images en Java.
Principaux constructeurs
public public public public TextureLoader TextureLoader TextureLoader TextureLoader (java.awt.image.BufferedImage bufferedImage) (java.awt.Image image, java.awt.Component observer) (String fileName, java.awt.Component observer) (java.net.URL url, java.awt.Component observer)

public TextureLoader (java.awt.image.BufferedImage bufferedImage, String format) public TextureLoader (java.awt.Image image, String format, java.awt.Component observer) public TextureLoader (String fileName, String format, java.awt.Component observer) public TextureLoader (java.net.URL url, String format, java.awt.Component observer)

Ces constructeurs crent une instance de la classe TextureLoader qui charge une image partir des sources bufferedImage ou image, du fichier fileName ou de l'URL url. Pour information, Java supporte les formats GIF et JPEG, et partir du JDK 1.3 le format PNG. Le composant observer, instance de la classe java.awt.Component, peut tre par exemple une instance des classes Canvas3D, java.awt.Applet ou java.awt.Frame. Le format (par dfaut gal "RGBA") peut tre gal "RGBA", "RGBA4", "RGB5_A1", "RGB", "RGB4", "RGB5", "R3_G3_B2", "LUM8_ALPHA8", "LUM4_ALPHA4", "LUMINANCE" and "ALPHA", valeurs qui correspondent ceux utiliss par la classe ImageComponent.
Mthodes
public ImageComponent2D getImage () public ImageComponent2D getScaledImage (float xScale, float yScale) public ImageComponent2D getScaledImage (int width, int height)

Programmer en java

Page 478

Dao Issiaka- 3me anne SI

Ces mthodes renvoient l'instance de la classe ImageComponent2D correspondant l'image charge. xScale et yScale permettent d'appliquer un facteur d'chelle sur les dimensions de l'image. De mme, width et height permettent de modifier la taille finale de l'image.
public Texture getTexture ()

Renvoie l'instance de la classe Texture correspondant l'image charge. Si les dimensions de l'image ne sont pas une puissance de 2, un changement d'chelle est applique l'image pour respecter cette condition. Le format de la texture correspond au format de l'image charge (format de texture LUMINANCE pour un format d'image "LUMINANCE" par exemple).
Exemples

Applets SimpleTexturedObjects, LitPlane, SunEarthMoonMotion.

Programmer en java

Page 479

Dao Issiaka- 3me anne SI

Eclairage 3D
Activation Les diffrentes sources lumineuses Combinaison des sources lumineuses Les classes d'clairage

Aprs avoir appris comment crer des objets 3D et modifier leurs attributs d'apparence, ce chapitre prsente comment appliquer un clairage une scne 3D, pour lui donner une touche plus raliste.
Activation

Il suffit d'ajouter n'importe o dans l'arbre d'une scne 3D une instance de la classe Light pour activer l'clairage de cette scne. La couleur des objets sous clairage dpend de leurs attributs d'apparence. Les attributs de classe Material permettent d'obtenir un ne sont pas obligatoires pour que Java 3D puissent dterminer la couleur des diffrentes formes d'une scne 3D mais il est conseill de les utiliser pour un rendu plus raliste de vos objets. Le tableau suivant vous indique quelle sera la couleur d'une forme 3D en fonction de l'attribut d'apparence dominant (voir aussi le tableau de choix des couleurs qui permet de dterminer l'attribut dominant) :
Attribut d'apparence de la forme 3D Couleur de la forme 3D sous clairage Combinaison des couleurs de Material et des couleurs des diffrentes sources lumineuses Couleur de l'instance de ColoringAttributes. Mme effet avec ou sans clairage. Couleurs des sommets. Mme effet avec ou sans clairage.

Material

ColoringAttributes

Couleurs des sommets

Les diffrentes sources lumineuses Effets des sources lumineuses

Java 3D dfinit les quatre classes de sources lumineuses suivantes :


Classe Effet

Programmer en java

Page 480

Dao Issiaka- 3me anne SI

AmbientLight

Source lumineuse ambiante Cette lumire est utilise pour clairer un minimum les zones d'une scne 3D ne recevant aucune lumire des autres types de sources lumineuses. La couleur d'ambiance (couleur ambiantColor de la classe Material) des formes 3D rflchit cette lumire de manire uniforme. Source lumineuse unidirectionnelle Cette lumire rayonne dans une direction unique dir. Ceci correspond une approximation d'une source lumineuse ponctuelle situe une distance trs loigne, comme le soleil clairant une scne. Les couleurs de diffusion et de spcularit (couleurs diffuseColor et specularColor de la classe Material) des formes 3D rflchissent cette lumire en fonction de l'orientation de chacune des facettes par rapport la direction de la lumire. Toutes les facettes qui ne sont pas oriente vers la source lumineuse ne sont pas claires.
Source lumineuse ponctuelle Comme pour une ampoule, cette lumire rayonne partir d'un point pos de l'espace dans toutes les directions. De plus, son intensit diminue fur et mesure que l'on sloigne de ce type de source lumineuse. Les couleurs de diffusion et de spcularit (couleurs diffuseColor et specularColor de la classe Material) des formes 3D rflchissent cette lumire en
Page 481

DirectionalLight

PointLight

Programmer en java

Dao Issiaka- 3me anne SI

fonction de l'orientation de chacune des facettes. Spot Comme une source lumineuse ponctuelle, cette lumire rayonne partir d'un point pos de l'espace mais les directions des rayons sont conscrits dans un cne d'angle alpha et d'axe dir. Les couleurs de diffusion et de spcularit (couleurs diffuseColor et specularColor de la classe Material) des formes 3D rflchissent cette lumire en fonction de l'orientation de chacune des facettes.

SpotLight

Voici l'applet LightEffect drivant de la classe Applet3D : cet exemple permet de tester sur une sphre les diffrents types d'clairage dcrits ci-dessus, grce au paramtre LightClass. Ce paramtre doit prendre pour valeur le nom d'une des classes de source lumineuse. Pour une utilisation avec la commande java, la valeur du paramtre est passe de la manire suivante :
java LightEffect LightClass=SpotLight import import import import javax.media.j3d.*; javax.vecmath.*; com.sun.j3d.utils.applet.MainFrame; com.sun.j3d.utils.geometry.*;

public class LightEffect extends Applet3D { public BranchGroup createSceneTree () { // Racine de l'arbre des objets reprsents dans la scne 3D BranchGroup root = new BranchGroup (); // Cration d'une source lumineuse en fonction du paramtre LightClass // Par exemple : <PARAM NAME="LightClass" VALUE="AmbientLight"> pour une applet // ou LightClass=AmbientLight en paramtre de la commande java Light light = null; Color3f lightColor = new Color3f (1, 1, 0.5f); // jaune clair if ("AmbientLight".equals (getParameter ("LightClass"))) // Cration d'une source lumineuse d'ambiance light = new AmbientLight (lightColor); else if ( "DirectionalLight".equals (getParameter ("LightClass")) || getParameter ("LightClass") == null) // Cration d'une source lumineuse unidirectionnelle (utilise par dfaut) light = new DirectionalLight (lightColor,
Programmer en java Page 482

Dao Issiaka- 3me anne SI

new Vector3f (1, -1, -1)); // direction else if ("PointLight".equals (getParameter ("LightClass"))) // Cration d'une source lumineuse ponctuelle light = new PointLight (lightColor, new Point3f (-1, 1, 1), // position new Point3f (1f, 0, 0)); // attnuation else if ("SpotLight".equals (getParameter ("LightClass"))) // Cration d'une lumire spot light = new SpotLight (lightColor, // position new Point3f (-1, 1, 1), new Point3f (1f, 0, 0), // attnuation new Vector3f (1f, -1, -1), // direction (float)Math.PI / 4, // angle 92); // concentration // Changement de ces limites d'influence light.setInfluencingBounds (new BoundingSphere (new Point3d (), 10.0)); // Ajout de la lumire l'arbre de la scne root.addChild (light); // Cration d'un fond gris fonc Background background = new Background (0.2f, 0.2f, 0.2f); background.setApplicationBounds (new BoundingBox ()); root.addChild (background); // Ajout d'un objet root.addChild (createScene ()); return root; } public Node createScene () { return new Sphere (0.7f); } // Mthode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args) { new MainFrame (new LightEffect (), args, 80, 85); } }

Figure 18. Arbre de la scne LightEffect Le symbole est utilis pour les feuilles reprsentant des sources lumineuses dans l'arbre d'une scne 3D. Comme le fait la classe LitPlane, vous pouvez tester les effets des diffrentes sources lumineuses sur des objets d'une autre forme, en outrepassant la mthode createScene () dans une classe drive de LightEffect.

Programmer en java

Page 483

Dao Issiaka- 3me anne SI

Les sources lumineuses permettent d'clairer une scne mais n'ont pas de reprsentation physique l'cran. En cas de besoin, c'est vous d'ajouter votre scne une forme 3D supplmentaire reprsentant la source lumineuse (par exemple une sphre est utilise pour le soleil dans l'applet SunEarthMoonMotion).
Couleur des facettes claires

La couleur finale de chaque facette d'une forme 3D est le rsultat de la combinaison des effets des lumires dcrits ci-dessus et des couleurs de l'attribut d'apparence de classe Material de cette forme :
couleur emissiveColor + couleurs de toutes les sources lumineuses ambiantes rflchies par la couleur ambiantColor couleurs de toutes les autre sources lumineuses rflchies par les couleurs diffuseColor et
specularColor

= couleur de la facette

Chacune des composantes Rouge, Vert, Bleue s'additionne pour donner la couleur finale de la facette. L'intensit lumineuse de la couleur est dtermine chaque sommet d'une facette grce sa normale et la direction des sources lumineuses ce sommet. Une fois calcule la couleur chaque sommet, la facette est colore par interpolation de ces diffrentes couleurs (sauf si le modle de remplissage de l'attribut de classe ColoringAttributes est SHADE_FLAT). L'effet des sources lumineuses ponctuelles et des spots sur une forme 3D, plane ou non, sera beaucoup mieux rendu si cette forme est dcoupe en un grand nombre de facettes : ceci va augmenter le nombre de sommets et de normales et par consquent le nombre et la prcision des calculs de couleurs. Le modle d'clairage utilis par Java 3D ne calcule pas les ombres des objets les uns sur les autres ni leur reflet (pas de ray tracing ou d'algorithmes du mme genre) : Si vous tenez rendre une touche trs raliste vos scnes sous Java 3D, c'est vous de calculer les ombres et d'ajouter la scne 3D les objets reprsentant ces ombres.
Eclairage et texture

Pour clairer une forme 3D sur laquelle est applique une texture, il faut ajouter ses attributs d'apparence une instance de la classe TextureAttributes dont le mode d'application est MODULATE. Comme ce mode provoque la combinaison de la texture avec la couleur des facettes, il vaut mieux que les couleurs des attributs de classe Material de la forme 3D soient blanches ou grises, sauf pour faire des effets spciaux (le constructeur par dfaut de la classe Material suffit gnralement).

Programmer en java

Page 484

Dao Issiaka- 3me anne SI

L'applet LitPlane suivante drive de la classe LightEffect et permet de tester l'effet des diffrents types d'clairage sur un plan dont le nombre de sommets par ct peut varier en fonction du paramtre precision. Une texture peut tre applique sur ce plan en mode MODULATE en utilisant l'image passe par le paramtre imageFile (par exemple grain.jpg), ce qui permet de combiner la texture avec le rsultat du calcul de l'clairage. Les captures d'cran suivantes vous montre l'effet d'une source lumineuse de classe SpotLight sur un plan en fonction du nombre de ses sommets (et de ses normales) : avec une prcision de 2x2 et 5x5 facettes, l'effet du spot est bien visible mais les facettes se devinent (en fait, il y a deux fois plus de facettes car elles sont triangulaires). Si une texture est applique sur le plan, les facettes sous-jacentes se devinent beaucoup moins mme avec une prcision faible. Pour information, si vous utilisez une prcision gale 1, vous obtiendrez un plan dcrit par deux facettes triangulaires dont les sommets sont les coins du plan. La lumire spot n'clairant ici aucun coin du plan, le plan sera noir rsultat de l'interpolation par Java 3D de la couleur noire calcule avec les normales chaque sommet.

java LitPlane java LitPlane java LitPlane LightClass=SpotLight LightClass=SpotLight LightClass=SpotLight Precision=2 Precision=5 Precision=10

java LitPlane LightClass=SpotLight Precision=2 ImageFile=grain.jpg import import import import import

java LitPlane java LitPlane LightClass=SpotLight LightClass=SpotLight Precision=10 Precision=5 ImageFile=grain.jpg ImageFile=grain.jpg

javax.media.j3d.*; javax.vecmath.*; com.sun.j3d.utils.applet.MainFrame; com.sun.j3d.utils.image.TextureLoader; com.sun.j3d.utils.geometry.*;

public class LitPlane extends LightEffect


Programmer en java Page 485

Dao Issiaka- 3me anne SI

{ // Mthode de la classe LightEffect outrepasse public Node createScene () { // Cration d'une rotation de -PI / 6 autour de l'axe z et de l'axe x Transform3D transform = new Transform3D (); transform.rotX (-Math.PI / 6); Transform3D rot = new Transform3D (); rot.rotZ (-Math.PI / 6); // Multiplication des deux transformations pour les cumuler transform.mul (rot); TransformGroup transformGroup = new TransformGroup (transform); // Ajout d'un plan avec un nombre de facettes variables String precisionParam = getParameter ("Precision"); int precision = precisionParam == null ? 10 : Integer.parseInt (precisionParam); Shape3D plane = createPlane (1, precision); Appearance appearance = new Appearance (); appearance.setMaterial (new Material ()); // Blanc // Cration d'une instance de texture avec l'image du paramtre ImageFile String imageFileName = getParameter ("ImageFile"); if (imageFileName != null) { Texture texture = new TextureLoader (imageFileName, this).getTexture (); appearance.setTexture (texture); // Combinaison entre la texture et la couleur de la facette TextureAttributes textureAttributes = new TextureAttributes (); textureAttributes.setTextureMode (TextureAttributes.MODULATE); appearance.setTextureAttributes (textureAttributes); } plane.setAppearance (appearance); transformGroup.addChild (plane); return transformGroup; } // Cre une surface plane carre dont les deux points opposes ont // pour coordonnes (-size / 2, -size / 2, 0) et (size / 2, size / 2, 0) // et dont les coordonnes de texture se rpartissent entre (0,0) et (size,size) // Cette surface est constitue de precision * precision facettes public Shape3D createPlane (float size, int precision) { float halfSize = size / 2; // Calcul des sommets d'un carr construit avec des bandes float [] coords = new float [2 * 3 * (precision + 1) * precision]; float [] texCoords = new float [2 * 2 * (precision + 1) * precision]; for (int i = 0, k = 0, l = 0; i < precision; i ++) for (int j = 0; j < precision + 1; j ++) { coords [k++] = size / precision * i - halfSize; coords [k++] = size / precision * j - halfSize; coords [k++] = 0; coords [k++] = size / precision * (i + 1) - halfSize; coords [k++] = size / precision * j - halfSize; coords [k++] = 0;
Programmer en java Page 486

Dao Issiaka- 3me anne SI

texCoords texCoords texCoords texCoords

[l++] [l++] [l++] [l++]

= = = =

size size size size

* * * *

i / precision; j / precision; (i + 1) / precision; j / precision;

} // Tableau du nombre de sommets par bande int [] stripCounts = new int [precision]; for (int i = 0; i < precision; i ++) stripCounts [i] = 2 * (precision + 1); GeometryInfo geometryInfo = new GeometryInfo (GeometryInfo.TRIANGLE_STRIP_ARRAY); geometryInfo.setCoordinates (coords); geometryInfo.setStripCounts (stripCounts); geometryInfo.setTextureCoordinates2 (texCoords); // Gnration des normales new NormalGenerator ().generateNormals (geometryInfo); // Cration d'une forme 3D avec ce plan return new Shape3D (geometryInfo.getIndexedGeometryArray ()); } // Mthode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args) { new MainFrame (new LitPlane (), args, 150, 150); } }

Figure 19. Arbre de la scne LitPlane


Combinaison des sources lumineuses

Une scne 3D est souvent claire par au moins deux sources lumineuses : une source lumineuse ambiante de classe AmbientLight et une source lumineuse d'une autre classe qui claire la scne. La source ambiante permet d'apercevoir la forme de tous les objets et vite que certains restent compltement dans l'ombre. Il est possible de multiplier les sources lumineuses pour mettre en scne vos objets, avec par exemple des lumires de diffrentes couleurs. L'applet LitApplet3D drivant de la classe Applet3D permet d'clairer les autres applets de classe Applet3D dcrites prcdemment pour les tester sous l'effet de trois sources lumineuses : une source lumineuse ambiante et deux sources lumineuses unidirectionnelles de couleurs et de directions diffrentes. La classe LitApplet3D dfinie aussi une mthode checkMaterial () qui attribue des attributs de classe Material aux formes 3D visualises qui n'en ont pas. La classe de l'applet clairer est spcifie grce au paramtre Applet3DClass. Pour une utilisation avec la commande java, la valeur du paramtre est passe de la manire suivante :
Programmer en java Page 487

Dao Issiaka- 3me anne SI

java LitApplet3D Applet3DClass=AxisShapeDemo Cette applet fonctionne avec tous les applets de classe Applet3D

de ce manuel mais l'clairage n'a d'effet que sur les scnes 3D utilisant des formes 3D qui ne dfinissent pas de couleur pour leur sommets, comme : SimpleObjects, AxisShapeDemo, HelloWorld3D, ObjectFileDemo, Clown, SphereConstruction et WaterGlass.
Exemples de scne 3D claires par l'applet LitApplet3D

AxisShapeDemo

ObjectFileDemo

Clown import import import import

SphereConstruction

javax.media.j3d.*; javax.vecmath.*; java.util.Enumeration; com.sun.j3d.utils.applet.MainFrame;

public class LitApplet3D extends Applet3D { public BranchGroup createSceneTree () { // Racine de l'arbre des objets reprsents dans la scne 3D BranchGroup root = new BranchGroup (); // Rcupration de la classe d'applet passe dans le paramtre Applet3DClass // Par exemple : <PARAM NAME="Applet3DClass" VALUE="Clown"> pour une applet // ou Applet3DClass=Clown en paramtre de la commande java String applet3DClassName = getParameter ("Applet3DClass"); if (applet3DClassName != null) try {

Programmer en java

Page 488

Dao Issiaka- 3me anne SI

// Instantion de la classe d'applet et cration de l'arbre de la scne 3D Applet3D subApplet = (Applet3D)Class.forName (applet3DClassName).newInstance (); Group subTree = subApplet.createSceneTree (); checkMaterial (subTree); root.addChild (subTree); } catch (Exception e) { System.err.println ( "Can't instantiate Applet3DClass " + applet3DClassName + "\n" + e); } // Ajout des sources lumineuses addLights (root); return root; } public void addLights (Group root) { BoundingSphere influencingBounds = new BoundingSphere (new Point3d (), 100.0); // Cration de trois sources lumineuses Light light1 = new DirectionalLight (new Color3f (1, 0.75f, 0.25f), // jaune new Vector3f (1, -0.5f, -0.5f)); light1.setInfluencingBounds (influencingBounds); root.addChild (light1); Light light2 = new DirectionalLight (new Color3f (0.8f, 0.8f, 1f), // bleu new Vector3f (-1, -0.5f, -0.5f)); light2.setInfluencingBounds (influencingBounds); root.addChild (light2); Light light3 = new AmbientLight (new Color3f (0.4f, 0.4f, 0.4f)); light3.setInfluencingBounds (influencingBounds); root.addChild (light3); } // Vrifie que toutes les formes 3D ont un attribut d'apparence Material public void checkMaterial (Node node) { if (node instanceof Group) // Enumeration de tous les enfants de ce noeud for (Enumeration enumeration = ((Group)node).getAllChildren (); enumeration.hasMoreElements (); ) checkMaterial ((Node)enumeration.nextElement ()); else if (node instanceof Shape3D) { Appearance appearance = ((Shape3D)node).getAppearance (); if (appearance == null) appearance = new Appearance (); if (appearance.getMaterial () == null) if (appearance.getColoringAttributes () == null) appearance.setMaterial (new Material ()); else
Programmer en java Page 489

Dao Issiaka- 3me anne SI

{ // Cration d'un attribut Material partir de la couleur donne Color3f color = new Color3f (); ((ColoringAttributes)appearance.getColoringAttributes ()).getColor (color); Color3f ambientColor = new Color3f (color.x * .2f, color.y * .2f, color.z * .2f); appearance.setMaterial ( new Material (ambientColor, new Color3f (), color, color, 64)); } ((Shape3D)node).setAppearance (appearance); } } // Methode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args) { new MainFrame (new LitApplet3D (), args, 150, 150); } }

Figure 20. Arbre de la scne LitApplet3D avec la scne de la classe AxisShapeDemo


Les classes d'clairage La classe javax.media.j3d.Light

Cette classe abstract drive des classes SceneGraphObject, Node, Leaf. C'est la super classe des classes de sources lumineuses AmbientLight, DirectionalLight, PointLight. Toutes les sources lumineuses ont une limite d'influence (influencing bounds) null par dfaut. Cette limite permet d'optimiser les calculs de Java 3D en lui vitant de prendre en compte tout moment toutes les sources lumineuses sur les scnes 3D de grande taille. Il faut obligatoirement dterminer cette limite pour que la source lumineuse est un effet.
Champs (constantes de capacit)
public public public public public public static static static static static static final final final final final final int int int int int int ALLOW_STATE_READ ALLOW_STATE_WRITE ALLOW_COLOR_READ ALLOW_COLOR_WRITE ALLOW_INFLUENCING_BOUNDS_READ ALLOW_INFLUENCING_BOUNDS_WRITE

Programmer en java

Page 490

Dao Issiaka- 3me anne SI

Ces capacits permettent d'autoriser la lecture ou la modification de l'tat allum ou teint de cette source lumineuse, de sa couleur et de ses limites d'influence.
public static final int ALLOW_SCOPE_READ public static final int ALLOW_SCOPE_WRITE

Principales mthodes
public boolean getEnable ()

(Capacit ALLOW_STATE_READ)

public void setEnable (boolean state) (Capacit ALLOW_STATE_WRITE)

Ces mthodes permettent d'interroger l'tat allum (true) ou teint (false) de cette source lumineuse ou de modifier son tat.
public void getColor (Color3f color) (Capacit ALLOW_COLOR_READ) public void setColor (Color3f color) (Capacit ALLOW_COLOR_WRITE)

Ces mthodes permettent d'interroger ou de modifier la couleur de cette source lumineuse.


public Bounds getInfluencingBounds ()

(Capacit
ALLOW_INFLUENCING_BOUNDS_READ)

public BoundingLeaf getInfluencingBoundingLeaf ()

(Capacit
ALLOW_INFLUENCING_BOUNDS_READ)

public void setInfluencingBounds (Bounds (Capacit region) ALLOW_INFLUENCING_BOUNDS_WRITE) public void setInfluencingBoundingLeaf (BoundingLeaf region)

(Capacit
ALLOW_INFLUENCING_BOUNDS_WRITE)

Ces mthodes permettent d'interroger ou de modifier la limite d'influence de cette source lumineuse.
La classe javax.media.j3d.AmbientLight

Cette classe drive des classes SceneGraphObject, Node, Leaf, Light et reprsente une source lumineuse ambiante que rflchit de manire uniforme la couleur d'ambiance (couleur ambiantColor de la classe Material) des formes 3D.
Constructeurs
public AmbientLight () public AmbientLight (Color3f color) public AmbientLight (boolean lightOn, Color3f color)

Ces constructeurs permettent de crer une source lumineuse ambiante initialise avec la couleur color et dans l'tat allum ou teint lightOn (par dfaut, gaux la couleur blanche et true).
Programmer en java Page 491

Dao Issiaka- 3me anne SI

Exemples

Applets LightEffect, LitApplet3D.


La classe javax.media.j3d.DirectionalLight

Cette classe drive des classes SceneGraphObject, Node, Leaf, Light et reprsente une source lumineuse unidirectionnelle que rflchissent les couleurs de diffusion et de spcularit (couleurs diffuseColor et specularColor de la classe Material) des formes 3D. Le vecteur indiquant la direction de cette lumire est orient dans le sens des rayons lumineux.
Champs (constantes de capacit)
public static final int ALLOW_DIRECTION_READ public static final int ALLOW_DIRECTION_WRITE

Ces capacits permettent d'autoriser la lecture ou la modification la direction de cette source lumineuse.
Constructeurs
public DirectionalLight () public DirectionalLight (Color3f color, Vector3f dir) public DirectionalLight (boolean lightOn, Color3f color, Vector3f dir)

Ces constructeurs permettent de crer une source lumineuse unidirectionnelle initialise avec la couleur color, de direction dir et dans l'tat allum ou teint lightOn (par dfaut, gaux la couleur blanche, au vecteur (0,0,-1) et true).
Principales mthodes
public void getDirection (Vector3f dir) public void setDirection (float x, float y, float z)

(Capacit ALLOW_DIRECTION_READ) (Capacit


ALLOW_DIRECTION_WRITE)

public void setDirection (Vector3f dir)

(Capacit
ALLOW_DIRECTION_WRITE)

Ces mthodes permettent d'interroger ou de modifier la direction de cette source lumineuse.


Exemples

Applets LightEffect, LitApplet3D.


La classe javax.media.j3d.PointLight

Cette classe drive des classes SceneGraphObject, Node, Leaf, Light et reprsente une source lumineuse ponctuelle que rflchissent les couleurs de diffusion et de spcularit (couleurs diffuseColor et specularColor de la classe Material) des formes 3D.

Programmer en java

Page 492

Dao Issiaka- 3me anne SI

Champs (constantes de capacit)


public public public public static static static static final final final final int int int int ALLOW_POSITION_READ ALLOW_POSITION_WRITE ALLOW_ATTENUATION_READ ALLOW_ATTENUATION_WRITE

Ces capacits permettent d'autoriser la lecture ou la modification la position de cette source lumineuse et son attnuation.
Constructeurs
public PointLight () public PointLight (Color3f color, Point3f pos, Point3f attenuation) public PointLight (boolean lightOn, Color3f color, Point3f pos, Point3f attenuation)

Ces constructeurs permettent de crer une source lumineuse ponctuelle initialise avec la couleur color, de position pos, d'attnuation attenuation et dans l'tat allum ou teint lightOn. Par dfaut, color est gale la couleur blanche, pos au point (0,0,0), attenuation (1,0,0) et lightOn true.
Principales mthodes
public void getPosition (Point3f position) public void setPosition (float x, float y, float z)

(Capacit ALLOW_POSITION_READ) (Capacit


ALLOW_POSITION_WRITE)

public void setPosition (Point3f position)

(Capacit
ALLOW_POSITION_WRITE)

Ces mthodes permettent d'interroger ou de modifier la position de cette source lumineuse.


public void getAttenuation (Point3f attenuation) public void setAttenuation (float constant, float linear, float quadratic) public void setAttenuation (Point3f attenuation)

(Capacit ALLOW_ATTENUATION_READ) (Capacit


ALLOW_ATTENUATION_WRITE)

(Capacit
ALLOW_ATTENUATION_WRITE)

Ces mthodes permettent d'interroger ou de modifier l'attnuation de cette source lumineuse. Les trois champs x, y et z du paramtre attenuation correspondent aux paramtres constant, linear et quadratic, et sont utiliss pour dterminer l'attnuation de la lumire en fonction de la distance d entre la position de la source lumineuse et un point de l'espace avec la formule suivante :
1 / (constant + linear * d + quadratic * d * d) Si linear et quadratic sont gaux 0 la lumire ne s'attnue pas

avec l'loignement de la

position de la source lumineuse.

Programmer en java

Page 493

Dao Issiaka- 3me anne SI

Exemple

Applet LightEffect, SunEarthMoonMotion.


La classe javax.media.j3d.SpotLight

Cette classe drive des classes SceneGraphObject, Node, Leaf, Light, PointLight et reprsente une source lumineuse spot que rflchissent les couleurs de diffusion et de spcularit (couleurs diffuseColor et specularColor de la classe Material) des formes 3D.
Champs (constantes de capacit)
public public public public public public static static static static static static final final final final final final int int int int int int ALLOW_DIRECTION_WRITE ALLOW_DIRECTION_READ ALLOW_SPREAD_ANGLE_WRITE ALLOW_SPREAD_ANGLE_READ ALLOW_CONCENTRATION_WRITE ALLOW_CONCENTRATION_READ

Ces capacits permettent d'autoriser la lecture ou la modification la direction de l'axe du cne d'clairage de ce spot, l'angle de ce cne et la concentration de la lumire du spot.
Constructeurs
public SpotLight () public SpotLight (Color3f color, Point3f pos, Point3f attenuation, Vector3f dir, float spreadAngle, float concentration) public SpotLight (boolean lightOn, Color3f color, Point3f pos, Point3f attenuation, Vector3f dir, float spreadAngle, float concentration)

Ces constructeurs permettent de crer un spot initialis avec la couleur color, de position pos, d'attnuation attenuation et dans l'tat allum ou teint lightOn. dir donne la direction de l'axe du cne d'clairage, spreadAngle l'angle de ce cne et concentration la concentration de la lumire du spot. Par dfaut, color est gale la couleur blanche, pos au point (0,0,0), attenuation (1,0,0), dir (-1,0,0), spreadAngle PI et concentration 0 et lightOn true.
Principales mthodes
public void getDirection (Vector3f dir) public void setDirection (float x, float y, float z)

(Capacit ALLOW_DIRECTION_READ) (Capacit


ALLOW_DIRECTION_WRITE)

public void setDirection (Vector3f dir)

(Capacit
ALLOW_DIRECTION_WRITE)

Ces mthodes permettent d'interroger ou de modifier la direction de l'axe du cne d'clairage de ce spot.
public float getSpreadAngle ()

(Capacit ALLOW_SPREAD_ANGLE_READ)

Programmer en java

Page 494

Dao Issiaka- 3me anne SI

public void setSpreadAngle (float spreadAngle)

(Capacit
ALLOW_SPREAD_ANGLE_WRITE)

Ces mthodes permettent d'interroger ou de modifier l'angle du cne d'clairage de ce spot. spreadAngle est l'angle en radians entre l'axe du cne et le bord du cne.
public float getConcentration ()

(Capacit
ALLOW_CONCENTRATION_READ)

public void setConcentration (float concentration)

(Capacit
ALLOW_CONCENTRATION_WRITE)

Ces mthodes permettent d'interroger ou de modifier la concentration de la lumire de ce spot. concentration est compris entre 0 et 127. Plus cette valeur est grande, moins la lumire du spot est uniforme du centre la priphrie du cne d'clairage.
Exemple

Applet LightEffect.

Programmer en java

Page 495

Dao Issiaka- 3me anne SI

Animation 3D
Interaction Animation Un exemple complet : Du soleil la lune Plus loin avec Java 3D...

Ce dernier chapitre prsente comment animer une scne 3D, suite aux interactions avec l'utilisateur ou en dfinissant le mouvement des objets.
Interaction Comportement et stimulus

Java 3D permet d'afficher des images statiques mais fournit aussi un ensemble de mcanismes d'interaction simples mettre en oeuvre pour permettre d'animer une scne 3D. Toutes les classes grant les interactions drivent de la classe Behavior qui dcrit un comportement en rponse un ou plusieurs stimuli de classe WakeupCriterion. Une fois paramtr un noeud de comportement, il suffit de l'ajouter l'arbre d'une scne 3D pour le rendre actif. Pour votre information, voici la hirarchie des classes de stimuli disponibles dans Java 3D :
java.lang.Object o javax.media.j3d.WakeupCondition javax.media.j3d.WakeupAnd javax.media.j3d.WakeupAndOfOrs javax.media.j3d.WakeupOr javax.media.j3d.WakeupOrOfAnd javax.media.j3d.WakeupCriterion javax.media.j3d.WakeupOnAWTEvent

Raction un vnement AWT (souris, clavier) Raction aprs l'coulement d'une dure Raction aprs l'affichage d'un nombre d'images Raction la collision de deux objets

javax.media.j3d.WakeupOnElapsedTime

javax.media.j3d.WakeupOnElapsedFrames

javax.media.j3d.WakeupOnCollisionEntry javax.media.j3d.WakeupOnCollisionMovement javax.media.j3d.WakeupOnCollisionExit javax.media.j3d.WakeupOnTransformChange

Raction la modification d'un groupe de

Programmer en java

Page 496

Dao Issiaka- 3me anne SI

transformation
javax.media.j3d.WakeupOnBehaviorPost

Raction un stimulus d'un autre comportement Raction l'activation/dsactivation d'un comportement

javax.media.j3d.WakeupOnActivation javax.media.j3d.WakeupOnDeactivation

javax.media.j3d.WakeupOnViewPlatformEntry Raction l'entre ou la javax.media.j3d.WakeupOnViewPlatformExit

sortie d'une vue dans une zone d'une scne 3D Raction l'entre ou la sortie d'une zone de la scne 3D

javax.media.j3d.WakeupOnSensorEntry javax.media.j3d.WakeupOnSensorExit

Les quatre classes WakeupAnd, WakeupAndOfOrs, WakeupOr et WakeupOrOfAnd permettent de combiner entre eux les diffrents stimuli pour crer des conditions plus complexes. Pour dcrire un comportement particulier, une classe drive de Behavior doit implmenter les mthodes suivantes :
1. Mthode initialize () : dans cette mthode, il faut notamment appeler la mthode wakeupOn (WakeupCondition criteria) en prcisant en paramtre quels sont les stimuli auxquels cette classe veut ragir. La mthode initialize () est invoque automatiquement une fois qu'un noeud de classe Behavior est vivant, c'est--dire au moment o l'arbre auquel il appartient est rattach un univers. 2. Mthode processStimulus (java.util.Enumeration criteria) : cette mthode est invoque automatiquement quand survient un stimulus respectant les conditions passes la mthode wakeupOn (). La mthode processStimulus () dcrit les actions entreprendre suite la liste de stimuli reus dans le paramtre criteria. Finalement, la mthode wakeupOn () doit tre rappele si la mthode processStimulus () doit tre rappele suite un nouveau stimulus. Le plus souvent cette mthode modifie les proprits des autres noeuds de l'arbre de la scne : par exemple, en rponse au mouvement de la souris, une classe de comportement peut modifier un groupe de transformation pour dplacer des objets ou en rponse la collision de deux objets, elle peut modifier la gomtrie d'une forme 3D pour simuler une dformation.

Ces deux mthodes n'tant pas invoques par Java 3D dans des threads spars, leur traitement ne doit pas tre trop long pour ne pas bloquer Java 3D. Comparativement aux sources lumineuses, les comportements dfinissent une zone limite d'activation (scheduling bounds), null par dfaut. Un comportement n'est actif qu'au moment o sa zone d'activation a une intersection avec celle de l'instance courante de la classe ViewPlatform. Il faut obligatoirement dterminer la zone limite du comportement pour l'activer.

Programmer en java

Page 497

Dao Issiaka- 3me anne SI

Tous les noeuds dont les proprits sont modifies par un comportement doivent avoir les capacits adquats. Java 3D fournit les classes de comportement prdfini suivantes :
java.lang.Object o javax.media.j3d.SceneGraphObject javax.media.j3d.Node javax.media.j3d.Leaf javax.media.j3d.Behavior javax.media.j3d.Billboard javax.media.j3d.Interpolator com.sun.j3d.utils.behaviors.keyboard.Ke yNavigatorBehavior javax.media.j3d.LOD class javax.media.j3d.DistanceLOD com.sun.j3d.utils.behaviors.mouse.Mouse Behavior com.sun.j3d.utils.behaviors.mouse .MouseRotate com.sun.j3d.utils.behaviors.mouse .MouseTranslate com.sun.j3d.utils.behaviors.mouse .MouseZoom com.sun.j3d.utils.behaviors.picking.Pic kMouseBehavior com.sun.j3d.utils.behaviors.picki ng.PickRotateBehavior com.sun.j3d.utils.behaviors.picki ng.PickTranslateBehavior com.sun.j3d.utils.behaviors.picki ng.PickZoomBehavior

Les classes du package com.sun.j3d.utils.behaviors.keyboard grent les interactions avec le clavier, et celles du package com.sun.j3d.utils.behaviors.mouse et com.sun.j3d.utils.behaviors.picking les interactions avec la souris. Ces classes sont intressantes utiliser non seulement pour simplifier la programmation des interactions mais aussi parce qu'elles tablissent des comportements standards pour toutes les applications interactives Java 3D :

Figure 21. Interactions avec la souris

Figure 22. Interactions avec le clavier

Programmer en java

Page 498

Dao Issiaka- 3me anne SI

Ces figures indiquent sur quel type de transformation (translations dans les 3 directions, rotations autour des axes x et y ou Identit) agissent les dplacements de souris ou les touches du clavier. Voici l'applet MouseApplet3D drivant de la classe LitApplet3D. Cette applet permet d'interagir sur toutes les scnes 3D dcrites par les classes de ce manuel, en ajoutant la scne illumine trois comportements de classe MouseRotate, MouseTranslate et MouseZoom. Ceux-ci modifient la transformation du groupe mouseTransform en fonction des mouvements de la souris (bouton enfonc) pour obtenir un point de vue diffrent sur la scne. La classe de l'applet manipuler est spcifie grce au paramtre Applet3DClass. Pour une utilisation avec la commande java, la valeur du paramtre est passe de la manire suivante :
java MouseApplet3D Applet3DClass=AxisShapeDemo import import import import javax.media.j3d.*; javax.vecmath.*; com.sun.j3d.utils.behaviors.mouse.*; com.sun.j3d.utils.applet.MainFrame;

public class MouseApplet3D extends LitApplet3D { public BranchGroup createSceneTree () { // Racine de l'arbre des objets reprsents dans la scne 3D BranchGroup root = new BranchGroup (); // Groupe de transformation sur lequel agisse les comportements TransformGroup mouseTransform = new TransformGroup (); mouseTransform.setCapability (TransformGroup.ALLOW_TRANSFORM_WRITE); mouseTransform.setCapability (TransformGroup.ALLOW_TRANSFORM_READ); BoundingSphere schedulingBounds = new BoundingSphere (new Point3d (), 100.0); // Cration des trois comportements ragissant aux mouvements de la souris MouseBehavior rotate = new MouseRotate (mouseTransform); rotate.setSchedulingBounds (schedulingBounds); MouseBehavior translate = new MouseTranslate (mouseTransform); translate.setSchedulingBounds (schedulingBounds); MouseBehavior zoom = new MouseZoom (mouseTransform); zoom.setSchedulingBounds (schedulingBounds); // Cration de la scne 3D avec les lumires // Rappel : La classe d'applet visualise est passe par le paramtre Applet3DClass BranchGroup subTree = super.createSceneTree (); // Construction de l'arbre root.addChild (rotate); root.addChild (translate); root.addChild (zoom); root.addChild (mouseTransform); mouseTransform.addChild (subTree); return root; } // Mthode main () pour permettre d'utiliser cette classe
Programmer en java Page 499

Dao Issiaka- 3me anne SI

// comme applet ou comme application public static void main (String [] args) { new MainFrame (new MouseApplet3D (), args, 150, 150); } }

Figure 23. Arbre de la scne MouseApplet3D avec la scne de la classe AxisShapeDemo Le symbole est utilis pour les feuilles reprsentant un comportement dans l'arbre d'une scne 3D. Gnralement, un noeud de comportement est un enfant du groupe qu'il modifie ou du groupe parent le plus proche (ici les noeuds sont des enfants du groupe ) et dsigne par une flche le noeud qu'il modifie. Vous noterez qu'ici le groupe de transformation sur lequel agissent les comportements est un parent de la forme 3D de classe AxisShape mais aussi des trois sources lumineuses. C'est--dire que la transformation modifie l'orientation et la position de la forme 3D mais aussi des sources lumineuses.
La classe javax.media.j3d.Behavior

Cette classe abstract drive des classes SceneGraphObject, Node, Leaf. C'est la super classe de toutes les classes de comportement.
Principales mthodes
public abstract void initialize ()

Cette mthode est invoque automatiquement une fois que ce noeud est vivant. Son implmentation doit notamment appeler la mthode wakeupOn () pour prciser quels sont les stimuli auxquels cette classe veut ragir.
public abstract void processStimulus (java.util.Enumeration criteria)

Cette mthode est invoque automatiquement quand survient un stimulus respectant les conditions voulues. criteria est une numration d'instances de classe WakeupCondition.
protected void wakeupOn (WakeupCondition criteria)

Modifie les stimuli auxquels ragit ce comportement. La mthode processStimulus () sera invoque la prochaine fois que les stimuli de criteria surviendront.
public Bounds getSchedulingBounds ()
Programmer en java Page 500

Dao Issiaka- 3me anne SI

public BoundingLeaf getSchedulingBoundingLeaf () public void setSchedulingBounds (Bounds region) public void setSchedulingBoundingLeaf (BoundingLeaf boundingLeaf)

Ces mthodes permettent d'interroger ou de modifier les limites de la zone limite o ce comportement est actif. Par dfaut, cette zone est gale null. Pour que le comportement soit actif, il faut que le noeud boundingLeaf ait t ajout l'arbre de la scne.
public void postId (int postId)

Dclenche un stimulus auquel les autres comportements lis peuvent ragir.


public boolean getEnable () public void setEnable (boolean state)

Ces mthodes permettent d'interroger ou de modifier l'tat actif ou inactif de ce comportement.


La classe javax.media.j3d.WakeupCondition

Cette classe abstract reprsente un stimulus ou un ensemble de stimuli.


Mthodes
public java.util.Enumeration allElements () public java.util.Enumeration triggeredElements ()

Ces mthodes renvoient une numration des stimuli de classe WakeupCriterion de cet ensemble. La seconde mthode ne renvoie que la liste des stimuli qui ont provoqu l'appel la mthode processStimulus () de la classe Behavior.
La classe javax.media.j3d.WakeupCriterion

Cette classe abstract drive de la classe WakeupCondition. C'est la super classe des classes de stimuli.
Mthode
public boolean hasTriggered ()

Renvoie true si ce stimulus a provoqu l'appel la mthode processStimulus () de la classe Behavior.


La classe com.sun.j3d.utils.behaviors.mouse.MouseBehavior

Cette classe abstract drive des classes SceneGraphObject, Node, Leaf, Behavior. C'est la super classe des classes MouseRotate, MouseTranslate et MouseZoom qui dfinissent les interactions avec les mouvements de la souris. Ces classes permettent de modifier le point de vue sur une scne 3D en appliquant une rotation (avec la classe MouseRotate) ou une translation (en x et y pour la classe MouseTranslate et en z pour la classe MouseZoom) sur un groupe de transformation parent de cette scne. Il est possible de cumuler ces trois comportements sur un mme groupe de transformation, comme dans l'applet MouseApplet3D.

Programmer en java

Page 501

Dao Issiaka- 3me anne SI

Principales mthodes
public TransformGroup getTransformGroup () public void setTransformGroup (TransformGroup transformGroup)

Ces mthodes permettent d'interroger ou de modifier le groupe de transformation sur lequel agit ce comportement.
La classe com.sun.j3d.utils.behaviors.mouse.MouseRotate

Cette classe drive des classes SceneGraphObject, Node, Leaf, Behavior, MouseBehavior. Elle permet de crer un comportement de rotation en rponse un dplacement de la souris, bouton (gauche) enfonc. La rotation est applique au groupe de transformation associ, qui doit avoir les capacits ALLOW_TRANSFORM_READ et ALLOW_TRANSFORM_WRITE. Une rotation autour de l'axe y est applique en rponse un dplacement de la souris vers la gauche ou la droite, et une rotation autour de l'axe x est applique en rponse un dplacement dans l'autre direction.
Principaux constructeurs
public MouseRotate () public MouseRotate (TransformGroup transformGroup)

Ces constructeurs permettent de crer un comportement agissant sur le groupe de transformation transformGroup (null par dfaut).
Principales mthodes
public public public public double getXFactor () double getYFactor () void setFactor (double factor) void setFactor (double xFactor, double yFactor)

Ces mthodes permettent d'interroger ou de modifier les facteurs de multiplication appliqus chaque dplacement de la souris, pour augmenter ou diminuer le pas de rotation autour des axes x et y. xFactor s'applique la rotation autour de l'axe y et yFactor la rotation autour de l'axe x.
public void transformChanged (Transform3D transform)

Cette mthode peut tre outrepasse dans une classe drive pour ragir aux transformations successives. transform contient la transformation actuellement applique.
Exemple

Applet MouseApplet3D.
La classe com.sun.j3d.utils.behaviors.mouse.MouseTranslate

Cette classe drive des classes SceneGraphObject, Node, Leaf, Behavior, MouseBehavior. Elle permet de crer un comportement de translation en x et y en rponse un dplacement de la souris, bouton droit enfonc (ou bouton de la souris et touche pomme enfoncs sous Mac OS). La translation est applique au groupe de transformation associ, qui doit avoir les capacits ALLOW_TRANSFORM_READ et ALLOW_TRANSFORM_WRITE.
Programmer en java Page 502

Dao Issiaka- 3me anne SI

Principaux constructeurs
public MouseTranslate () public MouseTranslate (TransformGroup transformGroup)

Ces constructeurs permettent de crer un comportement agissant sur le groupe de transformation transformGroup (null par dfaut).
Principales mthodes
public public public public double getXFactor () double getYFactor () void setFactor (double factor) void setFactor (double xFactor, double yFactor)

Ces mthodes permettent d'interroger ou de modifier les facteurs de multiplication appliqus chaque dplacement de la souris, pour augmenter ou diminuer le pas de translation le long des axes x et y.
public void transformChanged (Transform3D transform)

Cette mthode peut tre outrepasse dans une classe drive pour ragir aux transformations successives. transform contient la transformation actuellement applique.
Exemple

Applet MouseApplet3D.
La classe com.sun.j3d.utils.behaviors.mouse.MouseZoom

Cette classe drive des classes SceneGraphObject, Node, Leaf, Behavior, MouseBehavior. Elle permet de crer un comportement de translation en z en rponse un dplacement de la souris vers le haut ou le bas, bouton (gauche) et touche ALT enfoncs, ce qui rapproche ou loigne une scne 3D. La translation est applique au groupe de transformation associ, qui doit avoir les capacits ALLOW_TRANSFORM_READ et ALLOW_TRANSFORM_WRITE.
Principaux constructeurs
public MouseZoom () public MouseZoom (TransformGroup transformGroup)

Ces constructeurs permettent de crer un comportement agissant sur le groupe de transformation transformGroup (null par dfaut).
Principales mthodes
public double getFactor () public void setFactor (double factor)

Ces mthodes permettent d'interroger ou de modifier le facteur de multiplication applique chaque dplacement de la souris, pour augmenter ou diminuer le pas de translation le long de l'axe z.
public void transformChanged (Transform3D transform)

Programmer en java

Page 503

Dao Issiaka- 3me anne SI

Cette mthode peut tre outrepasse dans une classe drive pour ragir aux transformations successives. transform contient la transformation actuellement applique.
Exemple

Applet MouseApplet3D.
La classe com.sun.j3d.utils.behaviors.keyboard.KeyNavigatorBehavior

Cette classe drive des classes SceneGraphObject, Node, Leaf, Behavior. Elle permet de crer un comportement qui rpond aux touches du clavier en modifiant la transformation du groupe de transformation associ, qui doit avoir les capacits ALLOW_TRANSFORM_READ et ALLOW_TRANSFORM_WRITE.
Constructeur
public KeyNavigatorBehavior (TransformGroup transformGroup)

Cre un comportement agissant sur le groupe de transformation transformGroup.


Animation Comportement d'animation et oprateur alpha

Une animation est un type de comportement qui modifie une scne 3D de manire prdtermine en fonction du temps coul. Bien que la classe WakeupOnElapsedTime puisse tre utilise comme stimulus pour raliser une animation, Java 3D fournit un ensemble de classes qui permettent de raliser la plupart des animations beaucoup plus facilement. Les classes drives de la classe d'animation Interpolator permettent d'effectuer des animations qui modifient la couleur d'une forme 3D ou un groupe de transformation pour dplacer ou faire tourner des formes 3D. Un comportement d'animation utilise un oprateur alpha de classe Alpha pour dterminer comment doit voluer dans le temps l'animation. Un oprateur alpha utilise la courbe suivante alpha = f (t) comme base, modifie par les paramtres de la classe Alpha :

Figure 24. Oprateur alpha La valeur alpha est comprise entre 0 et 1 et respectent les phases suivantes :

Une phase initiale d'une dure de triggerTime + phaseDelay ms.


Page 504

Programmer en java

Dao Issiaka- 3me anne SI

Pour chaque cycle qui suit : o Une phase montante d'une dure de increasingAlphaDuration ms, suivi d'un palier de alphaAtOneDuration ms. increasingAlphaRampDuration permet d'adoucir l'acclration et la dclration en dbut et en fin de phase montante. Ces phases sont prises en compte si le bit INCREASING_ENABLE du mode de l'oprateur alpha est vrai. o Une phase descendante d'une dure de decreasingAlphaDuration ms, suivi d'un palier de alphaAtZeroDuration ms. decreasingAlphaRampDuration permet d'adoucir l'acclration et la dclration en dbut et en fin de phase descendante. Ces phases sont prises en compte si le bit DECREASING_ENABLE du mode de l'oprateur alpha est vrai.

Suivant le choix et la valeur des diffrentes phases, vous pouvez obtenir un grand choix de courbes, comme par exemple : Paramtres utiliss par les 3 courbes (les paramtres non cits sont gaux 0) :

Courbe 1 (obtenue avec le constructeur par dfaut, new Alpha ()) :


o o o mode=INCREASING_ENABLE increasingAlphaDuration=1000 (1 s) loopCount=-1 (cycles indtermins) mode=DECREASING_ENABLE decreasingAlphaDuration=1000 alphaAtZeroDuration=500 loopCount=2 (2 cycles) mode=INCREASING_ENABLE | DECREASING_ENABLE increasingAlphaDuration=1000 increasingAlphaRampDuration=500 decreasingAlphaDuration=1000 decreasingAlphaRampDuration=500 loopCount=-1 (cycles indtermins)

Courbe 2 :
o o o o

Courbe 3 (mouvement oscillatoire) :


o o o o o o

Figure 25. Exemples d'oprateur alpha

La valeur de l'oprateur alpha est utilise par les classes d'animation comme facteur d'interpolation entre deux valeurs initiale et finale, 0 correspondant la valeur initiale et 1 la valeur finale. Par exemple :

Si alpha est utilis comme facteur d'interpolation d'un angle compris entre 0 et 2 PI, vous obtenez un angle de rotation qui varie dans le temps. En recopiant cet angle variable dans la transformation d'un groupe de transformation , vous obtenez une animation de rotation pour tous les enfants du groupe . Ce type d'animation est implmente par la classe RotationInterpolator. Si alpha est utilis comme facteur d'interpolation des couleurs noir et blanc, vous obtenez une couleur grise plus ou moins fonce dans le temps. En recopiant cette couleur dans un attribut d'apparence de classe Material, vous obtenez une animation modifiant la couleur

Programmer en java

Page 505

Dao Issiaka- 3me anne SI

de toutes les formes 3D qui rfrence cet attribut d'apparence. Ce type d'animation est implmente par la classe ColorInterpolator.

Pour tester l'effet des diffrentes paramtres utiliss pour construire la courbe d'un oprateur alpha, vous pouvez tester l'applet AlphaTest dcrite avec la classe Alpha. Java 3D fournit un ensemble de classes d'animation appartenant aux packages et com.sun.j3d.utils.behaviors.interpolators dont voici la hirarchie :
javax.media.j3d java.lang.Object o javax.media.j3d.SceneGraphObject javax.media.j3d.Node javax.media.j3d.Leaf javax.media.j3d.Behavior javax.media.j3d.Interpolator javax.media.j3d.ColorInterpolator com.sun.j3d.utils.behaviors.inter polators.KBSplinePathInterpolator com.sun.j3d.utils.behaviors .interpolators. KBRotPosScaleSplinePathInte rpolator javax.media.j3d.PathInterpolator javax.media.j3d.PositionPat hInterpolator javax.media.j3d.RotationPat hInterpolator javax.media.j3d.RotPosPathI nterpolator javax.media.j3d.RotPosScale PathInterpolator javax.media.j3d.PositionInterpola tor javax.media.j3d.RotationInterpola tor javax.media.j3d.ScaleInterpolator javax.media.j3d.SwitchValueInterp olator com.sun.j3d.utils.behaviors.inter polators.TCBSplinePathInterpolato r com.sun.j3d.utils.behaviors .interpolators. RotPosScaleTCBSplinePathInt erpolator javax.media.j3d.TransparencyInter polator

Les formes 3D dpendant d'un comportement d'animation sont mises jour rgulirement par Java 3D pour donner l'effet d'animation. Vous n'avez pas vous soucier du taux de rafrachissement des animations : celui-ci peut varier en fonction de la puissance de calcul disponible sur votre machine un moment donn.

Programmer en java

Page 506

Dao Issiaka- 3me anne SI

Voici l'applet TextTranslation drivant de la classe Applet3D : cet exemple utilise un comportement d'animation de classe PositionInterpolator pour faire dfiler un texte de plusieurs lignes l'cran. Une rotation finale autour de l'axe x est ensuite applique pour obtenir un effet de perspective. Le texte affich est un ensemble de formes 3D utilisant une construction gomtrique de classe Text3D avec le texte de chaque ligne.

import import import import import

java.util.StringTokenizer; java.awt.Font; javax.media.j3d.*; javax.vecmath.*; com.sun.j3d.utils.applet.MainFrame;

public class TextTranslation extends Applet3D { public BranchGroup createSceneTree () { Group textGroup = new Group (); Font3D font = new Font3D (new Font ("Helvetica", Font.PLAIN, 2), new FontExtrusion ()); Point3f position = new Point3f (); BoundingBox bounds = new BoundingBox (); Point3d lower = new Point3d (); Point3d upper = new Point3d (); double maxWidth = 0; // Enumration des lignes du texte for (StringTokenizer tokens = new StringTokenizer (getText (), "\n"); tokens.hasMoreTokens (); position.y -= 3f) { String currentText = tokens.nextToken (); // Ajout des lignes qui ont autre chose que des blancs if (currentText.trim ().length () > 0) { Text3D textGeometry = new Text3D (font, currentText, position, Text3D.ALIGN_CENTER, Text3D.PATH_RIGHT); // Calcul du texte le plus large pour l'afficher entirement l'cran textGeometry.getBoundingBox (bounds); bounds.getLower (lower); bounds.getUpper (upper); if (maxWidth < upper.x - lower.x) maxWidth = upper.x - lower.x; // Ajout du texte au groupe textGroup.addChild (new Shape3D (textGeometry)); } }
Programmer en java Page 507

Dao Issiaka- 3me anne SI

// Animation du texte en translation le long de l'axe y TransformGroup textAnimationGroup = new TransformGroup (); textAnimationGroup.setCapability (TransformGroup.ALLOW_TRANSFORM_WRITE); // Transformation de l'axe x en l'axe y => rotation autour de z Transform3D axisTransformation = new Transform3D (); axisTransformation.rotZ (-Math.PI / 2); // alpha de dure variable suivant la longueur du texte Alpha alpha = new Alpha (-1, (int)-position.y / 2 * 1000); PositionInterpolator animation = new PositionInterpolator (alpha, textAnimationGroup, axisTransformation, 3, position.y - 20); animation.setSchedulingBounds (new BoundingSphere (new Point3d (), 10000)); // Rotation de -PI / 3 autour de l'axe x pour obtenir un effet de perspective Transform3D finalTransformation = new Transform3D (); finalTransformation.rotX (-Math.PI / 3); // Mise l'chelle en fonction du texte le plus large finalTransformation.setScale (1.5 / maxWidth); TransformGroup finalTransformationGroup = new TransformGroup (finalTransformation); // Construction de l'animation utilisant le texte BranchGroup root = new BranchGroup (); root.addChild (finalTransformationGroup); finalTransformationGroup.addChild (textAnimationGroup); textAnimationGroup.addChild (animation); textAnimationGroup.addChild (textGroup); return root; } public String getText () { // Construction du texte avec la table des matires du manuel // (mettre un blanc dans les lignes vides pour qu'elles soient prises en compte) return "JAVA 3D\n \n" + "D\u00e9marrer en Java 3D\n" + "Un premier exemple\n" + "Principes 3D\n" + "Les classes de bases\n__\n \n" + "OBJETS 3D\n \n" + "Les formes de base\n" + "Les constructions g\u00e9om\u00e9triques\n" + "Les fonds d'\u00e9cran\n" + "L'importation de sc\u00e8nes 3D\n__\n \n" + "LES ATTRIBUTS D'APPARENCE\n \n" + "Les diff\u00e9rents attributs\n" + "Les attributs de couleur\n" + "Les attributs d'affichage des facettes\n" + "Les attributs de transparence et de rendu\n" + "Les attributs de texture\n__\n \n" + "ECLAIRAGE 3D\n \n" + "Activation\n" + "Les diff\u00e9rentes sources lumineuses\n" + "Combinaison des sources lumineuses\n" + "Les classes d'\u00e9clairage\n__\n \n"
Programmer en java Page 508

Dao Issiaka- 3me anne SI

+ + + + + + }

"ANIMATION 3D\n \n" "Interaction\n" "Animation\n" "L'importation de sc\u00e8nes 3D\n" "Un exemple complet : Du soleil \u00e0 la lune\n" "Plus loin avec Java 3D...\n__\n";

// Mthode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args) { new MainFrame (new TextTranslation (), args, 300, 150); } }

Figure 26. Arbre de la scne TextTranslation Le symbole est utilis pour les feuilles reprsentant un comportement d'animation dans l'arbre d'une scne 3D. Comme pour un noeud de comportement , un noeud d'animation est gnralement un enfant du groupe qu'il modifie ou du groupe parent le plus proche (ici le noeud est un enfant du groupe qu'il modifie). A partir de la version 1.2 de Java 3D, il est possible de n'utiliser qu'une seule forme 3D pour tout le texte en utilisant la mthode addGeometry () de la classe Shape3D. Le groupe de transformation modifi par un comportement d'animation doit tre indpendant et ddi uniquement ce comportement. Une nouvelle transformation est calcule chaque mise jour de l'animation sans tenir compte de l'ancienne transformation. Dans l'exemple TextTranslation, si vous associez une animation l'autre groupe de transformation enfant du groupe (sans crer un second groupe ddi au comportement d'animation), sa rotation initiale sera perdue ds la premire mise jour de l'animation pour tre remplace par la translation calcule.
La classe javax.media.j3d.Interpolator

Cette classe abstract drive des classes SceneGraphObject, Node, Leaf, Behavior. C'est la super classe de toutes les classes d'animation notamment PositionInterpolator,
Programmer en java Page 509

Dao Issiaka- 3me anne SI

RotationInterpolator, ScaleInterpolator, ColorInterpolator et TransparencyInterpolator et aussi de la classe javax.media.j3d.PathInterpolator et des classes du package com.sun.j3d.utils.behaviors.interpolators qui permettent de

crer des comportements d'animation pour parcourir un chemin (path) constitu d'un ensemble de points. La classe Interpolator mmorise l'oprateur alpha utilis pour les animations. N'oubliez pas de dterminer la zone limite sur laquelle l'animation est active avec la mthode setSchedulingBounds (), hrite de la classe Behavior.
Principales mthodes
public Alpha getAlpha () public void setAlpha (Alpha alpha)

Ces mthodes permettent d'interroger ou de modifier l'oprateur alpha. setAlpha (null) provoque l'arrt de l'animation.
La classe javax.media.j3d.Alpha

Cette classe drive des classes SceneGraphObject, NodeComponent et reprsente un oprateur alpha qui dcrit comment volue dans le temps la valeur renvoye par la mthode value (). Cette valeur comprise entre 0 et 1 est utilise pour faire varier les comportements d'animation. Toutes les mthodes qui permettent de modifier les paramtres d'un oprateur alpha ne sont pas cites, car les diffrents constructeurs suffisent gnralement pour programmer un oprateur.
Champs
public static final int INCREASING_ENABLE public static final int DECREASING_ENABLE

Ces constantes dterminent quelles phases montante et/ou descendante doit utiliser cet oprateur.
Constructeurs
public Alpha () public Alpha (int loopCount, int mode, long triggerTime, long phaseDelayDuration, long increasingAlphaDuration, long increasingAlphaRampDuration, long alphaAtOneDuration, long decreasingAlphaDuration, long decreasingAlphaRampDuration, long alphaAtZeroDuration) public Alpha (int loopCount, long triggerTime, long phaseDelayDuration, long increasingAlphaDuration, long increasingAlphaRampDuration, long alphaAtOneDuration) public Alpha (int loopCount, long increasingAlphaDuration)

Ces constructeurs permettent de crer une instance d'oprateur alpha. mode peut tre gal INCREASING_ENABLE ou DECREASING_ENABLE ou une combinaison de ces deux constantes
Programmer en java Page 510

Dao Issiaka- 3me anne SI

avec l'oprateur |. loopCount est gal au nombre de cycles appliquer ou -1 pour une infinit. finit. Les diffrentes phases ont une dure mesure en milliseconde et permettent de paramtrer la courbe de l'oprateur alpha. alpha Par dfaut, loopCount est gal -1, mode INCREASING_ENABLE, triggerTime 0, phaseDelayDuration 0, increasingAlphaDuration 1000, increasingAlphaRampDuration 0, alphaAtOneDuration 0, decreasingAlphaDuration 0, decreasingAlphaRampDuration 0 et alphaAtZeroDuration 0.
Principales mthodes
public float value () public float value (long atTime)

Ces mthodes renvoient la valeur comprise entre 0 et 1 de cet oprateur alpha au moment prsent ou au moment atTime. Elles sont appeles par les classes d'animation pour obtenir un facteur d'interpolation tion entre deux valeurs initiale et finale.
public boolean finished ()

Renvoie true si cet oprateur alpha n'est plus actif. Voici l'applet AlphaTest drivant de la classe Applet3D : cet exemple permet de tester les combinaisons des paramtres de l'oprateur alpha, appliques au dplacement en translation d'un cube l'aide du comportement d'animation PositionInterpolator. Les valeurs des proprits loopCount, mode, triggerTime, phaseDelayDuration, increasingAlphaDuration, increasingAlphaRampDuration, alphaAtOneDuration, decreasingAlphaDuration, decreasingAlphaRampDuration et alphaAtZeroDuration de l'oprateur alpha sont passes directement par des paramtres de mme nom. Pour une utilisation avec la commande java, vous pouvez tester par exemple :
java AlphaTest java AlphaTest increasingAlphaDuration=10000 increasingAlphaRampDuration=1000 java AlphaTest "mode=INCREASING_ENABLE|DECREASING_ENABLE" decreasingAlphaDuration=1000

import import import import

javax.media.j3d.*; javax.vecmath.*; com.sun.j3d.utils.applet.MainFrame; com.sun.j3d.utils.geometry.*;

public class AlphaTest extends Applet3D { public BranchGroup createSceneTree () {

Programmer en java

Page 511

Dao Issiaka- 3me anne SI

// Racine de l'arbre des objets reprsents dans la scne 3D BranchGroup root = new BranchGroup (); // Cration d'un oprateur en fonction des paramtres Alpha alpha = getAlphaFromParameters (); // Cration de l'animation de translation TransformGroup position = new TransformGroup (); position.setCapability (TransformGroup.ALLOW_TRANSFORM_WRITE); PositionInterpolator animation = new PositionInterpolator (alpha, position); animation.setStartPosition (-0.8f); animation.setEndPosition (0.8f); animation.setSchedulingBounds (new BoundingSphere (new Point3d (), 10.0)); // Construction de l'arbre root.addChild (position); position.addChild (animation); position.addChild (createScene ()); return root; } public Alpha getAlphaFromParameters () { // Cration d'un oprateur alpha par dfaut. Toutes les proprits sont 0 sauf // loopCount = -1, mode = INCREASING_ENABLE, increasingAlphaDuration = 1000 Alpha alpha = new Alpha (); String parameter; // Modification des proprits de l'oprateur alpha en fonction des paramtres if ((parameter = getParameter ("loopCount")) != null) alpha.setLoopCount (Integer.parseInt (parameter)); if ((parameter = getParameter ("mode")) != null) { // Dcodage des constantes INCREASING_ENABLE et DECREASING_ENABLE int parameterValue = 0; if (parameter.indexOf ("INCREASING_ENABLE") >= 0) parameterValue |= Alpha.INCREASING_ENABLE; if (parameter.indexOf ("DECREASING_ENABLE") >= 0) parameterValue |= Alpha.DECREASING_ENABLE; alpha.setMode (parameterValue); } if ((parameter = getParameter ("triggerTime")) != null) alpha.setTriggerTime (Long.parseLong (parameter)); if ((parameter = getParameter ("phaseDelayDuration")) != null) alpha.setPhaseDelayDuration (Long.parseLong (parameter)); if ((parameter = getParameter ("increasingAlphaDuration")) != null) alpha.setIncreasingAlphaDuration (Long.parseLong (parameter)); if ((parameter = getParameter ("increasingAlphaRampDuration")) != null) alpha.setIncreasingAlphaRampDuration (Long.parseLong (parameter)); if ((parameter = getParameter ("alphaAtOneDuration")) != null) alpha.setAlphaAtOneDuration (Long.parseLong (parameter)); if ((parameter = getParameter ("decreasingAlphaDuration")) != null) alpha.setDecreasingAlphaDuration (Long.parseLong (parameter)); if ((parameter = getParameter ("decreasingAlphaRampDuration")) != null) alpha.setDecreasingAlphaRampDuration (Long.parseLong (parameter)); if ((parameter = getParameter ("alphaAtZeroDuration")) != null) alpha.setAlphaAtZeroDuration (Long.parseLong (parameter));
Programmer en java Page 512

Dao Issiaka- 3me anne SI

return alpha; } public Node createScene () { return new ColorCube (0.1); } // Mthode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args) { new MainFrame (new AlphaTest (), args, 300, 85); } }

Figure 27. Arbre de la scne AlphaTest


Autres exemples

Applet TextTranslation, Clock3D, SunEarthMoonMotion.


La classe javax.media.j3d.PositionInterpolator

Cette classe drive des classes SceneGraphObject, Node, Leaf, Behavior, Interpolator et reprsente un comportement d'animation qui applique une translation un groupe de transformation, pour faire varier la position des formes 3D enfants de ce groupe. La translation le long de l'axe x est calcule un moment donn en interpolant les positions de dpart et de fin en fonction de la valeur de l'oprateur alpha. La direction de la translation peut tre modifie en utilisant la transformation axisOfTranslation qui applique une transformation temporaire au repre courant pour changer la direction de l'axe x.
Constructeurs
public PositionInterpolator (Alpha alpha, TransformGroup target) public PositionInterpolator (Alpha alpha, TransformGroup target, Transform3D axisOfTranslation, float startPosition, float endPosition)

Ces constructeurs permettent de crer un comportement d'animation affectant la translation du groupe de transformation target. Ce comportement fait varier la position d'une forme 3D entre les points (startPosition,0,0) (endPosition,0,0) du repre issu de la transformation axisOfTranslation. Par dfaut, startPosition est gale 0, endPosition 1 et axisOfTranslation la matrice identit.

Programmer en java

Page 513

Dao Issiaka- 3me anne SI

Principales mthodes
public TransformGroup getTarget () public void setTarget (TransformGroup target)

Ces mthodes permettent d'interroger ou de modifier le groupe de transformation target dont la transformation est affecte par ce comportement d'animation. target doit avoir la capacit ALLOW_TRANSFORM_WRITE.
public Transform3D getAxisOfTranslation () public void setAxisOfTranslation (Transform3D axisOfTranslation)

Ces mthodes permettent d'interroger ou de modifier la transformation qui donne la nouvelle direction de l'axe x le long duquel se fait la translation.
public public public public float getStartPosition () float getEndPosition () void setStartPosition (float startPosition) void setEndPosition (float endPosition)

Ces mthodes permettent d'interroger ou de modifier les positions de dpart ou de fin de ce comportement d'animation.
Exemples

Applets TextTranslation, AlphaTest.


La classe javax.media.j3d.RotationInterpolator

Cette classe drive des classes SceneGraphObject, Node, Leaf, Behavior, Interpolator et reprsente un comportement d'animation qui applique une rotation un groupe de transformation, pour faire varier la position des formes 3D enfants de ce groupe. La rotation autour de l'axe y est calcule un moment donn en interpolant les angles de dpart et de fin en fonction de la valeur de l'oprateur alpha. La direction de l'axe de rotation peut tre modifie en utilisant la transformation axisOfRotation qui applique une transformation temporaire au repre courant pour changer la direction de l'axe y.
Constructeurs
public RotationInterpolator (Alpha alpha, TransformGroup target) public RotationInterpolator (Alpha alpha, TransformGroup target, Transform3D axisOfRotation, float minimumAngle, float maximumAngle)

Ces constructeurs permettent de crer un comportement d'animation affectant la rotation du groupe de transformation target. Ce comportement fait varier la rotation entre les angles minimumAngle maximumAngle radians autour de l'axe y du repre issu de la transformation axisOfRotation. Par dfaut, minimumAngle est gale 0, maximumAngle 2*PI et axisOfRotation la matrice identit.
Principales mthodes
public TransformGroup getTarget () public void setTarget (TransformGroup target)

Programmer en java

Page 514

Dao Issiaka- 3me anne SI

Ces mthodes permettent d'interroger ou de modifier le groupe de transformation target dont la transformation est affecte par ce comportement d'animation. target doit avoir la capacit ALLOW_TRANSFORM_WRITE.
public Transform3D getAxisOfRotation () public void setAxisOfRotation (Transform3D axisOfRotation)

Ces mthodes permettent d'interroger ou de modifier la transformation qui donne la nouvelle direction de l'axe y autour duquel se fait la rotation.
public public public public float getMinimumAngle () float getMaximumAngle () void setMinimumAngle (float minimumAngle) void setMaximumAngle (float maximumAngle)

Ces mthodes permettent d'interroger ou de modifier les angles minimum ou maximum de ce comportement d'animation.

Voici l'applet Clock3D drivant de la classe Applet3D et utilisant 3 comportements d'animations de classe RotationInterpolator. Ceux-ci font tourner les aiguilles d'une horloge trois vitesses diffrentes, un tour tant effectu en 60*1000 ms pour l'aiguille des secondes, en 3600*1000 ms pour celle des minutes et en 12*3600*1000 ms pour celle des heures. Le mode des oprateurs alpha est gal DECREASING_ENABLE pour que alpha dcrot de 1 0 et qu'ainsi les aiguilles tourne en sens inverse du sens direct de l'axe y. Une transformation initiale est applique aux aiguilles pour mettre l'horloge l'heure.

import import import import import

java.util.*; javax.media.j3d.*; javax.vecmath.*; com.sun.j3d.utils.geometry.*; com.sun.j3d.utils.applet.MainFrame;

public class Clock3D extends Applet3D { public BranchGroup createSceneTree () { // Cration des attributs d'apparence avec des couleurs Appearance grayAppearance = new Appearance (); grayAppearance.setColoringAttributes ( new ColoringAttributes (0.7f, 0.7f, 0.7f, ColoringAttributes.SHADE_GOURAUD)); Appearance blackAppearance = new Appearance ();
Programmer en java Page 515

Dao Issiaka- 3me anne SI

blackAppearance.setColoringAttributes ( new ColoringAttributes (0, 0, 0, ColoringAttributes.SHADE_GOURAUD)); Appearance redAppearance = new Appearance (); redAppearance.setColoringAttributes ( new ColoringAttributes (1, 0, 0, ColoringAttributes.SHADE_GOURAUD)); // Cration des objets de Primitive clockFace = new Primitive seconds = new Primitive minutes = new blackAppearance); Primitive hours = new blackAppearance); Calendar date = new int currentSecond = int currentMinute = int currentHour = la scne (cadran + aiguilles) Cylinder (0.7f, 0.01f, grayAppearance); Box (0.01f, 0.01f, 0.75f / 2, redAppearance); Box (0.03f, 0.01f, 0.6f / 2, Box (0.03f, 0.01f, 0.4f / 2,

GregorianCalendar (); date.get (Calendar.SECOND); date.get (Calendar.MINUTE); date.get (Calendar.HOUR_OF_DAY) % 12;

BoundingLeaf schedulingBounds = new BoundingLeaf (new BoundingSphere ()); // Transformation secondes Transform3D secondsTransformation = new Transform3D (); secondsTransformation.rotY (-currentSecond * Math.PI / 30); Transform3D secondsTranslation = new Transform3D (); secondsTranslation.setTranslation (new Vector3f (0, 0.03f, -(0.75f / 2 - 0.1f))); secondsTransformation.mul (secondsTranslation); TransformGroup secondsTransformationGroup = new TransformGroup (secondsTransformation); // Animation des secondes avec un comportement de rotation TransformGroup secondsAnimationGroup = new TransformGroup (); secondsAnimationGroup.setCapability (TransformGroup.ALLOW_TRANSFORM_WRITE); Alpha secondsAlpha = new Alpha (-1, Alpha.DECREASING_ENABLE, 0, 0, 0, 0, 0, 60 * 1000, 0, 0); // Un tour en 60 s RotationInterpolator secondsRotator = new RotationInterpolator (secondsAlpha, secondsAnimationGroup); secondsRotator.setSchedulingBoundingLeaf (schedulingBounds); // Construction de la branche des secondes secondsAnimationGroup.addChild (secondsRotator); secondsAnimationGroup.addChild (secondsTransformationGroup); secondsTransformationGroup.addChild (seconds); // Transformation minutes Transform3D minutesTransformation = new Transform3D (); minutesTransformation.rotY (-currentMinute * Math.PI / 30); Transform3D minutesTranslation = new Transform3D (); minutesTranslation.setTranslation (new Vector3f (0, 0.02f, -(0.6f / 2 0.05f))); minutesTransformation.mul (minutesTranslation); TransformGroup minutesTransformationGroup = new TransformGroup (minutesTransformation); // Animation des minutes avec un comportement de rotation
Programmer en java Page 516

Dao Issiaka- 3me anne SI

TransformGroup minutesAnimationGroup = new TransformGroup (); minutesAnimationGroup.setCapability (TransformGroup.ALLOW_TRANSFORM_WRITE); Alpha minutesAlpha = new Alpha (-1, Alpha.DECREASING_ENABLE, 0, 0, 0, 0, 0, 3600 * 1000, 0, 0); // Un tour en 1 h (3600 s) RotationInterpolator minutesRotator = new RotationInterpolator (minutesAlpha, minutesAnimationGroup); minutesRotator.setSchedulingBoundingLeaf (schedulingBounds); // Construction de la branche des minutes minutesAnimationGroup.addChild (minutesRotator); minutesAnimationGroup.addChild (minutesTransformationGroup); minutesTransformationGroup.addChild (minutes); // Transformation hours Transform3D hoursTransformation = new Transform3D (); hoursTransformation.rotY ((-currentHour * 60 - currentMinute) * Math.PI / 360); Transform3D hoursTranslation = new Transform3D (); hoursTranslation.setTranslation (new Vector3f (0, 0.01f, -(0.4f / 2 0.05f))); hoursTransformation.mul (hoursTranslation); TransformGroup hoursTransformationGroup = new TransformGroup (hoursTransformation); // Animation des heures avec un comportement de rotation TransformGroup hoursAnimationGroup = new TransformGroup (); hoursAnimationGroup.setCapability (TransformGroup.ALLOW_TRANSFORM_WRITE); Alpha hoursAlpha = new Alpha (-1, Alpha.DECREASING_ENABLE, 0, 0, 0, 0, 0, 12 * 3600 * 1000, 0, 0); // Un tour en 12 h RotationInterpolator hoursRotator = new RotationInterpolator (hoursAlpha, hoursAnimationGroup); hoursRotator.setSchedulingBoundingLeaf (schedulingBounds); // Construction de la branche des heures hoursAnimationGroup.addChild (hoursRotator); hoursAnimationGroup.addChild (hoursTransformationGroup); hoursTransformationGroup.addChild (hours); // Rotation de PI / 2 autour de l'axe x pour avoir l'horloge de face Transform3D clockTransformation = new Transform3D (); clockTransformation.rotX (Math.PI / 2); TransformGroup clockTransformationGroup = new TransformGroup (clockTransformation); // Construction de l'horloge BranchGroup root = new BranchGroup(); root.addChild (clockTransformationGroup); clockTransformationGroup.addChild (schedulingBounds); clockTransformationGroup.addChild (clockFace); clockTransformationGroup.addChild (secondsAnimationGroup); clockTransformationGroup.addChild (minutesAnimationGroup); clockTransformationGroup.addChild (hoursAnimationGroup);

Programmer en java

Page 517

Dao Issiaka- 3me anne SI

return root; } // Mthode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args) { new MainFrame (new Clock3D (), args, 150, 150); } }

Figure 28. Arbre de la scne Clock3D


Autre exemple

Applet SunEarthMoonMotion.
La classe javax.media.j3d.ScaleInterpolator

Cette classe drive des classes SceneGraphObject, Node, Leaf, Behavior, Interpolator et reprsente un comportement d'animation qui applique une homothtie un groupe de transformation, pour faire varier l'chelle des formes 3D enfants de ce groupe. Les homothties sur les 3 axes sont calcules un moment donn en interpolant les facteurs minimumScale et maximumScale en fonction de la valeur de l'oprateur alpha. Les axes d'homothtie peuvent tre modifis en utilisant la transformation axisOfScale qui applique une transformation temporaire au repre courant.
Constructeurs
public ScaleInterpolator (Alpha alpha, TransformGroup target) public ScaleInterpolator (Alpha alpha, TransformGroup target, Transform3D axisOfScale, float minimumScale, float maximumScale)

Ces constructeurs permettent de crer un comportement d'animation affectant les facteurs d'homothtie du groupe de transformation target. Ce comportement fait varier la changement d'chelle entre les facteurs minimumScale et maximumScale sur les 3 axes du

Programmer en java

Page 518

Dao Issiaka- 3me anne SI

repre issu de la transformation axisOfScale. Par dfaut, minimumScale est gale 0.1f, maximumScale 1 et axisOfScale la matrice identit.
Principales mthodes
public TransformGroup getTarget () public void setTarget (TransformGroup target)

Ces mthodes permettent d'interroger ou de modifier le groupe de transformation target dont la transformation sera affecte par ce comportement d'animation. target doit avoir la capacit ALLOW_TRANSFORM_WRITE.
public Transform3D getAxisOfScale () public void setAxisOfScale (Transform3D axisOfScale)

Ces mthodes permettent d'interroger ou de modifier la transformation qui modifie les axes sur lesquels s'applique le facteur d'homothtie.
public public public public float getMinimumScale () float getMaximumScale () void setMinimumScale (float minimumScale) void setMaximumScale (float maximumScale)

Ces mthodes permettent d'interroger ou de modifier les facteurs d'homothtie minimum ou maximum de ce comportement d'animation.
La classe javax.media.j3d.ColorInterpolator

Cette classe drive des classes SceneGraphObject, Node, Leaf, Behavior, Interpolator et reprsente un comportement d'animation qui affecte la couleur de diffusion d'un attribut d'apparence de classe Material, pour faire varier la couleur des formes 3D utilisant cet attribut. La couleur est calcule un moment donn en interpolant les couleurs de dbut et de fin en fonction de la valeur de l'oprateur alpha.
Constructeurs
public ColorInterpolator (Alpha alpha, Material target) public ColorInterpolator (Alpha alpha, Material target, Color3f startColor, Color3f endColor)

Ces constructeurs permettent de crer un comportement d'animation affectant la couleur de diffusion de l'attribut d'apparence target, pour faire varier la couleur de startColor endColor (gaux par dfaut aux couleurs noir et blanc).
Principales mthodes
public Material getTarget () public void setTarget (Material target)

Ces mthodes permettent d'interroger ou de modifier l'attribut d'apparence target dont la couleur de diffusion sera affecte par ce comportement d'animation. target doit avoir la capacit ALLOW_COMPONENT_WRITE.

Programmer en java

Page 519

Dao Issiaka- 3me anne SI

public public public public

void void void void

getStartColor (Color3f startColor) getEndColor (Color3f endColor) setStartColor (Color3f startColor) setEndColor (Color3f endColor)

Ces mthodes permettent d'interroger ou de modifier les couleurs de dbut ou de fin de ce comportement d'animation.
La classe javax.media.j3d.TransparencyInterpolator

Cette classe drive des classes SceneGraphObject, Node, Leaf, Behavior, Interpolator et reprsente un comportement d'animation qui affecte la valeur de transparence d'un attribut d'apparence de classe TransparencyAttributes, pour faire varier la transparence des formes 3D utilisant cet attribut. La transparence est calcule un moment donn en interpolant les valeurs de transparence minimum et maximum en fonction de la valeur de l'oprateur alpha. Pour rappel, une valeur de transparence est compris entre 0 (totalement opaque) et 1 (totalement transparent).
Constructeurs
public TransparencyInterpolator (Alpha alpha, TransparencyAttributes target) public TransparencyInterpolator (Alpha alpha, TransparencyAttributes target, float minimumTransparency, float maximumTransparency)

Ces constructeurs permettent de crer un comportement d'animation affectant la couleur de diffusion de l'attribut d'apparence target, pour faire varier la couleur de startColor endColor (gales par dfaut 0 et 1).
Principales mthodes
public TransparencyAttributes getTarget () public void setTarget (TransparencyAttributes target)

Ces mthodes permettent d'interroger ou de modifier l'attribut d'apparence target dont la valeur de transparence sera affecte par ce comportement d'animation. target doit avoir la capacit ALLOW_VALUE_WRITE.
public public public public float getMinimumTransparency () float getMaximumTransparency () void setMinimumTransparency (float minimumTransparency) void setMaximumTransparency (float maximumTransparency)

Ces mthodes permettent d'interroger ou de modifier les valeurs de transparence minimum ou maximum de ce comportement d'animation.
Un exemple complet : Du soleil la lune

Voici l'applet SunEarthMoonMotion drivant de la classe Applet3D : cet exemple utilise 3 comportements d'animations de classe RotationInterpolator, pour simuler la rotation de la terre autour d'elle-mme et du soleil et la rotation de la lune autour de la terre, sur un fond toil utilisant l'image du fichier stars.gif. La terre effectue ici une rvolution en 120 s (au
Programmer en java Page 520

Dao Issiaka- 3me anne SI

lieu d'un an) et les autres vitesses de rotation sont modifies proportionnellement. Une source lumineuse confondue avec le soleil claire la terre et la lune. La terre a une texture utilisant le fichier demo/java3d/images/earth.jpg fourni avec Java 3D : recopiez-le dans votre rpertoire courant. Comme pour toutes les applets de ce manuel, les tailles et positions du soleil, de la terre et de la lune utilisent une unit qui permet de les afficher ici avec les dimensions par dfaut de l'univers 3D fixes par la classe Applet3D. Nanmoins, comme Java 3D permet de manipuler des dimensions qui vont de moins d'un Angstrm des millions d'annes lumire, il est aussi possible de crer un univers 3D avec une scne utilisant les dimensions relles.

import import import import import

javax.media.j3d.*; javax.vecmath.*; com.sun.j3d.utils.geometry.*; com.sun.j3d.utils.applet.MainFrame; com.sun.j3d.utils.image.TextureLoader;

public class SunEarthMoonMotion extends Applet3D { public BranchGroup createSceneTree () { // Rapport utilis pour les dures de rotation (1 an <=> 120 s) final long DURATION_RATIO = (365L * 24 * 3600) / 120; // Cration des attributs d'apparence de la lune avec une couleur blanche Appearance moonAppearance = new Appearance (); moonAppearance.setMaterial (new Material (new Color3f (), new Color3f (0.08f, 0.08f, 0.08f), new Color3f (1, 1, 1), new Color3f (), 0)); // Cration des attributs d'apparence de la terre avec une texture Appearance earthAppearance = new Appearance (); Texture texture = new TextureLoader ("earth.jpg", this).getTexture (); earthAppearance.setTexture (texture); TextureAttributes textureAttributes = new TextureAttributes ();
Programmer en java Page 521

Dao Issiaka- 3me anne SI

textureAttributes.setTextureMode (TextureAttributes.MODULATE); earthAppearance.setTextureAttributes (textureAttributes); earthAppearance.setMaterial (new Material (new Color3f (), new Color3f (0.08f, 0.08f, 0.08f), new Color3f (1, 1, 1), new Color3f (), 0)); // Cration des attributs d'apparence du soleil avec une couleur d'mission Appearance sunAppearance = new Appearance (); sunAppearance.setMaterial (new Material (new Color3f (), new Color3f (1, 1, 0.7f), new Color3f (), new Color3f (), 0)); // Cration des trois sphres reprsentant le soleil, la terre et la lune Primitive sun = new Sphere (0.1f, sunAppearance); Primitive earth = new Sphere (0.07f, Sphere.GENERATE_NORMALS | Sphere.GENERATE_TEXTURE_COORDS, earthAppearance); Primitive moon = new Sphere (0.025f, moonAppearance); BoundingSphere schedulingBounds = new BoundingSphere (new Point3d (), 100.0); Light sunLight = new PointLight (); sunLight.setInfluencingBounds (schedulingBounds); // Translation de la terre Transform3D earthTranslation = new Transform3D (); earthTranslation.setTranslation (new Vector3f (-0.7f, 0, 0)); TransformGroup earthTranslationGroup = new TransformGroup (earthTranslation); // Animation de la terre avec un comportement de rotation autour du soleil TransformGroup sunEarthAnimationGroup = new TransformGroup (); sunEarthAnimationGroup.setCapability (TransformGroup.ALLOW_TRANSFORM_WRITE); Alpha sunEarthAlpha = new Alpha (-1, 365L * 24 * 3600 * 1000 / DURATION_RATIO); // Un tour en 1 an RotationInterpolator sunEarthRotator = new RotationInterpolator (sunEarthAlpha, sunEarthAnimationGroup); sunEarthRotator.setSchedulingBounds (schedulingBounds); // Rotation de l'axe de rotation de la terre de 23 degr Transform3D earthAxisRotation = new Transform3D (); earthAxisRotation.rotZ (Math.PI * 23 / 180); TransformGroup earthAxisRotationGroup = new TransformGroup (earthAxisRotation); // Animation de la terre avec un comportement de rotation autour d'elle-mme TransformGroup earthAnimationGroup = new TransformGroup (); earthAnimationGroup.setCapability (TransformGroup.ALLOW_TRANSFORM_WRITE); Alpha earthAlpha = new Alpha (-1, 24L * 3600 * 1000 / DURATION_RATIO); // Un tour en 24 h
Programmer en java Page 522

Dao Issiaka- 3me anne SI

RotationInterpolator earthRotator = new RotationInterpolator (earthAlpha, earthAnimationGroup); earthRotator.setSchedulingBounds (schedulingBounds); // Construction de la branche avec la terre sunEarthAnimationGroup.addChild (sunEarthRotator); sunEarthAnimationGroup.addChild (earthTranslationGroup); earthTranslationGroup.addChild (earthAxisRotationGroup); earthAxisRotationGroup.addChild (earthAnimationGroup); earthAnimationGroup.addChild (earthRotator); // La terre autour d'elle-mme earthAnimationGroup.addChild (earth); // Translation de la lune Transform3D moonTranslation = new Transform3D (); moonTranslation.setTranslation (new Vector3f (-0.15f, 0, 0)); TransformGroup moonTranslationGroup = new TransformGroup (moonTranslation); // Animation de la lune avec un comportement de rotation TransformGroup moonAnimationGroup = new TransformGroup (); moonAnimationGroup.setCapability (TransformGroup.ALLOW_TRANSFORM_WRITE); Alpha moonAlpha = new Alpha (-1, 27L * 24 * 3600 * 1000 / DURATION_RATIO); // Un tour en 27 j RotationInterpolator moonRotator = new RotationInterpolator (moonAlpha, moonAnimationGroup); moonRotator.setSchedulingBounds (schedulingBounds); // Construction de la branche avec la lune moonAnimationGroup.addChild (moonRotator); moonAnimationGroup.addChild (moonTranslationGroup); moonTranslationGroup.addChild (moon); // Cration d'un fond toil avec l'image du fichier stars.gif TextureLoader starsTexture = new TextureLoader ("stars.gif", this); Background stars = new Background (starsTexture.getScaledImage (getSize ().width, getSize ().height)); stars.setApplicationBounds (schedulingBounds); // Rotation de PI / 4 autour de l'axe x pour changer le point de vue Transform3D sceneTransformation = new Transform3D (); sceneTransformation.rotX (Math.PI / 4); TransformGroup sceneTransformationGroup = new TransformGroup (sceneTransformation); // Construction de la scne BranchGroup root = new BranchGroup(); root.addChild (stars); root.addChild (sceneTransformationGroup); // Le soleil et la source lumineuse sont au centre du repre sceneTransformationGroup.addChild (sunLight); sceneTransformationGroup.addChild (sun); // La terre tourne autour du soleil (centre du repre) sceneTransformationGroup.addChild (sunEarthAnimationGroup); // La lune tourne autour de la terre earthTranslationGroup.addChild (moonAnimationGroup);
Programmer en java Page 523

Dao Issiaka- 3me anne SI

return root; } // Mthode main () pour permettre d'utiliser cette classe // comme applet ou comme application public static void main (String [] args) { new MainFrame (new SunEarthMoonMotion (), args, 500, 300); } }

Figure 29. Arbre de la scne SunEarthMoonMotion Vous noterez dans cet arbre que la position et la rotation de la lune est relative la terre, qui elle-mme tourne autour du soleil.
Plus loin avec Java 3D...

Ce manuel vous a prsent une grande partie des diffrentes possibilits offertes par Java 3D. Cette bibliothque a aussi d'autres fonctionnalits qui n'ont pas t dveloppes ici comme :

Les textures 3D. L'utilisation de la classe Fog pour raliser un effet de brouillard. Les classes de comportement Billboard et LOD qui permettent d'effectuer des optimisations sur le calcul de diffrents types de dtails d'une scne 3D. La classe Morph qui permet de raliser du morphing. La modification d'un univers 3D, la cration et la gestion de plusieurs vues sur une scne 3D. L'interception (picking) d'objets avec la souris. La gestion de la collision entre objets. La gnration de sons et le positionnement des sons dans l'espace.

Si ces fonctionnalits vous intressent, vous pouvez vous rfrer aux documentations (en anglais) fournies pas Sun sur http://www.javasoft.com/, notamment les
Programmer en java Page 524

Dao Issiaka- 3me anne SI

spcifications de Java 3D (Java 3D API Specification) et le tutorial Getting Started with Java 3D.
Solutions alternatives

Java 3D est une bibliothque trs complte pour raliser des scnes 3D. Mais cette solution peut vous sembler lourde utiliser dans le cadre de dveloppement d'applets par exemple. L'applet Cube3D ci-contre et l'applet JeksDisplay dveloppes par eTeks utilise uniquement la bibliothque Java 1.0 et montre qu'il est possible d'obtenir des effets 3D simples autrement (Cube3D utilise 6 classes pour un total de 12 Ko). Voici des liens vers d'autres solutions :

idx3D (applets 3D avec ses sources) Anfy 3D (applets 3D) GL4Java (implmntation en Java d'OpenGL) JCosmos (ressources 3D diverses)

Programmer en java

Page 525

Dao Issiaka- 3me anne SI

Applets Java

Liste des applets Java de ce manuel (les plus intressantes sont en gras)

Compteur de temps HelloWorld Liste des caractres accentus Unicode Compteurs multiples Chronomtre Afficheur synchronis de calculs Observateur de calculs Lecture d'un fichier sur Internet Paper board Internet partag Contrleur d'applet Son d'un piano Afficheur de composants Java Opration simple entre deux nombres Descripteur du comportement d'une applet Couper/Copier/Coller/Effacer dans un traitement de texte Boite de message Utilisation de la classe BorderLayout Gnrateur d'interface GridBagBuilder Test de menus Mini-diteur graphique Liste des polices de caractres disponibles Nuancier Barre de navigation avec boutons images Filtrage en ngatif Compteur Image anime Dfilement de texte Horloge des toiles

Applets/applications Java 3D

Applet3D CubeSides MultiCubes SimpleObjects Pyramid AxisShapeDemo HelloWorld3D ObjectFileDemo Clown SphereConstruction WaterGlass SimpleTexturedObjects LightEffect LitPlane LitApplet3D MouseApplet3D
Page 526

Programmer en java

Dao Issiaka- 3me anne SI

TextTranslation AlphaTest Clock3D SunEarthMoonMotion

Autres applets accessibles sur ce site


Jeks Display : Interprteur de fonctions Java Mine : Dmineur Java

Programmer en java

Page 527

Das könnte Ihnen auch gefallen