386
Intitulé Cours : Maîtrise de la programmation en langage Java Date : 4/6/02 Maîtrise de la programmation en langage Java

support de cours Java2.pdf

Embed Size (px)

Citation preview

  • Matrise de la programmation en langageJavaIntitul Cours : Matrise de la programmation en langage Java

    Date : 4/6/02

  • 2Protections Juridiques

    Protections Juridiques

    AVERTISSEMENTCe produit ou document est protg par un copyright et distribu avec des licences qui en restreignent lutilisation, lacopie, la distribution, et la dcompilation. Aucune partie de ce produit ou de sa documentation associe ne peut trereproduite sous aucune forme, par quelque moyen que ce soit, sans lautorisation pralabIntutil Cours : Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • Introduction

    Objectifs

    Ce cours a pour objectif de permettre des programmeurs Javadapprofondir et dlargir leur pratique des aspects fondamentaux dulangage.

    Les aspects conceptuels et techniques y sont abords en parallle.Lobjectif est damener les professionnels vers une pratique mature de laprogrammation Java.

    Sortent du primtre de ce cours :

    -Ltude dtaille de librairies trs spcialises comme sound,CORBA etc..

    - Les approches Java sortant du primtre Standard Editioncomme Java Entreprise Edition, Java Micro-Edition, etc.

    - Les librairies dextension

    Ces points sont abords dans dautres cours spcialissIntitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • Prrequis /4Introduction

    Pour pouvoir tirer un maximum de bnfices de ce cours il est vivementconseill:

    Davoir une bonne pratique des aspects fondamentaux de Java1:

    classes et interfaces, membres, constructeurs

    hritage, polymorphisme

    exceptions

    Davoir de bonnes connaissances thoriques sur la programmationen gnral et la programmation objet en particulier.

    Davoir des notions sur les technologies du Web internet (usagedun navigateur, adresses URL, langage HTML)

    De connatre un minimum danglais (il faut pouvoir lire ladocumentation)

    1. Ces notions sont dveloppes dans notre cours SL-265(Programmation en langage Java) et les cours drivs SL-110(Langage Java pour programmeurs dbutants) et SL-010(fondamentaux java pour programmeurs objet)Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • Phases /5Introduction

    Le cours est dcompos en plusieurs parties :

    1. Un bloc de chapitres revient sur les aspects fondamentaux de JavaLes interfaces graphiques Swing servent de support ces rappelsqui sont complts par un cours sur les processus lgers (threads).

    2. Un bloc de chapitres introduit les relations avec lenvironnementlocal dexcution: archives, ressources, internationalisation,prfrences, rapports et journalisation.

    3. Un bloc de chapitres traite des systmes dentres/sorties etdchanges: diffrents systmes dE/S , programmation rseau,rfrences distantes (RMI), accs aux bases relationelle(JDBC).

    Chaque chapitre dispose dannexes qui ne font pas proprement parlerpartie du cours, mais qui permettent de signaler des informationscomplmentaires. Le support dispose galement dannexes globales quiabordent des dispositifs avancs de programmation comme laprogrammation dynamique, les rfrences faibles ou les codes natifs.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • /6Introduction

    Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • Catgories dvnements ..................................................................................................... 52Considrations architecturales: classes interdpendantes.................................................... 54

    Processus lgers (threads)....................................................................................... 61

    Multi-tches (rappel)............................................................................................................ 62Processus lgers: principes .................................................................................................. 63Conception dun Thread ...................................................................................................... 64Table des Matires

    Introduction ............................................................................................................... 3

    Introduction technique, composants Swing .......................................................... 15

    Le code portable Java........................................................................................................... 16Portabilit: exemple des applications graphiques ................................................................ 18Un premier programme Swing............................................................................................. 20Disposer des composants dans un Container ....................................................................... 24FlowLayout : synthse ......................................................................................................... 27Gestionnaires de disposition :BorderLayout........................................................................ 28BorderLayout : exemple dvelopp ..................................................................................... 30Quelques autres gestionnaires de disposition ...................................................................... 34

    Introduction technique (suite), vnements .......................................................... 45

    Les vnements.................................................................................................................... 46 Modle dvnements ......................................................................................................... 47Les interfaces ....................................................................................................................... 49Exemple de mise en place de traitement dvnement ........................................................ 50Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • Cycle de vie : dbut et fin de vie.......................................................................................... 65 /8

    Cycle de vie: retrait de ltat actif........................................................................................ 67Cycle de vie: attente de la terminaison dune tche............................................................. 68Autres techniques de cration .............................................................................................. 69Etats dun Thread (rsum).................................................................................................. 71

    Accs concurrents.................................................................................................... 77

    Accs concurrents: problmatique....................................................................................... 78Blocs synchronized .............................................................................................................. 80Autres points sur lutilisation du moniteur .......................................................................... 82Producteur/consommateur: problmatique .......................................................................... 86Producteur/consommateur: mise en oeuvre ......................................................................... 87Etats dun Thread (rsum).................................................................................................. 91

    Archives, ressources, scurit................................................................................. 97

    Les ClassLoaders ................................................................................................................. 98Archives jar.......................................................................................................................... 99Archives jar: lancement dune application ........................................................................ 101Ressources.......................................................................................................................... 103Ressources applicatives ..................................................................................................... 104Scurit .............................................................................................................................. 106Scurit: politique configure ............................................................................................ 107

    Internationalisation ............................................................................................... 117

    Pourquoi internationaliser une application? ................................................................... 118Contextes culturels : Locale............................................................................................... 119Contexte culturel: obtention, mise en place....................................................................... 120Paramtrage de ressources: Resourcebundle ..................................................................... 121ListResourceBundle........................................................................................................... 122PropertyResourceBundle ................................................................................................... 123Classes de mise en forme/analyse...................................................................................... 125

    Prfrences ............................................................................................................. 131

    Preferences: principes ........................................................................................................ 132Preferences: contextes de nommage .................................................................................. 133Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • Obtention dun contexte..................................................................................................... 134 /9

    Consultation dans un contexte ........................................................................................... 135Enregistrement dune valeur .............................................................................................. 136Harmonisation avec le systme de persistence .................................................................. 137

    Rapports, journalisations, assertions .................................................................. 141

    LA.P.I. de log................................................................................................................ 142Contraintes architecturales des oprations de log .......................................................... 143Qui dtermine un comportement effectif de Logger?........................................................ 145Rglages dun Logger .................................................................................................... 146Cheminement des rapports................................................................................................. 147Mise en place des Loggers................................................................................................. 148Mise en place explicite dun Handler ................................................................................ 150Un code de Handler ........................................................................................................... 151Un code de Formatter......................................................................................................... 152Assertions........................................................................................................................... 154Pourquoi utiliser des assertions.......................................................................................... 155Assertions: syntaxe, activations ......................................................................................... 157

    Application dun pattern: les flots dE/S......................................................... 163

    Modles structurels (design patterns) ................................................................................ 164Un exemple dutilisation de pattern ............................................................................... 166Application du modle structurel aux E/S flot en Java: ................................................. 170Flots doctets (InputStream, OutputStream) ...................................................................... 172Flots de caractres (Reader, Writer) .................................................................................. 173Typologie par ressources................................................................................................ 174Conversions octets-caractres............................................................................................ 175Filtres ................................................................................................................................. 176Filtres courants................................................................................................................... 177

    Programmation rseau ......................................................................................... 181

    Modles de connexions rseau en Java.............................................................................. 182Sockets ............................................................................................................................... 183Sockets TCP/IP. ................................................................................................................. 184Serveur TCP/IP (exemple simple) ..................................................................................... 185Client TCP/IP (exemple simple)........................................................................................ 186Serveur TCP/IP (exemple avec threads) ............................................................................ 187Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • Echanges U.D.P. ................................................................................................................ 189 /10

    Serveur U.D.P. (exemple).................................................................................................. 190Client U.D.P. (exemple)..................................................................................................... 191UDP en diffusion (Multicast)........................................................................................... 192Diffuseur Multicast (exemple)........................................................................................... 193Ecouteur Multicast (exemple)............................................................................................ 194

    Dispositifs avancs dE/S ...................................................................................... 197

    E/S dobjets........................................................................................................................ 198Les objets dans un flot ....................................................................................................... 199Objet adapt la linarisation (exemple)........................................................................... 200Effets de la linarisation..................................................................................................... 201Personnalisation de la linarisation.................................................................................... 202Le package java.nio ........................................................................................................... 204Mise en oeuvre de Buffers ................................................................................................. 205Un exemple de mise en oeuvre de Buffers ........................................................................ 206Ventilation des lectures/critures dans des Buffers ........................................................... 208E/S asynchrones , slecteurs .............................................................................................. 210

    Les rfrences distantes (R.M.I.).......................................................................... 215

    La notion de service distant ............................................................................................... 216Principe de la communication entre objets distants........................................................... 218Exportation dun objet ....................................................................................................... 219Les instances de Stub ......................................................................................................... 221Annuaire dobjets distants.................................................................................................. 222Le serveur: enregistrement auprs du Registry.................................................................. 223Le client: demande au Registry.......................................................................................... 224Check-list pour une mise en oeuvre simple ....................................................................... 225

    Laccs aux bases relationnelles (J.D.B.C).......................................................... 235

    Le package java.sql............................................................................................................ 236Types de drivers JDBC ...................................................................................................... 237Modalits dune session JDBC .......................................................................................... 238Enregistrement des pilotes ................................................................................................. 239Dsignation de la ressource ............................................................................................... 240Obtention de la connexion ................................................................................................. 241Obtention dun contexte de requtes.................................................................................. 242Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • Exploitation de resultats..................................................................................................... 243 /11

    Correspondance des types de donnes SQL en Java ......................................................... 244Requte prpare................................................................................................................ 245Procdure stocke .............................................................................................................. 246Batch .................................................................................................................................. 247

    ANNEXES.............................................................................................................. 249

    Programmation dynamique ................................................................................. 251

    Pourquoi une programmation sur des classes dcouvertes au runtime? ............................ 252La classe java.lang.Class.................................................................................................... 253Obtention des informations sur la classe ........................................................................... 254Le package java.lang.reflect .............................................................................................. 255Les champs......................................................................................................................... 256Les mthodes ..................................................................................................................... 257Les constructeurs ............................................................................................................... 258Les tableaux ....................................................................................................................... 259Mandataires dynamiques ................................................................................................... 261Notion de Bean............................................................................................................... 264Les packages java.beans et java.beans.beancontext .......................................................... 265XMLEncoder, XMLDecoder............................................................................................. 266

    Rfrences faibles .................................................................................................. 269

    Problmatiques de caches mmoire ................................................................................... 270Les objets rfrences.......................................................................................................... 271SoftReference..................................................................................................................... 272WeakReference .................................................................................................................. 274Oprations lies labandon dun objet, finaliseurs, PhantomReferences........................ 276

    Utilisation de code natif : J.N.I............................................................................. 281

    Pourquoi raliser du code natif? ........................................................................................ 282Un exemple : "Hello World" en C ..................................................................................... 283Prsentation de JNI ............................................................................................................ 290JNI: types, accs aux membres, cration dobjets ............................................................. 291Rfrences sur des objets JAVA:....................................................................................... 294Exceptions.......................................................................................................................... 295Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • Invocation de JAVA dans du C ......................................................................................... 296 /12

    Java et le Web: les applets .................................................................................... 297

    Applets ............................................................................................................................... 298Applets: restrictions de scurit ......................................................................................... 300Hirarchie de la classe Applet............................................................................................ 302Applets: groupes de mthodes ........................................................................................... 303H.T.M.L.: la balise Applet ................................................................................................. 304Mthodes du systme graphique de bas niveau ................................................................. 306Mthodes daccs aux ressources de lenvironnement ...................................................... 307Mthodes du cycle de vie................................................................................................... 309

    Rappels: syntaxe, spcifications simplifies ....................................................... 311

    Plan gnral dune classe ................................................................................................... 312Plan gnral dune interface............................................................................................... 313Rappels syntaxiques (simplifis) ....................................................................................... 314Variables ............................................................................................................................ 322Mthodes............................................................................................................................ 329Constructeurs ..................................................................................................................... 333Blocs .................................................................................................................................. 335Types primitifs scalaires, types objets ............................................................................... 339Packages, rgles de responsabilit ..................................................................................... 340

    Aide-mmoire........................................................................................................ 341

    Le SDK .............................................................................................................................. 342Les outils............................................................................................................................ 343javadoc et HTML............................................................................................................... 344Glossaire ............................................................................................................................ 347Adresses utiles ................................................................................................................... 369Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • Premire partie: aspects fondamentaux du langage

    .Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • /14

    Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • Introduction technique, composants Swing 1

    Points essentiels

    Premire revue des bases techniques de Java.

    Si ncessaire un court prologue peut tre insr ici: Voir Java et le Web: lesapplets, page 297.

    Une prsentation des composants graphiques Swing sert de trame:composants portables, philosophie dune disposition de composantsindpendante de la plate-forme.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1Le code portable Java 1/16Introduction technique, composants Swing

    La filire de production du code Java :

    On a donc ici deux phases :

    Compilation du code source : javac Hello.java

    Excution du pseudo-code gnr: java Hello (appel delexcuteur avec en paramtre le nom de classe qui sert de pointdentre) - on notera quil existe dautres manires dappelerlexcuteur de code Java comme par exemple un excuteurenchass dans le code dun navigateur. Dans ce cas ontlcharge un code distant qui est dynamiquement pris en comptepar lexcuteur, le code doit rpondre un certain nombre decontraintes (dans ce cas celles dcrites par la classejava.applet.Applet).

    fichier source fichier binaire

    compilation: javac excution

    Hello.java Hello.classIntitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1Les machines virtuelles 1/17Introduction technique, composants Swing

    Le pseudo-code Java (bytecode) obit des spcifications prcises.Portable, il est excut sur la plate-forme locale par un excuteur propre cette plate-forme

    Lexcuteur local est un code natif spcifique au systme local.

    La librairie systme de Java doit tre installe localement. Cette librairiecontient :

    des classes compltement crites en Java

    des classes contenant du code natif. Ces codes natifs permettenten particulier de dlguer des services au systme dexploitationlocal (ouverture de fichiers, etc.) ou au systme de fentrage local(cration dune fentre, etc.)

    OS systme de

    JVM(interprteur spcifique)

    librairiesjava

    fentrage OSsystme de

    JVM(interprteur spcifique)

    librairiesjava

    fentrage

    fichier binaire (pseudo-code)conforme aux spcifications JVM

    plate-forme de type A plate-forme de type BIntitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1Portabilit: exemple des applications graphiques 1/18Introduction technique, composants Swing

    AWT

    Le package java.awt dfinit un ensemble de composants graphiquesstandard que lon retrouve sur toutes les plateformes. Ces composantdinteractions graphiques sont essentiellement raliss avec descomposants natifs du systme de fentrage local. Le mme code Javaconnaitra sur des sytmes diffrents une ralisation sensiblementdiffrente (tout en conservant la mme logique):

    Ici on a dispos deux boutons (classe java.awt.Button) lintrieurdune fentre (classe java.awt.Frame).

    AWT ne se contente pas de dfinir un vocabulaire graphique, il dfinitgalement une philosophie dassemblage de ses composants. Dans lamesure o un code Java portable ne connait pas a priori la plateformecible, il est malvenu de raliser un positionnement absolu des composants(Component) lintrieur des Containers (composants qui encontiennent dautre).

    La disposition des composants sappuie sur le principe des gestionnairesde disposition (LayoutManager): un objet associ chaque containercalcule la position des composants en fonction de contraintes logiques(nous allons en voir des exemples ultrieurement).

    Motif Windows

    (0,0)x

    y

    Container (Frame)

    Composant (TextField)

    Bien que possible le positionnement en coordonnes absolues nest pas portableIntitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1Swing 1/19Introduction technique, composants Swing

    Le package javax.swing dfinit une autre catgorie de composants. Cescomposants ne sappuient pas sur des composants natifs mais sontdessins partir des primitives graphiques de bas niveau (accessiblesen AWT).

    On a ici un vocabulaire graphique plus riche (de par sa nature AWT a unvocabulaire limit), et de nombreuses techniques qui compltent cellesdAWT. Ainsi lutilisation de gestionnaires de disposition est reprise etenrichie.

    Pour une dmonstration des capacits de la librairie voir le sous-rpertoire demo/jfc/SwingSet2 de linstallation de votre kit dedveloppement java (SDK). On remarquera, entre autres, la capacit dechanger de look and feel, cest dire de passer dune charte graphiqueportable (appele Metal) au look and feel de la plateforme locale (voire celui dune autre plateforme comme un look Motif sur Windows parexemple).Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1Un premier programme Swing 1/20Introduction technique, composants Swing

    Ici sur un systme de fentrage Motif, le rsultat de lexcution dunprogramme montrant un message simple dans une fentre:

    Le fichier source Message.java

    Un autre fichier source (TestMessage.java) pour assurer le lancementde lapplication :

    public class TestMessage {public static void main (String[] args) {//point dentre

    Message messager = new Message(args[0]) ; messager.dmarrer() ; } }

    La compilation des 2 fichiers donne les fichiers de pseudo-code :Messsage.class et TestMessage.class. Le lancement delapplication se fait par la commande (ici en syntaxe Shell Unix) :

    java TestMessage Bien le bonjour de SWING!

    import javax.swing.* ; //directive utilisation de librairie

    public class Message {//dclaration classeJFrame fentre ;

    public Message (String mess) { fentre = new JFrame("Message") ; JLabel label = new JLabel(mess) ; fentre.getContentPane().add(label); }

    public void dmarrer() { fentre.pack(); fentre.show() ; } }// fin classe

    var.membre instance

    mthode dinstance

    constructeurIntitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1Un premier programme Swing: contenu 1/21Introduction technique, composants Swing

    Aspects fonctionnels

    Dans une fentre Swing (JFrame: container racine partir duquel onpeut oprer en Swing) on dispose une tiquette Swing (JLabel: on nepeut pas mlanger composants AWT et composants Swing).

    Comme pour tous les containers racine cette disposition (application dela mthode add) ne sapplique pas directement sur le JFrame mais surson Content Pane (tapisserie de fond) -dans ce cas il y a une petitediffrence entre Swing et AWT qui, lui, dispose directement dans leContainer Frame-.

    La mthode pack() de JFrame lui permet de tenter de prendre lesdimensions strictement ncessaires pour contenir les composants (effetplus portable que lemploi de setSize(largeur, hauteur)).

    Code java

    La classe Message (dans le fichier Message.java!) dfinit une variabledinstance (fentre) qui est initialise dans le constructeur et utilisedans la mthode dinstance dmarrer (mthode dinstance sansparamtre ni resultat).

    La classe TestMessage contient juste un point dentre standard dont ladescription doit tre :

    public static void main(String[] parms)

    Le tableau de chanes de caractres pass en argument du maincorrespond aux arguments de lancement du programme. La premirechane (index 0) est rcupre pour tre passe en argument auconstructeur de Message. Cette invocation du constructeur rend unerefrence vers un objet de type Message; la mthode dmarrer estinvoque sur cette instance.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1Point intermdiaire : mise en place dun programme 1/22Introduction technique, composants Swing

    Mini-exercice :

    En vous inspirant du modle prcdent raliser un code JavaSwing qui affiche un message. Compiler, excuter.

    Pour varier les plaisirs utiliser pour afficher un message unautre composant que JLabel (par exemple un JButton, ouun JTextField) -lire la documentation associe au SDK-

    Pour les trs rapides ou ceux qui rvisent : changer la couleurde fond, la couleur du texte, la fonte du texte (mthodessetBackground, setForeground, setFont ,...)Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1 1/23Introduction technique, composants Swing

    Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1Disposer des composants dans un Container 1/24Introduction technique, composants Swing

    Voici un exemple plus complexe qui va nous permettre dobtenir ceci:

    Le code du Container dans lequel on va disposer des boutons :

    import javax.swing.* ; import javax.swing.border.* ; import java.awt.* ;

    public class Barre extends JPanel {

    /** Cre un barre horizontale de composants Swing * * Les composant sont cadrs dans le sens naturel de lecture */ public Barre(JComponent[] tbComp) {

    super(new FlowLayout(FlowLayout.LEADING)) ; for(int ix = 0 ; ix < tbComp.length; ix++) {

    this.add(tbComp[ix]) ; } }

    /** Un cadre et un titre sont diposs autour des composants */ public Barre(String leTitre, JComponent[] tbComp) {

    this(tbComp) ; Border bordure = BorderFactory.createEtchedBorder() ; Border titre = BorderFactory.createTitledBorder(

    bordure, leTitre,TitledBorder.DEFAULT_JUSTIFICATION,TitledBorder.TOP) ;

    this.setBorder(titre) ; } }Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1Disposition : le code 1/25Introduction technique, composants Swing

    Aspects fonctionnels

    La classe Barre dcrit un Panneau (JPanel) dans lequel les composantssont disposs les uns la suite des autres.

    Une telle disposition est assure par un gestionnaire de disposition appelFlowLayout. Pour doter un container dun gestionaire de dispositionparticulier, il faut faire appel sa mthodesetLayout(gestionnaire). La classe JPanel dispose galement dunconstructeur qui permet de passer le gestionnaire de disposition enparamtre.

    Dans le cadre dun FlowLayout on doit ajouter les composants aucontainer en employant la mthode add(composant) -lordre des ajoutsest important puisquil dtermine lordre de disposition des composants-

    Il est possible de construire deux types de Barres: celles qui alignentsimplement des composants et celles qui entourent cet alignement avecune bordure comprenant un titre (cas illustr dans limage). Cettepossibilit de placer une bordure autour dun composant estcaractristique de Swing (et nexiste pas en AWT classique).

    Code java

    Barre hrite de JPanel (dclaration extends). On dcrit deuxconstructeurs dont lun se dfinit par rapport lautre:

    Le premier constructeur fait appel au constructeur de JPanel enlui passant une instance de FlowLayout (argument dterminantun cadrage gauche: constante de la classe FlowLayout).On parcourt ensuite le tableau de composants pass en argumentet on les ajoute linstance courante (qui est un Container).

    Le second contructeur fait dabord appel au premier, puisconstruit une bordure compose.Ces bordures sont fabriques par des mthodes de classe de laclasse BorderFactory (mthodes fabriques).Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1Disposer des composants dans un Container (suite) 1/26Introduction technique, composants Swing

    Le code utilisant Barre pour crer limage en exemple:

    import javax.swing.* ;

    public class TestBarre {

    public static void main (String[] args) { JComponent[] tb = { new JButton("OUI"), new JButton("NON"), new JButton("Sans Opinion"), } ; Barre barre = new Barre(" Votre avis? ", tb) ; JFrame fen = new JFrame("Sondage") ; fen.getContentPane().add(barre) ; fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ; fen.pack(); fen.show() ; } }

    Aspects fonctionnels

    Un tableau contenant 3 boutons est pass au constructeur de Barre etcette Barre est mise directement dans le ContentPane de la fentre.

    On notera que pour que lapplication sarrte quand on ferme la fentre,on fixe lopration dclencher (fonctionnalit spcifique au JFrame: dansle AWT classique il faudra suivre une procdure dcrite au chapitresuivant).

    Code java

    Noter la cration dun tableau littral de JComponent (qui dailleurs necontient que des JButtons).Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1FlowLayout : synthse 1/27Introduction technique, composants Swing

    Le gestionnaire de disposition FlowLayout positionne les composants lesuns la suite des autres. Au besoin il cre une nouvelle ligne pourpositionner les composants qui ne tiennent pas dans la ligne courante.

    A la diffrence de beaucoup dautres gestionnaires de disposition, uneinstance de FlowLayout ne modifie pas la taille des composants (tous lescomposants comportent une mthode getPreferredSize() qui estappele par les gestionnaires de disposition pour demander quelle taille lecomposant voudrait avoir).

    FlowLayout est le gestionnaire par dfaut associ aux containersde type Panel (AWT) et JPanel (Swing)1.

    Il existe plusieurs manires de construire un FLowLayout ce quipermet de faire varier lalignement ( gauche, droite, centr,..) oude faire varier la taille des gouttires sparant les composants.

    Les composants sont ajouts au Container en employant lamthode add(Component) , bien entendu lordre des add estimportant puisquil dtermine lordre des composants dans ladisposition.

    1. note: un autre gestionnaire par dfaut est associ auContentPane le add na pas ici le mme effet -voir suite delexpos-

    redimensionnementde la fentre(exemple en AWT)Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1Gestionnaires de disposition :BorderLayout 1/28Introduction technique, composants Swing

    BorderLayout divise son espace de travail en cinq zone nommes et lescomposants sont ajouts explicitement une zone donne. On ne peutplacer quun composant par zone, mais toutes les zones ne sont pasncessairement occupes.

    BorderLayout est le gestionnaire par dfaut des Containers detype Window (AWT) et ContentPane des JFrame (Swing).

    Les add sont qualifis: il faut prciser dans quelle zone on met lecomposant (par dfaut un add simple met le composant dans lazone centrale).

    En cas dlargissement du container le gestionnaire respecte leshauteurs prfres des composants en NORTH et SOUTH, et leslargeurs prfres des composants en EAST et WEST. La zonecentrale tend occuper toute la place restante dans les deuxdirections.

    redimensionnementde la fentre(exemple AWT)Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1BorderLayout: exemple de code (simplifi) 1/29Introduction technique, composants Swing

    ...; import javax.swing.* ; import javax.swing.text.* ; import java.awt.* ;

    public class PresentationMessage extends JPanel {

    ... ;protected JButton rep= new JButton("Rpondre") ;protected JButton prec= new JButton("Prcdent") ;protected JButton suiv= new JButton("Suivant") ;

    public PresentationMessage() { ... ;

    setLayout(new BorderLayout(5,5)) ;// gouttires de 5 // ---------- en-tte String descr = ... ; JLabel label = new JLabel(descr) ;

    this.add(label, BorderLayout.NORTH) ; // ---------- TEXTE

    String message = ... ; JTextArea jt = new JTextArea(message, 3, 50) ;

    this.add(new JScrollPane(jt), BorderLayout.CENTER) ; // ---------- boutons JButton[] tbBout = {rep, prec, suiv}; Barre boutons = new Barre(tbBout) ;

    this.add(boutons, BorderLayout.SOUTH) ; } ....

    }

    On notera que le add prend ici une forme particulire (add qualifi).Parailleurs la combinaison JTextArea (texte multiligne), JScrollPaneest spcifique Swing.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1BorderLayout : exemple dvelopp 1/30Introduction technique, composants Swing

    Voici laspect graphique de la prsentation recherche :

    Cette prsentation graphique sert aux interactions sur un objet Messagedont voici la dfinition:

    package chat;// la class appartient au package chat

    public class Message {// vrai nom : chat.Messagepublic static final int ORIGINAL = -1 ;public final int numero ;

    public final int repondA ; public final String auteur ; public final String message ;

    public Message(String auteur,int num,int rep,String message){ this.auteur=auteur; numero = num; repondA = rep; this.message = message; }

    public Message(String auteur,int num,String message) { this(auteur, num, ORIGINAL, message) ; } }

    Cette classe dfinit en quelque sorte une structure de donnes simpledont tous les champs sont immuables une fois linstance construite. Ducoup il ny a pas encapsulation des variables dinstance et celles-ci sontpubliques. (On notera galement la dfinition de la constante de classeORIGINAL).

    Toute classe Java qui sort du domaine de la petite dmonstration doit tredfinie dans le cadre dun package(Voir Packages, rgles de responsabilit,page 340..)Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1Exemple dvelopp de linterface graphique: 1/31Introduction technique, composants Swing

    package chat; import javax.swing.* ; import javax.swing.text.* ; import java.awt.* ;

    public class PresentationMessage extends JPanel {

    private Message msg ;protected JButton rep= new JButton("Rpondre") ;protected JButton prec= new JButton("Prcdent") ;protected JButton suiv= new JButton("Suivant") ;

    public PresentationMessage(Message mess) { msg = mess ;

    setLayout(new BorderLayout(5,5)) ;// gouttires de 5 // ---------- en-tte String descr = "De: " +msg.auteur +" ["+ msg.numero+ "] "; if( msg.repondA != Message.ORIGINAL) { descr += " rpond A: [" + msg.repondA +"]" ; } JLabel label = new JLabel(descr) ; label.setFont(new Font("Monospaced",Font.BOLD,15)) ; label.setForeground( Color.RED ) ;

    this.add(label, BorderLayout.NORTH) ; // ---------- TEXTE JTextArea jt = new JTextArea(msg.message, 3, 50) ; jt.setEditable(false) ;

    this.add(new JScrollPane(jt), BorderLayout.CENTER) ; // ---------- boutons JButton[] tbBout = {rep, prec, suiv}; Barre boutons = new Barre(tbBout) ;

    this.add(boutons, BorderLayout.SOUTH) ; }

    public Message getMessage() {// accesseur dun membre priv return msg ; } }Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1Point intermdiaire : coder avec des 1/32Introduction technique, composants Swing

    LayoutManagers

    Mini-exercice :

    Raliser un code Java Swing qui soit lquivalent de cetteprsentation AWT:

    Faites un code simple, mais les classes utilises doivent appartenir un package. Si vous ne savez pas organiser un dveloppementen package: Voir Dveloppement avec des packages, page 43..

    Pour les trs rapides ou ceux qui rvisent : faites des expriencesavec des composants Swing (JLabel, JButton) en leur passant duhtml comme texte.Ci-aprs un exemple analogue au code prcdent mais qui utiliseun JEditorPane("text/html", texte) en remplacementdun TextArea.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1 1/33Introduction technique, composants Swing

    Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1Quelques autres gestionnaires de disposition 1/34Introduction technique, composants Swing

    GridLayout

    Dispose un tableau dans lequel tous les composants ont la mmehauteur et la mme largeur:

    Utilise essentiellement des add(composant) -lordre des appels tantimportant pour dterminer lordre de composants-

    redimensionnementde la fentre

    disposition avec des lments manquantsIntitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1BoxLayout 1/35Introduction technique, composants Swing

    Cest un gestionnaire spcifique Swing. A utiliser ventuellement avec laclasse Box pour permettre des alignements de composants dans unedirection avec des insertions despaces et de glue qui maintient deslments ensembles.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1GridBagLayout 1/36Introduction technique, composants Swing

    Cest le plus complexe des gestionnaires standard. Les composants sontdisposs dans un tableau dans lequel chaque ligne et chaque colonne aune dimension dicte par le plus grand composant qui loccupe(dfinissant ainsi un tartan irrgulier de cellules) :Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1On dispose par add(composant, contraintes) dans lequel 1/37Introduction technique, composants Swing

    contraintes est une instance de GridBagConstraints (rutilisable), leschamps de cette instance comprennent:

    gridx, gridy : donne les coordonnes x, y de lobjet dans la grille(celle-ci dduit automatiquement son propre nombre de lignes etde colonnes)

    gridwidth, gridheight : nombre de cellules occupes par lecomposant

    fill : direction du remplissage (le composant tend alors occupertoute sa cellule dans la direction donne). Valeurs: NONE, BOTH,VERTICAL, HORIZONTAL

    anchor: lorsquun composant est plus petit que sa cellule, borddancrage du composant (un point cardinal: EAST, NORTHEAST,etc.)

    insets: dtermination des "gouttires" (distance minimum entre lecomposant et les frontires de sa cellule)

    weightx,weighty : "poids" relatif de la cellule lorsque le containerdispose de plus de place que ncessaire pour les cellules et quelon souhaite largir la disposition (valeur de type doublecomprise entre 0 et 1)

    Exemple de code :

    GridBagConstraints gbc = new GridBagConstraints() ; gbc.gridx = 0 ; gbc.gridy = 0 ; add(new JButton ("gridx=0;gridy=0"), gbc);// couteux! gbc.gridx = 1 ; gbc.gridy = 1 ; add(new JButton ("gridx=1;gridy=1"), gbc) ;Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1Exercice: pratique des LayoutManagers 1/38Introduction technique, composants Swing

    Exercice :

    Raliser en Swing un formulaire comprenant un champ de saisie,un bouton et une plage de texte (pour afficher la rponse laquestion)Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1 1/39Introduction technique, composants Swing

    Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1Complments 1/40Introduction technique, composants Swing

    Les complments techniques suivants constituent une annexe de rfrence

    Swing

    La programmation Swing est un vaste sujet (voir notre cours SL-320).Quelques remarques gnrales complmentaires sur les composantsSwing:

    bordures :En utilisant la mthode setBorder() on peut spcifier unebordure autour du composant courant. Cette Bordure peut tre unespace vide (lusage de EmptyBorder remplace lutilisation desetInsets()) ou un dessin de bordure (implantant linterfaceBorder et rendu par la classe BorderFactory).

    double buffering :les techniques de double-buffering permettent dviter les effetsvisuels de clignotement lors de rafraichissements frquents delimage du composant. On na plus crire soi-mme le double-buffering, Swing gre par dfaut les contextes graphiquesncessaires.

    bulles daide (Tool tips):en utilisant la mthode setToolTipText() et en lui passant unechane de caractres explicative on peut fournir lutilisateur unepetite bulle daide. Lorsque le curseur fait une pause sur lecomposant la chane explicative est affiche dans une petite fentreindpendante qui apparat proximit du composant cible.

    utilisation du clavier :en utilisant la mthode registerKeyBoardAction() on peutpermettre lutilisateur dutiliser uniquement le clavier pournaviguer dans linterface utilisateur et pour dclencher desactions. La combinaison caractre + touche de modification estreprsente par lobjet KeyStroke.

    pluggable look and feel :au niveau global de lapplication un UIManager gre la chartegraphique (look and feel). La modification de laspect parIntitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1setLookAndFeel() est soumise des contrles de scurit. 1/41Introduction technique, composants Swing

    Derrire chaque JComponent il y a un ComponentUI qui gre ledessin, les vnements, la taille, etc.

    utilisation de modles:Swing comporte une trs grande varit de composants dontcertains sont trs complexes (voir JTree, JTable, etc.). Il estpratique dutiliser des modles de programmation, cest diredes structures de donnes qui grent en parallle des donnes etleur reprsentation graphique (les modifications de lune sontrpercutes dans lautre).Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1Java: bases fondamentales 1/42Introduction technique, composants Swing

    Pour amliorer vos connaissances sur les bases fondamentales de Java,vous devez, ce stade, approfondir les points suivants :

    Architecture des dclarations de classes -Voir Plan gnral duneclasse, page 312.-, packages, rgles de visibilit (modificateurspublic, private, protected) -Voir Packages, rgles deresponsabilit, page 340.-.

    Utilisation des types: types primitifs (int, boolean, double,etc.), types objets (rfrences vers des instances) et casparticulier des objets qui sont des tableaux. -Voir Types primitifsscalaires, types objets, page 339.

    Dclaration des variables --Voir Dclarations de variable membre :,page 314.; Voir Variables, page 322.-

    Dclaration des mthodes (arguments, rsultats) -Voir Dclarationsde mthode membre, page 315.; Voir Mthodes, page 329.-, rgles deredfinition dans les sous-classes. Polymorphisme des rfrences.

    Dclaration des constructeurs - Voir Dclarations de constructeur,page 317.; Voir Constructeurs, page 333. -, appel des constructeurs,rgles de dfinition des constructeurs dans les sous-classes.

    Membres de classe : variables partages -Voir variables de classe,page 325.-, constantes, mthodes de classe -Voir Mthodes de classe,page 332.-.

    Structures du code -Voir Syntaxe simplifie des blocs de code,page 318.; Voir Blocs, page 335.-, structures de contrle -VoirSyntaxe simplifie des blocs de code, page 318.; Voir structures decontrle:, page 319.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1Dveloppement avec des packages 1/43Introduction technique, composants Swing

    Exemple dorganisation pratique des rpertoires:

    src

    fr

    gibis

    utilsp1 p2

    Classe1.javaC2.java

    classes

    fr

    gibis

    utilsp1 p2

    Classe1.classC2.class

    javac -classpath classes -d classes -sourcepath src Classe1.java

    variablespeut contenir une liste de chemins daccs(spars par : -ou ; sous Win*-)Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 1 1/44Introduction technique, composants Swing

    Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • Introduction technique (suite), vnements 2

    Points essentiels

    La gestion des vnements dans une IHM va nous permettre de revenirsur des dispositifs de programmation objet spcifiques Java: interfaces,classes membres et classes locales.

    Les mcanismes fondamentaux des vnements graphiques relvent deAWT, mais sont repris et largis dans Swing.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 2Les vnements 2/46Introduction technique (suite), vnements

    Lorsque lutilisateur effectue une action au niveau de linterfaceutilisateur, un vnement est mis. Les vnements sont des objets quidcrivent ce qui sest produit. Il existe diffrents types de classesdvnements pour dcrire des catgories diffrentes dactions utilisateur.

    Sources dvnements

    Un vnement (au niveau de linterface utilisateur) est le rsultat duneaction utilisateur sur un composant graphique source. A titre dexemple,un clic de la souris sur un composant bouton gnre un ActionEvent.LActionEvent est un objet contenant des informations sur le statut delvnement par exemple:

    getActionCommand() : renvoie le nom de commande associ laction.

    getModifiers() : renvoie la combinaison des modificateurs,cest dire la combinaison des touches que lon a maintenuespresses pendant le click (touche Shift par exemple).

    getSource() : rend lobjet qui a gnr lvnement.

    Gestionnaire dvnements

    Un gestionnaire (handler) dvnement est une mthode qui reoit unobjet Event, lanalyse et traite les consquences de linteractionutilisateur.

    Pour certains types dvnements il peut y avoir plusieurs types degestionnaires qui seront respectivement appels en fonction de lactionqui sest produite au niveau du composant source. Ainsi pour unvnement souris on pourra distinguer un gestionnaire correspondant laction du clic ou un gestionnaire correspondant au fait que le curseursoit pass sur le composant concern.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 2Modle dvnements 2/47Introduction technique (suite), vnements

    Modle par dlgation

    Le JDK 1.1 a introduit dans Java un modle dvnement appel modledvnement par dlgation. Dans un modle dvnement pardlgation, les vnements sont (indirectement) gnrs par uncomposant graphique (qualifi de source de lvnement); on doitassocier ce composant un objet de traitement dvnement (appelveilleur: Listener) pour recevoir lvnement et le traiter. De cette faon,le traitement dvnement peut figurer dans une classe distincte ducomposant impliqu.

    Un veilleur est susceptible de traiter plusieurs actions lies un typedvnement et donc de disposer de plusieurs gestionnaires : par exempleun gestionnaire charg de veiller sur les clics souris et un charg deveiller sur le passage de la souris sur le composant.

    Applet

    Panel

    Bouton

    action

    ....}

    handler dactionactionPerformed(ActionEvent e) {

    instance de veilleurgnration ActionEventIntitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 2Modle dvnements 2/48Introduction technique (suite), vnements

    Le type du veilleur

    Les composants susceptibles de gnrer des vnements sont dots demthodes denregistrement des veilleurs spcialiss. On peut avoirplusieurs mthodes denregistrement par exemple pour un boutonJButton:

    addActionListener(...) ; addMouseListener(...) ;...

    Quelle est le type de largument qui permet de dsigner la nature duveilleur?

    Si ce type tait celui dune classe particulire on serait oblig auniveau de la ralisation de crer une sous-classe pour implanter lecode de traitement.Bien que possible, cette solution serait plus rigide: on pourraitavoir besoin dinsrer ces codes de traitement dans des instancesqui drivent dautres classes (et, pourquoi pas, des instances quisont elles mmes des drivs de composants graphiques). De plussi on voulait crer une classe de veille qui a plusieurscomportement (ActionListener, MouseListener) lcriture du codedeviendrait difficile (pas dhritage multiple en Java).On souhaiterait avoir ici la fois un contrle de type strict (lobjetpass en paramtre doit savoir traiter lvnement considr) etune grande souplesse au niveau du type effectif de lobjet qui rendle service.

    Le type du veilleur est dfini par une interface JavaIntitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 2Les interfaces 2/49Introduction technique (suite), vnements

    Une interface est en Java une dclaration de type qui permet de dcrireune capacit.

    public interface ActionListener {public void actionPerformed(ActionEvent evt) ;

    } -------------------// autre exemple dans un autre fichier .java public interface FocusListener {

    public void focusGained(FocusEvent evt) ;public void focusLost(FocusEvent evt) ;

    }

    Une classe pourra dclarer adhrer au contrat dfini par linterface. Ellesera oblige dimplanter le code correspondant aux mthodes dclaresmais cela lui permettra dtre vue comme conforme au contrat de typeexig.

    public class Veilleur extends X implements ActionListener {... // codes diverspublic void actionPerformed(ActionEvent act) {

    // code spcifique}

    }

    On pourra alors crire :

    monBouton.addActionListener(monVeilleur) ;

    puisquun Veilleur remplit les obligations dun ActionListener.

    Pour un point sur les interfaces Voir Plan gnral dune interface, page 313.et les dtails concernant les dclarations de mthodes et de constantes declasse dans le chapitre Rappels: syntaxe, spcifications simplifies,page 311Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 2Exemple de mise en place de traitement dvnement 2/50Introduction technique (suite), vnements

    Les vnements sont des objets qui ne sont envoys quaux veilleursenregistrs. A chaque type dvnement est associ une interface dcoutecorrespondante.

    A titre dexemple, voici une fentre simple comportant un seul bouton :

    import java.awt.*; import javax.swing.* ;

    public class TestButton { public static void main (String args[]){ JFrame fr = new JFrame ("Test"); JButton bt = new JButton("Appuyer!");

    bt.addActionListener(new VeilleurBouton()); fr.getContentPane().add(bt,BorderLayout.CENTER); fr.pack(); fr.show(); }}

    La classe VeilleurBouton dfinit une instance de traitement delvnement .

    import java.awt.event.*;public class VeilleurBouton implements ActionListener{ public void actionPerformed(ActionEvent evt) { System.err.println("Ae!sur " + evt.getActionCommand());

    /* faire System.err.println dans un interface graphique nest* pas fondamentalement une bonne ide! ceci est un exemple*/

    }}Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 2Exemple de mise en place de traitement dvnement 2/51Introduction technique (suite), vnements

    La classe JButton hrite de AbstractButton une mthodeaddActionListener(ActionListener).

    Linterface ActionListener dfinit une seule mthode ,actionPerformed qui recevra un ActionEvent.

    Lorsquun objet de la classe JButton est cr, on peut enregistrerun objet veilleur pour les ActionEvent par lintermdiaire de lamthode addActionListener, on passe en paramtre un objetdune classe qui implante (implements) linterfaceActionListener.

    Lorsque lon clique sur lobjet Bouton avec la souris, unActionEvent est envoy chaque ActionListener enregistr etla mthode actionPerformed (ActionEvent)est invoque.

    Remarquons que lon aurait pu enregistrer plusieurs veilleurs distinctsdvnements Action auprs du bouton. On aurait pu galementenregistrer un veilleur qui sache traiter plusieurs types dvnement (parexemple Action + Focus); dans ce cas la dclaration de la classe aurait t :

    public class VeilleurBouton implementsActionListener, FocusListener {

    public void actionPerformed(ActionEvent evt) {....

    }

    public void focusGained(FocusEvent evt) {...

    }

    public void focusLost(FocusEvent evt) {...

    } }Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 2Catgories dvnements 2/52Introduction technique (suite), vnements

    Il existe de nombreux types dinterfaces de veille dans les packagesjava.awt.event et javax.swing.event. Quelques exemples AWT:

    Catgorie Interface Methodes

    Action ActionListener actionPerformed(ActionEvent)

    Item ItemListener itemStateChanged(ItemEvent)

    Mouse MotionMouseMotionListener mouseDragged(MouseEvent)mouseMoved(MouseEvent)

    Mouse MouseListener mousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)

    Key KeyListener keyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)

    Focus FocusListener focusGained(FocusEvent)focusLost(FocusEvent)

    Window WindowListener windowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified(WindowEvent)windowClosed(WindowEvent)windowActivated(WindowEvent)windowDeactivated(WindowEvent)

    On remarquera quil existe des vnements de bas niveau (une touche estpresse, on clique la souris) et des vnements abstraits de haut niveau(Action = sur un bouton on a cliqu, sur un TextField on a fait un, ...)

    Dans certains cas le package fournit une classe XXXAdapter quiimplante toutes les mthodes du contrat de veille mais sanscomportement associ. Cette facilit permet de dfinir des classes de veillesimples par hritage de lAdapter et ainsi permet dviter dimplantertoutes les mthodes du Listener -on ne dfinit que celles dont on abesoin-.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 2Point intermdiaire : Mise en place dun veilleur 2/53Introduction technique (suite), vnements

    Mini-exercice :

    Reprendre lexercice de mise en place dun formulaire question-rponse (Exercice :, page 38).Faire en sorte que lorsque lon a valid une question dans lechamp de saisie, on affiche un cho de cette question dans lecomposant rponse.Prcision: la production de la rponse doit tre dclenche quandon appuie sur le bouton JButton ET quand on valide lechamps de saisie JTextField (en appuyant sur la touche). Quel est le type dvnement qui permet de grer cesdeux actions de la mme manire?Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 2Considrations architecturales: classes interdpendantes 2/54Introduction technique (suite), vnements

    La mise en place dune interface utilisateur est particulirementintressante par les problmes dorganisation qui sont poss. Il faut fairecollaborer des codes qui traitent la logique applicative avec les codeschargs de la prsentation. De plus, il faut impliquer les codes qui grentles vnements et permettent la mise jour des instances .

    Dans le cadre de techniques dorganisation, on utilise souvent desmodles architecturaux (pattern) qui distinguent le Modle ( les donnesqui vont tre manipules) de la Vue (la reprsentation graphique de cesdonnes) et mettent en place des automatismes de mise jour.

    Sans entrer dans ces techniques nous allons nous poser un problmedorganisation courant: imaginons un exemple trs simple dans lequel unJFrame contient un bouton JButton et un JTextField dans lequelnous affichons le nombre de clics sur le bouton.

    Si nous crivons un code tel que :

    bouton.addActionListener(new ControleurAction());

    Comment linstance de contrle (de type ControleurAction) peut-elleconnatre le champ de type JTextField pour lui demander dafficher unmessage?Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 2Considrations architecturales 2/55Introduction technique (suite), vnements

    Le gestionnaire dvnement dans une classe externe

    Le fait que le contrleur doive connatre un composant sur lequel il doitagir nous amne raliser une classe qui garde en mmoire une rfrencesur ce composant cible :

    public class ControleurAction implements ActionListener {private int compteur ;private JTextField message ;

    public ControleurAction (JTextField cible) {message = cible ;

    }

    public void actionPerformed(ActionEvent evt) {message.setText("nombre de clics =" + (++compteur));

    } }

    et dans le code de disposition de composants graphiques :

    bouton.addActionListener(new ControleurAction(leTextField));

    Quelques remarques sur cette conception:

    On crit un code de classe ad hoc : il nest pratiquement pasrutilisable en dehors de ce besoin prcis. De plus la maintenancenest pas facilite: dans le code de la classe dinteraction on na pasle code de contrle dvnement sous les yeux, une modificationde la ralisation peut ncessiter une intervention sur deux fichiers.Que se passe-t-il si on dcide de remplacer le champ JTextFieldpar un JLabel?Cette remarque devient dautant plus pertinente quon peut treamen ne crer quune seule instance de ControleurAction et cibler de nombreux composants dans le code de gestiondvnement.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 2Considrations architecturales 2/56Introduction technique (suite), vnements

    Le gestionnaire dvnement intgr

    Le gestionnaire dvnement peut tre intgr la classe de dispositiongraphique:

    public class Disposition extends JFrame implements ActionListener{...

    private JTextField leTextField ;....

    private int compteur ;

    public void actionPerformed(ActionEvent evt) {leTextField.setText("nombre de clics =" + (++compteur));}

    ....

    bouton.addActionListener(this) ;...

    }

    Ici on a tout sous la main mais:

    si on doit veiller sur plusieurs composants (par exemple faire decette manire des addActionListener sur plusieurs boutons) lecode du gestionnaire dvnement risque de devenir scabreux -ildevra implanter des comportements diffrents en fonction ducomposant source: ce qui est criticable dans le cadre duneprogrammation objets-

    si, de plus, le code doit assurer simultanment la veille deListeners complexes comme MouseListener etWindowListener, on risque daboutir un fouillis degestionnaires dvnements.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 2Considrations architecturales 2/57Introduction technique (suite), vnements

    Le gestionnaire dvnement dans une classe interne

    Une autre solution consiste dfinir une classe de veille dans le contextede la classe de disposition. Ceci est rendu possible en Java par ladfinition dune classe interne.

    public class Disposition extends JFrame {...

    private JTextField leTextField ;....

    private class ControleurAction implements ActionListener{ int compteur ;public void actionPerformed(ActionEvent evt) {

    leTextField.setText(nombre de clics =" + (++compteur));

    }}// fin classe interne

    ....

    bouton.addActionListener(new ControleurAction()) ;...

    }

    On a ici une classe membre dinstance de la classe Disposition qui estsitue dans le contexte de la classe englobante. Du coup linstance duveilleur a directement accs au champ leTextField.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 2Considrations architecturales 2/58Introduction technique (suite), vnements

    Le gestionnaire dvnement dans une classe anonyme

    Dans lexemple prcdent on a une classe interne qui est dfinie alorsquil ny a quune seule instance utilisable. Il est donc possible dutiliserune criture plus synthtique qui est celle dune classe anonyme :

    public class Disposition extends JFrame {...

    private JTextField leTextField ;....

    bouton.addActionListener(new ActionListener() { int compteur ;public void actionPerformed(ActionEvent evt) {

    leTextField.setText(nombre de clics =" + (++compteur));

    }}) ;// fin classe anonyme

    ...

    }

    La syntaxe indique une dfinition la vole dune classe aprs lappel dunew. Cette classe (sans nom) fait implicitement extends Objectimplements ActionListener .

    En voici un autre exemple (une fentre AWT qui ne dispose pas de lotionDISPOSE_ON_CLOSE de JFrame)

    fen.addWindowListener( new WindowAdapter() {public void windowClosing(WindowEvent evt) {

    dispose() ; //mthode de Frame}

    }) ;

    Ici la classe anonyme fait implicitement extends WindowAdapter (on aconsidr que lon tait dans le code dune classe drive de Frame,sinon il aurait fallu crire fentre.dispose() )Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 2Exercices : Mise en place dun veilleur 2/59Introduction technique (suite), vnements

    Exercices :

    Reprendre lexercice prcdent de mise en place dun formulairequestion-rponse et rorganiser le code de manire le rendre leplus rutilisable possible.

    Mise en application : faire en sorte que les saisies soient de laforme:

    cos 0.234sin 0.254

    ....

    (donc en gnral: fonction valeur_double) afficher le rsultatdu calcul (java.lang.Math).

    Pour analyser la chane utiliser unjava.util.StringTokenizer. Pour raliser la transformationchane->double voir classe java.lang.Double.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 2 2/60Introduction technique (suite), vnements

    Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • Processus lgers (threads) 3

    Points essentiels:

    Comment faire raliser plusieurs tches en mme temps? En confiant cestches des processus diffrents. Java dispose dun mcanisme deprocesssus lgers (threads) qui sexcutent en parallle au sein dunemme JVM.

    La notion de Thread

    Cration de Threads, gestion du code et des donnes,

    Cycle de vie dun Thread et contrles de lexcutionIntitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 3Multi-tches (rappel) 3/62Processus lgers (threads)

    Comment un systme dexploitation permet-il davoir plusieurs tchesqui sexcutent en mme temps? Mme sil ne dispose que dun seulprocesseur pour rellement excuter une tche, il est capable de donnerune illusion de paralllisme: pendant quil pilote une imprimante, ilcontinue dialoguer avec lutilisateur par exemple.

    Dans un systme dexploitation multi-tches il y a plusieurs programmes(processus) qui tournent en mme temps. Chacun excute un certaincode et dispose de ses donnes propres. Lillusion de lexcution enparallle est obtenue en nexcutant une partie de code de chaqueprocessus que pendant un laps de temps trs court. Si chaque tche nevoit son tour quune partie de son code excute on aura limpressionque plusieurs programmes sexcutent en parrallle.

    A linterieur du systme lordonnanceur de tches a un rle essentiel :cest lui qui dcide quel sera le processus actif un moment donn etpour combien de temps.

    Pour des raisons diverses il existe des algorithmes dordonnancementdiffrents selon les systmes : un algorithme de time-slicing alloue destranches de temps pratiquement quivalentes pour chaque processus,dans dautres algorithmes un processus actif garde la main jusqu cequil se bloque sur un appel systme comme une opration dE/S.

    Ces algorithmes sont complexes car ils tiennent compte de facteurssupplmentaires comme des priorits entre processus.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 3Processus lgers: principes 3/63Processus lgers (threads)

    Dans de nombreux systmes dexploitation modernes la notion de tcheest gre un niveau plus fin. A lintrieur mme dun processus il existedes processus lgers qui partagent les mmes donnes. Un mmeprogramme peut donc faire vivre plusieurs tches en son sein, et, le caschant, le systme est capable de ventiler ces tches sur plusieursprocesseurs.

    Java intgre la notion de thread lintrieur mme du langage. Une foiscre cette tche va disposer dune pile dexcution qui lui est propre etpartager des codes et des donnes des classes.

    La J.V.M. dexcution pourra soit associer un thread Java un threadsystme soit elle-mme raliser un algorithme dordonnancement.

    Pour permettre une grande souplesse dadaptation la spcification neplace que trs peu de contraintes standard sur les comportements dunthread. Le programmeur ne doit donc surtout pas faire dhypothses sur lecomportement de lalgorithme dordonnancement.

    Voici un exemple de mauvaise conception:

    // A PROSCRIRE !!! Image img = getToolkit().getImage(urlImage) ;//dans un composant AWT

    // mthode asynchrone: le chargement est ralis par une tche de fond while(-1 == img.getHeight(this)) { /* rien : polling */ }

    // tant que limage nest pas charge sa hauteur est -1

    Ce programme ( proscrire!) est susceptible de tomber en marche surdes systmes utilisant le time-slicing et ne fonctionne absolument pas surdautres (tout en touffant la C.P.U.!)1.

    1. Lattente du chargement complet dune image (si elle est ncessaire) se fait laide dun objet MediaTracker.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 3Conception dun Thread 3/64Processus lgers (threads)

    On peut considrer que la classe Java Thread fournit un moteur quipermet dexcuter une tche. Une instance de Thread va disposer decaractristiques propres comme un nom permettant de lidentifier ou unepriorit, mais surtout elle va fournir une pile dexcution pour droulerun code.

    Le code excut par le Thread est fourni par une autre classe qui ralisele contrat dinterface Runnable au travers de sa mthode run().

    import java.io.* ;

    public class Compteur implements Runnable {public final int max ;public Compteur( int max){

    this.max = max ;}

    public void run () {for(int ix = 0 ; ix < max ; ix++) {

    try {File temp = File.createTempFile("cpt","");System.out.println("#"+this+":"+temp);temp.delete() ;

    } catch (IOException exc){/*test */}}

    }// FIN DE TACHE }

    Ceci nous permet la dfinition dune tche comme :

    Thread tche = new Thread(new Compteur(33)) ;

    Ici il sagit dune tche de dmonstration sans porte pratique (laformule magique dans la boucle cre des fichiers temporaires), mais lefait de faire un appel systme lourd dans la boucle va probablementmettre en lumire le comportement de lordonnanceur.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 3Cycle de vie : dbut et fin de vie 3/65Processus lgers (threads)

    Une fois cr le Thread est prt tre activ: ceci se fait par linvocationde la mthode start()sur linstance

    tche.start() ;

    A partir de ce moment le code du run() est pris en charge parlordonnanceur. En fonction des dcisions de lordonnanceur le Threadpasse par une srie dtats: par exemple actif (le code tourne) ou ligible(le code ne tourne pas, mais lordonnanceur peut le ractiver toutmoment).

    Quand le code du run() est puis (on arrive laccolade fermante de lamthode) le Thread devient zombie: linstance du Thread existeencore (jusqu ce quelle soit ventuellement rcupre par le garbage-collector) mais on ne peut plus lui demander de re-excuter la tche(IllegalThreadStateException).

    Pour tester si un Thread est vivant :

    if( tche.isAlive()) { ....

    Cette mthode indique que start() a t excute et que linstance ciblenest pas devenue zombie.Cette mthode nindique pas que le Thread tche est en tat actif (cestle Thread demandeur qui excute le code qui est actif!).

    ActifEligiblenew mortstart()

    Ordonnanceur}//FIN DE TACHErun() {Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 3Point intermdiaire : lancement de threads 3/66Processus lgers (threads)

    Mini-exercice :

    Reprendre le Thread Compteur dcrit prcdemment. Crer unmain qui lance plusieurs Compteurs en parallle et observerlordonnancement (quel thread est actif quel moment).Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 3Cycle de vie: retrait de ltat actif 3/67Processus lgers (threads)

    Dans le code exctu par un thread il est possible de demander passer entat dinligibilit pendant un certain temps. Le code qui sexcute vasinterrompre, et le thread est retir du pool des threads ligibles parlordonnanceur:

    public class Compteur2 implements Runnable {public final int max ;public Compteur2( int max){

    this.max = max ;}

    public void run () {for(int ix = 0 ; ix < max ; ix++) {

    System.out.println(#+this+:+ix);try {

    Thread.sleep(1000) ;} catch (InterruptedException exc) {

    ...// message?}

    }}// FIN DE TACHE

    }

    La mthode de classe Thread.sleep(long millis) rend le thread quilexcute inligible pendant au moins millis millisecondes.On notera que cette mthode est susceptible de propager une exception sion invoque sur linstance courante de ce thread la mthode interrupt().

    La mthode de classe Thread.yield() permet au thread qui lexcute dedemander lordonnanceur de bien vouloir le faire passer ltat ligible.Si il existe dautres threads de priorit au moins quivalente qui sont enattente il est possible que lordonnanceur dcide de rendre un de cesautres threads actif2.

    2. Ceci ne garantit pas que le Thread qui excute yield ne sera pasimmdiatement reactiv par lordonnanceur. Ce dernier est matre de sastratgie, mme sil y a dautre threads ligibles il peut tout fait conserver leThread demandeur en activit puis finalement le dsactiver sur un appelultrieur de yield() (ou pour une autre raison).Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 3Cycle de vie: attente de la terminaison dune tche 3/68Processus lgers (threads)

    La mthode dinstance join() permet au Thread qui lexcutedattendre la fin de lexcution du Thread cible :

    public class CompteurChaine extends Compteur{private Thread autre ;

    public CompteurChaine( int max, Thread autre){super(max) ;this.autre = autre ;// gag si on fait un cycle!

    }

    public void run () {System.out.println(prt: + this ) ;try {

    autre.join() ;} catch (InterruptedException exc) {/*test*/}super.run() ; // mais oui! rien de magique

    }// FIN DE TACHE }

    Le thread qui va excuter ce Runnable va attendre la fin de lexcution duThread pass en paramtre pour excuter la suite du code.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 3Autres techniques de cration 3/69Processus lgers (threads)

    On peut galement dfinir une classe drive de Thread qui spcialise sapropre mthode run().Ceci peut se produire lorsquon a besoin dunthread avec un comportement spcifique (ou aussi pour simplifierlcriture dun code):

    public class UnThread extends Thread {public void run() {

    //qqch a excuter}

    }

    Exemple:

    Thread patience = new Thread() {public void run() {

    while(!isInterrupted()) {System.out.print(.) ;

    }}

    };patience.start() ;..... //on fait des tas de chosespatience.interrupt() ;try {

    patience.join() ;} catch(InterrruptedException xc) { ...}

    On notera galement deux mthodes intressantes en phasedinitialisation:

    setPriority(int prior): permet de fixer la priorit duThread (une valeur comprise entre les constantes MIN_PRIORITYet MAX_PRIORITY)

    setDaemon(boolean b) : permet de spcifier si le Thread estun daemon ou un Thread utilisateur. La machine virtuelleJava sarrte automatiquement quand les seuls threads actifs sontdes deamon.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 3Point intermdiaire : la vie des threads 3/70Processus lgers (threads)

    Mini-exercice :

    Le Thread patience dans lexemple prcdent ne marche pas defaon compltement satisfaisante. Le modifier de faon ce quiltente dalterner son excution avec le Thread principal qui la cr(pour un test essayer par exemple que lun affiche ping et lautrepong -essayer dabord avec yield puis avec sleep -).Vos conclusions?Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 3Etats dun Thread (rsum) 3/71Processus lgers (threads)

    ActifEligible

    En Attente

    new mort

    files dattente(sera vu ultrieurement)

    start() Ordonnanceur

    Thread.yield()

    Thread.sleep()fin attenteinterruption autreThread.join()Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 3Exercice : threads 3/72Processus lgers (threads)

    Exercice:

    Concevoir et raliser un composant Swing ImageAnimee :un Thread permet de dclencher intervalles rguliers laffichagesuccessif des images dun tableau.(Rechercher dabord le composant Swing qui va vous servir depoint de dpart, chercher dans la documentation commentchanger limage courante affiche. Dans le main de test charger lesimages depuis le systme de fichier courant -nous verronsultrieurement une autre manire de recherhcer ces images-).Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 3Complments 3/73Processus lgers (threads)

    Les complments techniques suivants constituent une annexe de rfrence

    ThreadGroup

    Les threads dune application peuvent directement interagir entre eux. Enpratique on peut limiter ces interactions en partitionnant lapplication engroupes de Threads ThreadGroup.

    Les ThreadGroups sont organiss de manire hirarchique. Un Threaddans un ThreadGroup pourra obtenir des informations uniquement surson groupe (voir mthode checkAccess()).

    Des mthodes comme setDaemon(bool) ou setMaxPriority(pri)permettent de fixer des caractristiques globales au groupe (eteventuellement transmises aux sous-groupes crs ). De la mme manirelinvocation de interrupt() permet de diffuser une demandedinterruption aux Threads et sous-groupes du groupe.

    Une possibilit intressante est de crer une classe drive deThreadGroup et de redfinir sa mthodeuncaughtException(Thread, Throwable): on peut ainsi mettre enplace un traitement par dfaut des exceptions qui remontent la pile et quinont pas t captures (pour un traitement dcent Voir Rapports,journalisations, assertions, page 141. ).Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 3Variables partages lies un Thread 3/74Processus lgers (threads)

    Dans certaines situations on peut avoir besoin dune variable partage quine soit pas lie une classe (membre static de classe) mais lie uncontexte de thread. Typiquement une telle variable pourrait tre unidentifiant de session utilisateur sur un serveur: un ensemble de codespourraient avoir besoin dune variable partage qui soit spcifique authread qui les excute.

    Pour rpondre cette situation on peut mettre en place un objet partagde type ThreadLocal.

    public class Session {public static ThreadLocal uid = new ThreadLocal() ;...

    }

    public class TacheUtilisateur implements Runnable {Utilisateur ut ;public TacheUtilisateur(Utilisateur u) {

    ut = u ;}public void run() {

    Session.uid.set(ut) ;....

    } }

    et maintenant dans un code de lapplication:

    utilisateurCourant= (Utilisateur) Session.uid.get();

    Des threads crs par un Thread principal peuvent hriter des valeurspartages de niveau Thread en utilisant un objetInheritableThreadLocal.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 3Images de la mmoire 3/75Processus lgers (threads)

    Le partage de donnes par plusieurs threads pose des problmescompliqus (voir blocs synchronized dans la leon suivante). Il fautsavoir quen Java les variables sont stockes dans une mmoire principalequi contient une copie de rfrence de la variable. Chaque Threaddispose dune copie de travail des variables sur lesquelles il travaille. Lesmises jour rciproques de ces versions dune mme variable reposentsur des mcanismes complexes qui sont dcrits dans le chapitre 17 de JLS(spcification du langage). Il faut comprendre que ce modle permet desralisations trs performantes en laissant une grande libert auxcompilateurs/excuteurs et permet au maximum dutiliser des registres,les instructions en tunnel des processeurs, etc.

    Les blocs synchronized dcrits dans prochaine leon ont pour effet demettre en place des barrires qui forcent ces mises jour. En dehors de cesblocs il est possible de forcer des rconciliations de valeurs en dclarantdes variables membres comme volatile .

    public class Partage {public volatile int valeurCourante;

    }

    Dans ce cas un Thread sait que lorsquil prend une copie de cettevariable sa valeur peut subir des modifications et les compilateurs doiventsinterdire certaines optimisations. Les lectures et critures de cesvariables suivent donc un protocole particulier.Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 3 3/76Processus lgers (threads)

    Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • Accs concurrents 4

    Points essentiels

    Dans la mesure o lon ne contrle pas compltement lordonnancementdes tches qui agissent en parallle, il peut savrer ncessaire de contrlerlaccs un objet de manire ce que deux Threads ne le modifient pasde manire inconsistante. Pour adresser ce problme Java a adopt unmodle de moniteur (C.A.R. Hoare).

    Lorsquun Thread rentre dans un bloc de code synchronizedrattach un objet , il y a un seul de ces Threads qui peut treactif, les autres attendent que le Thread qui possde le verrouainsi acquis le restitue.

    Un Thread en attente dune ressource peut se mettre dans un filedattente o il attendra une notification dun autre Thread quirend la ressource disponible (mcanisme wait/notify).Intitul Cours: Matrise de la programmation en langage JavaRvision : J3Date : 4/6/02

  • 4Accs concurrents: problmatique 4/78Accs concurrents

    Imaginons une classe grant une pile dobjets (ceci nest quun exemple: ilserait inutile dcrire un tel code puisquune classe existejava.util.Stack!)

    class MaPile {... // code divers dont dfinition de MAXprivate Object[] tb = new Object[MAX] ;private int idx = 0 ;

    public void push(Object obj) {//on suppose que lon traite le pb de la taille...

    tb[idx] = obj ;this.idx++ ;

    }

    public Object pop() {// on suppose quon empche// de dpiler une pile vide (exception)....

    this.idx-- ;return tb[idx] ;

    /* autre version avec mnage mmoire * Object res = tb[idx] ; * tb[idx] = null ; * return res ; */

    }....// autre codes dont par ex. la taille de la pile

    }

    Notons quaprs chaque appel lindex idx indique le premieremplacement disponible dans le tableau pour mettre un nouvel objet.

    Et maintenant tudions ce qui se passerait si plusieurs threads pouvaientfaire des demandes la mme instance de MaPile (souvenons nous quenous ne sommes pas matre de lordonnancement des th