Laurent HUBERT vor 7 Jahren
Ursprung
Commit
0b8d88dc82

+ 0 - 382
09-Swing-introduction.html

@@ -1,382 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
-<head>
-  <meta charset="utf-8" />
-  <meta name="generator" content="pandoc" />
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
-  <title>Interfaces graphiques avec Swing</title>
-  <style type="text/css">
-      code{white-space: pre-wrap;}
-      span.smallcaps{font-variant: small-caps;}
-      span.underline{text-decoration: underline;}
-      div.column{display: inline-block; vertical-align: top; width: 50%;}
-  </style>
-  <style type="text/css">
-a.sourceLine { display: inline-block; line-height: 1.25; }
-a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
-a.sourceLine:empty { height: 1.2em; position: absolute; }
-.sourceCode { overflow: visible; }
-code.sourceCode { white-space: pre; position: relative; }
-div.sourceCode { margin: 1em 0; }
-pre.sourceCode { margin: 0; }
-@media screen {
-div.sourceCode { overflow: auto; }
-}
-@media print {
-code.sourceCode { white-space: pre-wrap; }
-a.sourceLine { text-indent: -1em; padding-left: 1em; }
-}
-pre.numberSource a.sourceLine
-  { position: relative; }
-pre.numberSource a.sourceLine:empty
-  { position: absolute; }
-pre.numberSource a.sourceLine::before
-  { content: attr(data-line-number);
-    position: absolute; left: -5em; text-align: right; vertical-align: baseline;
-    border: none; pointer-events: all;
-    -webkit-touch-callout: none; -webkit-user-select: none;
-    -khtml-user-select: none; -moz-user-select: none;
-    -ms-user-select: none; user-select: none;
-    padding: 0 4px; width: 4em;
-    color: #aaaaaa;
-  }
-pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
-div.sourceCode
-  {  }
-@media screen {
-a.sourceLine::before { text-decoration: underline; }
-}
-code span.al { color: #ff0000; font-weight: bold; } /* Alert */
-code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
-code span.at { color: #7d9029; } /* Attribute */
-code span.bn { color: #40a070; } /* BaseN */
-code span.bu { } /* BuiltIn */
-code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
-code span.ch { color: #4070a0; } /* Char */
-code span.cn { color: #880000; } /* Constant */
-code span.co { color: #60a0b0; font-style: italic; } /* Comment */
-code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
-code span.do { color: #ba2121; font-style: italic; } /* Documentation */
-code span.dt { color: #902000; } /* DataType */
-code span.dv { color: #40a070; } /* DecVal */
-code span.er { color: #ff0000; font-weight: bold; } /* Error */
-code span.ex { } /* Extension */
-code span.fl { color: #40a070; } /* Float */
-code span.fu { color: #06287e; } /* Function */
-code span.im { } /* Import */
-code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
-code span.kw { color: #007020; font-weight: bold; } /* Keyword */
-code span.op { color: #666666; } /* Operator */
-code span.ot { color: #007020; } /* Other */
-code span.pp { color: #bc7a00; } /* Preprocessor */
-code span.sc { color: #4070a0; } /* SpecialChar */
-code span.ss { color: #bb6688; } /* SpecialString */
-code span.st { color: #4070a0; } /* String */
-code span.va { color: #19177c; } /* Variable */
-code span.vs { color: #4070a0; } /* VerbatimString */
-code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
-  </style>
-  <link rel="stylesheet" href="pandoc.css">
-  <!--[if lt IE 9]>
-    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
-  <![endif]-->
-</head>
-<body>
-<div class="doctitle">Interfaces graphiques avec Swing</div>
-<nav id="TOC">
-<ul>
-<li><a href="#introduction">Introduction</a><ul>
-<li><a href="#swing-et-java-se">Swing et Java SE</a><ul>
-<li><a href="#une-librairie-historique">Une librairie historique…</a></li>
-<li><a href="#partie-intégrante-de-la-spécification-java-se">… partie intégrante de la spécification Java SE</a></li>
-</ul></li>
-<li><a href="#hello-world">Hello World</a></li>
-</ul></li>
-<li><a href="#instructions-particulières">Instructions particulières</a><ul>
-<li><a href="#fermeture-de-la-fenêtre">Fermeture de la fenêtre</a></li>
-<li><a href="#ajout-dun-composant">Ajout d’un composant</a></li>
-<li><a href="#affichage-de-la-fenêtre">Affichage de la fenêtre</a></li>
-<li><a href="#dimensionnement-automatique-de-la-fenêtre">Dimensionnement automatique de la fenêtre</a></li>
-<li><a href="#le-lancement-thread-safe">Le lancement Thread-safe</a></li>
-</ul></li>
-<li><a href="#les-composants">Les composants</a><ul>
-<li><a href="#le-paquet-awt">Le paquet AWT</a></li>
-<li><a href="#awt-swing">AWT + Swing</a></li>
-<li><a href="#composants-swing">Composants Swing</a><ul>
-<li><a href="#composants-swing-basiques">Composants Swing basiques</a></li>
-<li><a href="#composants-swing-boutons">Composants Swing : boutons</a></li>
-<li><a href="#composants-swing-texte">Composants Swing : texte</a></li>
-</ul></li>
-</ul></li>
-<li><a href="#disposition-des-éléments">Disposition des éléments</a><ul>
-<li><a href="#layout-agencement-et-disposition">Layout : agencement et disposition</a><ul>
-<li><a href="#section"></a></li>
-</ul></li>
-</ul></li>
-<li><a href="#composition-dihm">Composition d’IHM</a></li>
-<li><a href="#exercices">Exercices</a><ul>
-<li><a href="#jbutton-et-jlabel">JButton et JLabel</a></li>
-<li><a href="#jbutton-et-jlabel-1">JButton et JLabel</a></li>
-<li><a href="#jbutton-et-jlabel-2">JButton et JLabel</a></li>
-</ul></li>
-<li><a href="#changer-dapparence">Changer d’apparence</a><ul>
-<li><a href="#le-look-and-feel">Le Look And Feel</a><ul>
-<li><a href="#expérimentation-du-look-and-feel">Expérimentation du Look And Feel</a></li>
-<li><a href="#modification-en-cours-dexécution">Modification en cours d’exécution</a></li>
-<li><a href="#modification-au-démarrage">Modification au démarrage</a></li>
-</ul></li>
-</ul></li>
-<li><a href="#larchitecture-des-swing">L’architecture des Swing</a><ul>
-<li><a href="#larchitecture-mvc">L’architecture MVC</a></li>
-<li><a href="#intérêt-de-mvc">Intérêt de MVC</a></li>
-<li><a href="#swing-est-presque-mvc">Swing est (presque) MVC</a></li>
-</ul></li>
-</ul>
-</nav>
-<h1 id="introduction">Introduction</h1>
-<h2 id="swing-et-java-se">Swing et Java SE</h2>
-<h3 id="une-librairie-historique">Une librairie historique…</h3>
-<p>La librairie Swing est aujourd’hui largement utilisée dans de nombreuses applications Java.</p>
-<div class="incremental">
-<p>JavaFX est une librairie de substitution mise en avant par Oracle et présentée comme devant être privilégiée par rapport à Swing.</p>
-</div>
-<h3 id="partie-intégrante-de-la-spécification-java-se">… partie intégrante de la spécification Java SE</h3>
-<p>Cependant, comme indiqué <a href="http://www.oracle.com/technetwork/java/javafx/overview/faq-1446554.html#6">sur cette page</a>, Swing est et restera une partie de la spécification Java SE.</p>
-<div class="incremental">
-<p>Swing fait donc partie du JRE et le restera.</p>
-</div>
-<h2 id="hello-world">Hello World</h2>
-<p>Le programme Hello World en Swing peut se faire de la manière suivante :</p>
-<div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.swing;</span></a>
-<a class="sourceLine" id="cb1-2" data-line-number="2"></a>
-<a class="sourceLine" id="cb1-3" data-line-number="3"><span class="kw">import</span><span class="im"> javax.swing.JFrame;</span></a>
-<a class="sourceLine" id="cb1-4" data-line-number="4"><span class="kw">import</span><span class="im"> javax.swing.JLabel;</span></a>
-<a class="sourceLine" id="cb1-5" data-line-number="5"><span class="kw">import</span><span class="im"> javax.swing.SwingUtilities;</span></a>
-<a class="sourceLine" id="cb1-6" data-line-number="6"></a>
-<a class="sourceLine" id="cb1-7" data-line-number="7"><span class="kw">public</span> <span class="kw">class</span> HelloSwing <span class="kw">implements</span> <span class="bu">Runnable</span> {</a>
-<a class="sourceLine" id="cb1-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">run</span>(){</a>
-<a class="sourceLine" id="cb1-9" data-line-number="9">        <span class="co">//Initialise la fenêtre</span></a>
-<a class="sourceLine" id="cb1-10" data-line-number="10">        <span class="bu">JFrame</span> frame = <span class="kw">new</span> <span class="bu">JFrame</span>(<span class="st">&quot;Hello Swing&quot;</span>);</a>
-<a class="sourceLine" id="cb1-11" data-line-number="11">        frame.<span class="fu">setDefaultCloseOperation</span>(<span class="bu">JFrame</span>.<span class="fu">EXIT_ON_CLOSE</span>);</a>
-<a class="sourceLine" id="cb1-12" data-line-number="12">        </a>
-<a class="sourceLine" id="cb1-13" data-line-number="13">        <span class="co">//Ajoute un label</span></a>
-<a class="sourceLine" id="cb1-14" data-line-number="14">        <span class="bu">JLabel</span> label = <span class="kw">new</span> <span class="bu">JLabel</span>(<span class="st">&quot;Hello World !!!&quot;</span>);</a>
-<a class="sourceLine" id="cb1-15" data-line-number="15">        frame.<span class="fu">getContentPane</span>().<span class="fu">add</span>(label);</a>
-<a class="sourceLine" id="cb1-16" data-line-number="16">        </a>
-<a class="sourceLine" id="cb1-17" data-line-number="17">        <span class="co">//Positionne et redimensionne la fenêtre</span></a>
-<a class="sourceLine" id="cb1-18" data-line-number="18">        frame.<span class="fu">setBounds</span>(<span class="dv">200</span>, <span class="dv">200</span>, <span class="dv">300</span>, <span class="dv">240</span>);</a>
-<a class="sourceLine" id="cb1-19" data-line-number="19">        frame.<span class="fu">setVisible</span>(<span class="kw">true</span>);</a>
-<a class="sourceLine" id="cb1-20" data-line-number="20">    }</a>
-<a class="sourceLine" id="cb1-21" data-line-number="21">    </a>
-<a class="sourceLine" id="cb1-22" data-line-number="22">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
-<a class="sourceLine" id="cb1-23" data-line-number="23">        <span class="bu">SwingUtilities</span>.<span class="fu">invokeLater</span>(<span class="kw">new</span> <span class="fu">HelloSwing</span>());</a>
-<a class="sourceLine" id="cb1-24" data-line-number="24">    }</a>
-<a class="sourceLine" id="cb1-25" data-line-number="25">}</a></code></pre></div>
-<p>Étapes principales:</p>
-<ul>
-<li>création d’une fenêtre (<code>JFrame</code>)</li>
-<li>création d’un <code>JLabel</code></li>
-<li>récupération du conteneur de la fenêtre (<code>getContentPane()</code>), un <code>JPanel</code></li>
-<li>ajout du label (<code>add(label)</code>)</li>
-</ul>
-<h1 id="instructions-particulières">Instructions particulières</h1>
-<h2 id="fermeture-de-la-fenêtre">Fermeture de la fenêtre</h2>
-<p>L’instruction suivante permet de terminer le programme dès que la fenêtre est fermée:</p>
-<div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb2-1" data-line-number="1">frame.<span class="fu">setDefaultCloseOperation</span>(<span class="bu">JFrame</span>.<span class="fu">EXIT_ON_CLOSE</span>);</a></code></pre></div>
-<h2 id="ajout-dun-composant">Ajout d’un composant</h2>
-<p>L’ajout d’un composant se fait en utilisant la méthode <code>add(JComponent)</code></p>
-<div class="sourceCode" id="cb3"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb3-1" data-line-number="1">frame.<span class="fu">getContentPane</span>().<span class="fu">add</span>(label);</a></code></pre></div>
-<h2 id="affichage-de-la-fenêtre">Affichage de la fenêtre</h2>
-<p>Ajouter l’instruction suivante juste avant la ligne <code>frame.setVisible(true)</code> :</p>
-<div class="sourceCode" id="cb4"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb4-1" data-line-number="1">frame.<span class="fu">setVisible</span>(<span class="kw">true</span>);</a></code></pre></div>
-<h2 id="dimensionnement-automatique-de-la-fenêtre">Dimensionnement automatique de la fenêtre</h2>
-<p>Ajouter l’instruction suivante juste avant la ligne <code>frame.setVisible(true)</code> :</p>
-<div class="sourceCode" id="cb5"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb5-1" data-line-number="1">frame.<span class="fu">pack</span>();</a></code></pre></div>
-<h2 id="le-lancement-thread-safe">Le lancement Thread-safe</h2>
-<p>Comme indiqué <a href="https://docs.oracle.com/javase/8/docs/api/javax/swing/package-summary.html#threading">sur cette page</a> il est nécessaire de lancer l’interface ainsi:</p>
-<div class="sourceCode" id="cb6"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="bu">SwingUtilities</span>.<span class="fu">invokeLater</span>(<span class="kw">new</span> <span class="fu">HelloSwing</span>());</a></code></pre></div>
-<p>Ceci est dû à la manière de gérer les événements et permet d’éviter des exceptions ou bugs lors de l’affichage du programme.</p>
-<h1 id="les-composants">Les composants</h1>
-<h2 id="le-paquet-awt">Le paquet AWT</h2>
-<p>AWT = Abstract Window Toolkit</p>
-<p>Ce paquet fait partie intégrante de l’API Java.</p>
-<p>Il inclut des composants utilisables sur tous les environnements graphiques.</p>
-<figure>
-<img src="images/AWT-classes.png" alt="Classes AWT" /><figcaption>Classes AWT</figcaption>
-</figure>
-<h2 id="awt-swing">AWT + Swing</h2>
-<p>Les composants Swing sont basés sur l’API AWT et les complètent avec des fonctionnalités supplémentaires.</p>
-<figure>
-<img src="images/AWT-classes+swing.png" alt="Classes AWT" /><figcaption>Classes AWT</figcaption>
-</figure>
-<h2 id="composants-swing">Composants Swing</h2>
-<p>Ces composants sont indépendants des environnements graphiques.</p>
-<figure>
-<img src="images/Swing-classes.png" alt="Composants Swing" /><figcaption>Composants Swing</figcaption>
-</figure>
-<h3 id="composants-swing-basiques">Composants Swing basiques</h3>
-<p><code>JPanel</code> et <code>JLabel</code> sont les composants les plus basiques:</p>
-<ul>
-<li><code>JLabel</code>: affichage de texte et/ou image</li>
-<li><code>JPanel</code>: conteneur de base</li>
-</ul>
-<figure>
-<img src="images/Swing-classes-basiques.png" alt="Composants Swing" /><figcaption>Composants Swing</figcaption>
-</figure>
-<h3 id="composants-swing-boutons">Composants Swing : boutons</h3>
-<p>Les boutons permettent d’interagir avec la souris sur les interfaces</p>
-<figure>
-<img src="images/Swing-classes-boutons.png" alt="Composants Swing" /><figcaption>Composants Swing</figcaption>
-</figure>
-<h3 id="composants-swing-texte">Composants Swing : texte</h3>
-<p>Les zones de texte permettent d’afficher/éditer du texte</p>
-<figure>
-<img src="images/Swing-classes-texte.png" alt="Composants Swing" /><figcaption>Composants Swing</figcaption>
-</figure>
-<h1 id="disposition-des-éléments">Disposition des éléments</h1>
-<h2 id="layout-agencement-et-disposition">Layout : agencement et disposition</h2>
-<p>Agencer les composants = assurer une cohérence visuelle</p>
-<div class="incremental">
-<p>Layout = Gestionnaire d’agencement</p>
-<p>L’architecte d’intérieur de l’interface graphique</p>
-<h3 id="section"></h3>
-</div>
-<h1 id="composition-dihm">Composition d’IHM</h1>
-<h1 id="exercices">Exercices</h1>
-<h2 id="jbutton-et-jlabel">JButton et JLabel</h2>
-<p>Créer une fenêtre contenant:</p>
-<ul>
-<li>en premier, un JLabel affichant “&gt;”</li>
-<li>en deuxième position, un JButton affichant le texte “Cliquez ici”</li>
-<li>en premier, un JLabel affichant “&lt;”</li>
-</ul>
-<p>Dimensionner la fenêtre pour que les éléments soient disposés sur une seule ligne</p>
-<h2 id="jbutton-et-jlabel-1">JButton et JLabel</h2>
-<p>Créer une fenêtre contenant:</p>
-<ul>
-<li>en haut, un JLabel affichant “Bonjour”</li>
-<li>en bas, un JButton affichant le texte “Valider”</li>
-</ul>
-<p>Faites en sorte que la dimension de la fenêtre</p>
-<h2 id="jbutton-et-jlabel-2">JButton et JLabel</h2>
-<p>Créer une fenêtre contenant:</p>
-<ul>
-<li>en haut, un JLabel affichant “Bonjour”</li>
-<li>au milieu, un JTextArea contenant le texte <a href="https://loremipsum.io/fr/generator/?n=1&amp;t=p">généré sur cette page</a></li>
-<li>en bas, un JButton affichant le texte “Valider”</li>
-</ul>
-<h1 id="changer-dapparence">Changer d’apparence</h1>
-<h2 id="le-look-and-feel">Le Look And Feel</h2>
-<p>Le <em>Look And Feel</em> est une couche spécifique pour modifier l’affichage et le comportement des composants graphiques.</p>
-<p>Il peut être modifié au démarrage ou en cours d’exécution.</p>
-<h3 id="expérimentation-du-look-and-feel">Expérimentation du Look And Feel</h3>
-<p>Créer la classe <code>SwingExample.java</code> :</p>
-<div class="sourceCode" id="cb7"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.swing;</span></a>
-<a class="sourceLine" id="cb7-2" data-line-number="2"></a>
-<a class="sourceLine" id="cb7-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.awt.BorderLayout;</span></a>
-<a class="sourceLine" id="cb7-4" data-line-number="4"></a>
-<a class="sourceLine" id="cb7-5" data-line-number="5"><span class="kw">import</span><span class="im"> javax.swing.JButton;</span></a>
-<a class="sourceLine" id="cb7-6" data-line-number="6"><span class="kw">import</span><span class="im"> javax.swing.JFrame;</span></a>
-<a class="sourceLine" id="cb7-7" data-line-number="7"><span class="kw">import</span><span class="im"> javax.swing.JLabel;</span></a>
-<a class="sourceLine" id="cb7-8" data-line-number="8"><span class="kw">import</span><span class="im"> javax.swing.SwingUtilities;</span></a>
-<a class="sourceLine" id="cb7-9" data-line-number="9"><span class="kw">import</span><span class="im"> javax.swing.UIManager;</span></a>
-<a class="sourceLine" id="cb7-10" data-line-number="10"><span class="kw">import</span><span class="im"> javax.swing.UnsupportedLookAndFeelException;</span></a>
-<a class="sourceLine" id="cb7-11" data-line-number="11"></a>
-<a class="sourceLine" id="cb7-12" data-line-number="12"><span class="kw">public</span> <span class="kw">class</span> SwingExample {</a>
-<a class="sourceLine" id="cb7-13" data-line-number="13">    <span class="kw">private</span> <span class="bu">JFrame</span> frame ;</a>
-<a class="sourceLine" id="cb7-14" data-line-number="14">    <span class="kw">private</span> <span class="bu">JLabel</span> label ;</a>
-<a class="sourceLine" id="cb7-15" data-line-number="15">    <span class="dt">void</span> <span class="fu">init</span>(){</a>
-<a class="sourceLine" id="cb7-16" data-line-number="16">        <span class="co">//Initialise la fenêtre</span></a>
-<a class="sourceLine" id="cb7-17" data-line-number="17">        frame = <span class="kw">new</span> <span class="bu">JFrame</span>(<span class="st">&quot;Swing Frame&quot;</span>);</a>
-<a class="sourceLine" id="cb7-18" data-line-number="18">        frame.<span class="fu">setDefaultCloseOperation</span>(<span class="bu">JFrame</span>.<span class="fu">EXIT_ON_CLOSE</span>);</a>
-<a class="sourceLine" id="cb7-19" data-line-number="19">        </a>
-<a class="sourceLine" id="cb7-20" data-line-number="20">        <span class="co">//Ajoute un label</span></a>
-<a class="sourceLine" id="cb7-21" data-line-number="21">        label = <span class="kw">new</span> <span class="bu">JLabel</span>(<span class="st">&quot;About to change Look and Feel&quot;</span>);</a>
-<a class="sourceLine" id="cb7-22" data-line-number="22">        frame.<span class="fu">getContentPane</span>().<span class="fu">add</span>(label, <span class="bu">BorderLayout</span>.<span class="fu">NORTH</span>);</a>
-<a class="sourceLine" id="cb7-23" data-line-number="23">        </a>
-<a class="sourceLine" id="cb7-24" data-line-number="24">        <span class="bu">JButton</span> button = <span class="kw">new</span> <span class="bu">JButton</span>(<span class="st">&quot;Does nothing&quot;</span>);</a>
-<a class="sourceLine" id="cb7-25" data-line-number="25">        frame.<span class="fu">getContentPane</span>().<span class="fu">add</span>(button, <span class="bu">BorderLayout</span>.<span class="fu">SOUTH</span>);</a>
-<a class="sourceLine" id="cb7-26" data-line-number="26">        </a>
-<a class="sourceLine" id="cb7-27" data-line-number="27">        <span class="co">//Positionne et redimensionne la fenêtre</span></a>
-<a class="sourceLine" id="cb7-28" data-line-number="28">        frame.<span class="fu">setBounds</span>(<span class="dv">200</span>, <span class="dv">200</span>, <span class="dv">300</span>, <span class="dv">240</span>);</a>
-<a class="sourceLine" id="cb7-29" data-line-number="29">        frame.<span class="fu">setVisible</span>(<span class="kw">true</span>);</a>
-<a class="sourceLine" id="cb7-30" data-line-number="30">    }</a>
-<a class="sourceLine" id="cb7-31" data-line-number="31">    </a>
-<a class="sourceLine" id="cb7-32" data-line-number="32">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setLookAndFeel</span>(<span class="bu">String</span> name, <span class="bu">String</span> className){</a>
-<a class="sourceLine" id="cb7-33" data-line-number="33">        <span class="bu">SwingUtilities</span>.<span class="fu">invokeLater</span>(<span class="kw">new</span> <span class="bu">Runnable</span>(){</a>
-<a class="sourceLine" id="cb7-34" data-line-number="34">            <span class="kw">public</span> <span class="dt">void</span> <span class="fu">run</span>(){</a>
-<a class="sourceLine" id="cb7-35" data-line-number="35">                <span class="kw">try</span> {</a>
-<a class="sourceLine" id="cb7-36" data-line-number="36">                    <span class="bu">UIManager</span>.<span class="fu">setLookAndFeel</span>(className);</a>
-<a class="sourceLine" id="cb7-37" data-line-number="37">                    label.<span class="fu">setText</span>(name);</a>
-<a class="sourceLine" id="cb7-38" data-line-number="38">                    <span class="bu">SwingUtilities</span>.<span class="fu">updateComponentTreeUI</span>(frame);</a>
-<a class="sourceLine" id="cb7-39" data-line-number="39">                    frame.<span class="fu">pack</span>();</a>
-<a class="sourceLine" id="cb7-40" data-line-number="40">                } <span class="kw">catch</span> (<span class="bu">ClassNotFoundException</span> | <span class="bu">InstantiationException</span> | <span class="bu">IllegalAccessException</span></a>
-<a class="sourceLine" id="cb7-41" data-line-number="41">                        | <span class="bu">UnsupportedLookAndFeelException</span> e) {</a>
-<a class="sourceLine" id="cb7-42" data-line-number="42">                    e.<span class="fu">printStackTrace</span>();</a>
-<a class="sourceLine" id="cb7-43" data-line-number="43">                }</a>
-<a class="sourceLine" id="cb7-44" data-line-number="44">            }</a>
-<a class="sourceLine" id="cb7-45" data-line-number="45">        });</a>
-<a class="sourceLine" id="cb7-46" data-line-number="46">        </a>
-<a class="sourceLine" id="cb7-47" data-line-number="47">    }</a>
-<a class="sourceLine" id="cb7-48" data-line-number="48">}</a></code></pre></div>
-<h3 id="modification-en-cours-dexécution">Modification en cours d’exécution</h3>
-<p>Créer et exécuter la classe exécutable <code>LookAndFeel.java</code> :</p>
-<div class="sourceCode" id="cb8"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb8-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.swing;</span></a>
-<a class="sourceLine" id="cb8-2" data-line-number="2"></a>
-<a class="sourceLine" id="cb8-3" data-line-number="3"><span class="kw">import</span><span class="im"> javax.swing.SwingUtilities;</span></a>
-<a class="sourceLine" id="cb8-4" data-line-number="4"><span class="kw">import</span><span class="im"> javax.swing.UIManager;</span></a>
-<a class="sourceLine" id="cb8-5" data-line-number="5"><span class="kw">import</span><span class="im"> javax.swing.UIManager.LookAndFeelInfo;</span></a>
-<a class="sourceLine" id="cb8-6" data-line-number="6"></a>
-<a class="sourceLine" id="cb8-7" data-line-number="7"><span class="kw">public</span> <span class="kw">class</span> <span class="bu">LookAndFeel</span> {</a>
-<a class="sourceLine" id="cb8-8" data-line-number="8">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {        </a>
-<a class="sourceLine" id="cb8-9" data-line-number="9">        SwingExample example = <span class="kw">new</span> <span class="fu">SwingExample</span>();</a>
-<a class="sourceLine" id="cb8-10" data-line-number="10">        <span class="bu">SwingUtilities</span>.<span class="fu">invokeLater</span>(<span class="kw">new</span> <span class="bu">Runnable</span>(){</a>
-<a class="sourceLine" id="cb8-11" data-line-number="11">            <span class="kw">public</span> <span class="dt">void</span> <span class="fu">run</span>(){ example.<span class="fu">init</span>(); }</a>
-<a class="sourceLine" id="cb8-12" data-line-number="12">        });</a>
-<a class="sourceLine" id="cb8-13" data-line-number="13">        </a>
-<a class="sourceLine" id="cb8-14" data-line-number="14">        LookAndFeelInfo[] lafiArray = <span class="bu">UIManager</span>.<span class="fu">getInstalledLookAndFeels</span>();</a>
-<a class="sourceLine" id="cb8-15" data-line-number="15">        <span class="dt">int</span> i = <span class="dv">0</span>;</a>
-<a class="sourceLine" id="cb8-16" data-line-number="16">        <span class="kw">while</span>(<span class="kw">true</span>){</a>
-<a class="sourceLine" id="cb8-17" data-line-number="17">            <span class="kw">if</span>(i &gt;= lafiArray.<span class="fu">length</span>){</a>
-<a class="sourceLine" id="cb8-18" data-line-number="18">                i = <span class="dv">0</span>;</a>
-<a class="sourceLine" id="cb8-19" data-line-number="19">            }</a>
-<a class="sourceLine" id="cb8-20" data-line-number="20">            LookAndFeelInfo lafi = lafiArray[i];</a>
-<a class="sourceLine" id="cb8-21" data-line-number="21">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(lafi.<span class="fu">getName</span>()+<span class="st">&quot; : &quot;</span>+lafi.<span class="fu">getClassName</span>());</a>
-<a class="sourceLine" id="cb8-22" data-line-number="22">            <span class="kw">try</span> {</a>
-<a class="sourceLine" id="cb8-23" data-line-number="23">                <span class="bu">Thread</span>.<span class="fu">sleep</span>(<span class="dv">2000</span>);</a>
-<a class="sourceLine" id="cb8-24" data-line-number="24"></a>
-<a class="sourceLine" id="cb8-25" data-line-number="25">                example.<span class="fu">setLookAndFeel</span>(lafi.<span class="fu">getName</span>(), lafi.<span class="fu">getClassName</span>());</a>
-<a class="sourceLine" id="cb8-26" data-line-number="26">            } <span class="kw">catch</span> (<span class="bu">InterruptedException</span> e) {</a>
-<a class="sourceLine" id="cb8-27" data-line-number="27">                e.<span class="fu">printStackTrace</span>();</a>
-<a class="sourceLine" id="cb8-28" data-line-number="28">            }</a>
-<a class="sourceLine" id="cb8-29" data-line-number="29">            i++;</a>
-<a class="sourceLine" id="cb8-30" data-line-number="30">        }</a>
-<a class="sourceLine" id="cb8-31" data-line-number="31">    }</a>
-<a class="sourceLine" id="cb8-32" data-line-number="32">}</a></code></pre></div>
-<h3 id="modification-au-démarrage">Modification au démarrage</h3>
-<p>Créer une nouvelle classe nommée <code>FixedLookAndFeel</code>.</p>
-<p>Dans la méthode <code>main</code>, utiliser la méthode suivante avec un Look And Feel de votre choix :</p>
-<div class="sourceCode" id="cb9"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb9-1" data-line-number="1"><span class="bu">UIManager</span>.<span class="fu">setLookAndFeel</span>(<span class="bu">String</span> className);</a></code></pre></div>
-<p>Afficher la fenêtre de SwingExample.</p>
-<h1 id="larchitecture-des-swing">L’architecture des Swing</h1>
-<h2 id="larchitecture-mvc">L’architecture MVC</h2>
-<p>Modèle-Vue-Contrôleur</p>
-<figure>
-<img src="images/MVC.png" alt="MVC" /><figcaption>MVC</figcaption>
-</figure>
-<h2 id="intérêt-de-mvc">Intérêt de MVC</h2>
-<figure>
-<img src="images/MVC-utilisateur.png" alt="MVC" /><figcaption>MVC</figcaption>
-</figure>
-<ul>
-<li>évolution</li>
-<li>maintenance</li>
-<li>vues multiples d’une même donnée</li>
-</ul>
-<h2 id="swing-est-presque-mvc">Swing est (presque) MVC</h2>
-<p>Il a été difficile d’appliquer MVC à l’architecture Swing, cependant, celle-ci s’en inspire.</p>
-<figure>
-<img src="images/Swing-architecture.png" alt="MVC" /><figcaption>MVC</figcaption>
-</figure>
-</body>
-</html>

+ 0 - 36
10-LesEntreesSorties.html

@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
-<head>
-  <meta charset="utf-8" />
-  <meta name="generator" content="pandoc" />
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
-  <title>Entrées/sorties</title>
-  <style type="text/css">
-      code{white-space: pre-wrap;}
-      span.smallcaps{font-variant: small-caps;}
-      span.underline{text-decoration: underline;}
-      div.column{display: inline-block; vertical-align: top; width: 50%;}
-  </style>
-  <link rel="stylesheet" href="pandoc.css">
-  <!--[if lt IE 9]>
-    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
-  <![endif]-->
-</head>
-<body>
-<div class="doctitle">Entrées/sorties</div>
-<nav id="TOC">
-<ul>
-<li><a href="#les-entréessorties">Les entrées/sorties</a></li>
-</ul>
-</nav>
-<h1 id="les-entréessorties">Les entrées/sorties</h1>
-<p>Les entrées/sorties (Input/Output ou IO) concernent tout ce qui concerne l’accès aux fichiers.</p>
-<p>Deux packages principaux sont proposés en standard avec Java:</p>
-<ul>
-<li>java.io</li>
-<li>java.nio</li>
-</ul>
-<p>Nous allons uniquement aborder le premier. Pour cela, nous allons suivre ce tutoriel (libre de droits):</p>
-<p>http://anisfrikha.developpez.com/tutoriel/java-io/</p>
-</body>
-</html>

+ 0 - 28
11-ExtensionsEtReutilisationDeCode.html

@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
-<head>
-  <meta charset="utf-8" />
-  <meta name="generator" content="pandoc" />
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
-  <title>les limites de l’héritage</title>
-  <style type="text/css">
-      code{white-space: pre-wrap;}
-      span.smallcaps{font-variant: small-caps;}
-      span.underline{text-decoration: underline;}
-      div.column{display: inline-block; vertical-align: top; width: 50%;}
-  </style>
-  <link rel="stylesheet" href="pandoc.css">
-  <!--[if lt IE 9]>
-    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
-  <![endif]-->
-</head>
-<body>
-<div class="doctitle">les limites de l’héritage</div>
-<nav id="TOC">
-<ul>
-<li><a href="#limites-de-lhéritage">Limites de l’héritage</a></li>
-</ul>
-</nav>
-<h1 id="limites-de-lhéritage">Limites de l’héritage</h1>
-</body>
-</html>

+ 0 - 49
12-JavaFX.html

@@ -1,49 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
-<head>
-  <meta charset="utf-8" />
-  <meta name="generator" content="pandoc" />
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
-  <title>Interfaces graphiques</title>
-  <style type="text/css">
-      code{white-space: pre-wrap;}
-      span.smallcaps{font-variant: small-caps;}
-      span.underline{text-decoration: underline;}
-      div.column{display: inline-block; vertical-align: top; width: 50%;}
-  </style>
-  <link rel="stylesheet" href="pandoc.css">
-  <!--[if lt IE 9]>
-    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
-  <![endif]-->
-</head>
-<body>
-<div class="doctitle">Interfaces graphiques</div>
-<nav id="TOC">
-<ul>
-<li><a href="#interfaces-graphiques-et-javafx">Interfaces graphiques et JavaFX</a><ul>
-<li><a href="#introduction">Introduction</a></li>
-<li><a href="#prise-en-main">Prise en main</a><ul>
-<li><a href="#configuration-de-scenebuilder">Configuration de SceneBuilder</a></li>
-<li><a href="#en-cas-derreur">En cas d’erreur</a></li>
-</ul></li>
-</ul></li>
-</ul>
-</nav>
-<h1 id="interfaces-graphiques-et-javafx">Interfaces graphiques et JavaFX</h1>
-<h2 id="introduction">Introduction</h2>
-<p>JavaFX est une bibliothèque permettant de réaliser des interfaces graphiques.</p>
-<h2 id="prise-en-main">Prise en main</h2>
-<p>Après avoir installé les outils nécessaires (voir le tutoriel et les liens ci-dessous), vous pourrez prendre en main JavaFX, en suivant ce tutoriel:</p>
-<p>http://code.makery.ch/library/javafx-8-tutorial/fr/</p>
-<p>Partie 2:</p>
-<p>https://github.com/marcojakob/code.makery.ch/blob/master/collections/library/javafx-8-tutorial-fr-part2.md</p>
-<h3 id="configuration-de-scenebuilder">Configuration de SceneBuilder</h3>
-<p>Voir ce lien pour la configuration de SceneBuilder avec les différences IDEs:</p>
-<p>https://docs.oracle.com/javafx/scenebuilder/1/use_java_ides/jsbpub-use_java_ides.htm</p>
-<h3 id="en-cas-derreur">En cas d’erreur</h3>
-<p>Vous pouvez tomber sur une erreur de ce type:</p>
-<p><code>Access restriction: The type 'Application' is not API (restriction on required library '/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home/jre/lib/ext/jfxrt.jar')</code></p>
-<p>Dans ce cas, il faut autoriser Eclipse à utiliser les classes qu’ils considère comme ne faisant pas partie de l’API publique de Java.</p>
-<p>Pour remédier à cela, suivre les instructions données sur <a href="https://stackoverflow.com/questions/860187/access-restriction-on-class-due-to-restriction-on-required-library-rt-jar">cette question de StackOverflow</a> (<strong>Attention</strong>: la première réponse ne marche par forcément, mais il y a d’autres pistes)</p>
-</body>
-</html>

+ 0 - 462
13-BaseDeDonnees.html

@@ -1,462 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
-<head>
-  <meta charset="utf-8" />
-  <meta name="generator" content="pandoc" />
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
-  <title>Base de données</title>
-  <style type="text/css">
-      code{white-space: pre-wrap;}
-      span.smallcaps{font-variant: small-caps;}
-      span.underline{text-decoration: underline;}
-      div.column{display: inline-block; vertical-align: top; width: 50%;}
-  </style>
-  <style type="text/css">
-a.sourceLine { display: inline-block; line-height: 1.25; }
-a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
-a.sourceLine:empty { height: 1.2em; position: absolute; }
-.sourceCode { overflow: visible; }
-code.sourceCode { white-space: pre; position: relative; }
-div.sourceCode { margin: 1em 0; }
-pre.sourceCode { margin: 0; }
-@media screen {
-div.sourceCode { overflow: auto; }
-}
-@media print {
-code.sourceCode { white-space: pre-wrap; }
-a.sourceLine { text-indent: -1em; padding-left: 1em; }
-}
-pre.numberSource a.sourceLine
-  { position: relative; }
-pre.numberSource a.sourceLine:empty
-  { position: absolute; }
-pre.numberSource a.sourceLine::before
-  { content: attr(data-line-number);
-    position: absolute; left: -5em; text-align: right; vertical-align: baseline;
-    border: none; pointer-events: all;
-    -webkit-touch-callout: none; -webkit-user-select: none;
-    -khtml-user-select: none; -moz-user-select: none;
-    -ms-user-select: none; user-select: none;
-    padding: 0 4px; width: 4em;
-    color: #aaaaaa;
-  }
-pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
-div.sourceCode
-  {  }
-@media screen {
-a.sourceLine::before { text-decoration: underline; }
-}
-code span.al { color: #ff0000; font-weight: bold; } /* Alert */
-code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
-code span.at { color: #7d9029; } /* Attribute */
-code span.bn { color: #40a070; } /* BaseN */
-code span.bu { } /* BuiltIn */
-code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
-code span.ch { color: #4070a0; } /* Char */
-code span.cn { color: #880000; } /* Constant */
-code span.co { color: #60a0b0; font-style: italic; } /* Comment */
-code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
-code span.do { color: #ba2121; font-style: italic; } /* Documentation */
-code span.dt { color: #902000; } /* DataType */
-code span.dv { color: #40a070; } /* DecVal */
-code span.er { color: #ff0000; font-weight: bold; } /* Error */
-code span.ex { } /* Extension */
-code span.fl { color: #40a070; } /* Float */
-code span.fu { color: #06287e; } /* Function */
-code span.im { } /* Import */
-code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
-code span.kw { color: #007020; font-weight: bold; } /* Keyword */
-code span.op { color: #666666; } /* Operator */
-code span.ot { color: #007020; } /* Other */
-code span.pp { color: #bc7a00; } /* Preprocessor */
-code span.sc { color: #4070a0; } /* SpecialChar */
-code span.ss { color: #bb6688; } /* SpecialString */
-code span.st { color: #4070a0; } /* String */
-code span.va { color: #19177c; } /* Variable */
-code span.vs { color: #4070a0; } /* VerbatimString */
-code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
-  </style>
-  <link rel="stylesheet" href="pandoc.css">
-  <!--[if lt IE 9]>
-    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
-  <![endif]-->
-</head>
-<body>
-<div class="doctitle">Base de données</div>
-<nav id="TOC">
-<ul>
-<li><a href="#accès-à-une-base-de-données">Accès à une base de données</a><ul>
-<li><a href="#introduction">Introduction</a></li>
-<li><a href="#accès-à-une-base-mysql">Accès à une base MySQL</a><ul>
-<li><a href="#installation">Installation</a></li>
-<li><a href="#utilisation">Utilisation</a></li>
-</ul></li>
-<li><a href="#exercice">Exercice</a></li>
-<li><a href="#ecrire-dans-les-bases-de-données">Ecrire dans les bases de données</a></li>
-<li><a href="#pour-aller-plus-loin">Pour aller plus loin</a></li>
-</ul></li>
-</ul>
-</nav>
-<h1 id="accès-à-une-base-de-données">Accès à une base de données</h1>
-<h2 id="introduction">Introduction</h2>
-<p>Nous allons utiliser JDBC pour accéder à une base de données. Il existe d’autres librairies qui permettent l’accès aux bases de données, avec des fonctionnalités plus avancées (par exemple JPA ou Hibernate).</p>
-<p>Cependant JDBC est l’API de bas niveau qui est utilisée par toutes celles de plus haut niveau.</p>
-<p>Nous allons donc découvrir le fonctionnement de cette API et voir comment on peut <em>mapper</em> (c’est-à-dire associer) les entrées d’une base de données avec les membres d’une classe. Ceci revient à faire correspondre les valeurs d’une table aux attributs d’une classe.</p>
-<h2 id="accès-à-une-base-mysql">Accès à une base MySQL</h2>
-<h3 id="installation">Installation</h3>
-<p>Pour commencer, vous allez écrire le programme suivant et le lancer:</p>
-<div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="kw">package</span><span class="im"> fr.greta.dwm2.database;</span></a>
-<a class="sourceLine" id="cb1-2" data-line-number="2"></a>
-<a class="sourceLine" id="cb1-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.sql.*;</span></a>
-<a class="sourceLine" id="cb1-4" data-line-number="4"></a>
-<a class="sourceLine" id="cb1-5" data-line-number="5"><span class="kw">public</span> <span class="kw">class</span> Demo {</a>
-<a class="sourceLine" id="cb1-6" data-line-number="6">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
-<a class="sourceLine" id="cb1-7" data-line-number="7">        <span class="co">//Commençons par charger le pilote:</span></a>
-<a class="sourceLine" id="cb1-8" data-line-number="8">        <span class="kw">try</span> {</a>
-<a class="sourceLine" id="cb1-9" data-line-number="9">            <span class="bu">Class</span>.<span class="fu">forName</span>(<span class="st">&quot;com.mysql.jdbc.Driver&quot;</span>);</a>
-<a class="sourceLine" id="cb1-10" data-line-number="10">        } <span class="kw">catch</span> (<span class="bu">ClassNotFoundException</span> e) {</a>
-<a class="sourceLine" id="cb1-11" data-line-number="11">            e.<span class="fu">printStackTrace</span>();</a>
-<a class="sourceLine" id="cb1-12" data-line-number="12">        }</a>
-<a class="sourceLine" id="cb1-13" data-line-number="13"></a>
-<a class="sourceLine" id="cb1-14" data-line-number="14">    }</a>
-<a class="sourceLine" id="cb1-15" data-line-number="15">}</a></code></pre></div>
-<p>Lancez ce programme. Vous constatez un erreur et c’est normal !</p>
-<p>Ce programme ne va pas marcher car il lui manque un connecteur que vous allez télécharger <a href="https://dev.mysql.com/downloads/connector/j/">sur le site de MySQL</a></p>
-<p>Choisissez une des deux archives, téléchargez-la et décompressez-la.</p>
-<p>Ce connecteur est une librairie qu’il faut ajouter à votre projet.</p>
-<p>Pour cela, ouvrez les propriétés du projet (bouton droit et <code>Properties</code>) et allez sur <code>Java Build Path</code> puis <code>Libraries</code></p>
-<figure>
-<img src="images/librairies.png" alt="Propriété du projet" /><figcaption>Propriété du projet</figcaption>
-</figure>
-<p>Cliquez sur <code>Add Library...</code></p>
-<figure>
-<img src="images/add_library_1.png" alt="Ajout de librairie" /><figcaption>Ajout de librairie</figcaption>
-</figure>
-<p>Sélectionnez <code>User Library</code> et cliquez sur <code>Next</code></p>
-<figure>
-<img src="images/add_library_2.png" alt="Ajout de librairie" /><figcaption>Ajout de librairie</figcaption>
-</figure>
-<p>Cliquez sur <code>User Libraries...</code></p>
-<figure>
-<img src="images/add_library_3.png" alt="Ajout de librairie" /><figcaption>Ajout de librairie</figcaption>
-</figure>
-<p>Cliquez sur <code>New...</code> et entrez comme nom : <code>Connecteur MySQL</code></p>
-<p>Sélectionnez la nouvelle librairie et cliquez sur <code>Add External JARs...</code></p>
-<p>Sélectionnez le fichier <code>mysql-connector-java-X.Y.ZZ-bin.jar</code> qui était dans l’archive puis validez les modifications</p>
-<p>Cliquez sur <code>Source attachment</code> puis sur <code>Edit...</code></p>
-<figure>
-<img src="images/add_library_4.png" alt="Ajout de librairie" /><figcaption>Ajout de librairie</figcaption>
-</figure>
-<p>Choisissez <code>External location</code> puis <code>External Folder...</code> et sélectionnez le répertoire <code>src</code> qui est dans le même dossier que le fichier JAR précédent.</p>
-<p>Validez toutes les modifications pour sortir des préférences</p>
-<figure>
-<img src="images/add_library_5.png" alt="Ajout de librairie" /><figcaption>Ajout de librairie</figcaption>
-</figure>
-<p>Cliquez sur <code>Finish</code> puis sur <code>OK</code></p>
-<p>Relancez le programme: aucune erreur n’apparaît, vous avez chargé un pilote pour le connecteur MySQL.</p>
-<h3 id="utilisation">Utilisation</h3>
-<h4 id="création-dune-base-de-données-de-test">Création d’une base de données de test</h4>
-<p>Vous pouvez soit utiliser <a href="exemples/demojava.sql">ce fichier</a>, soit suivre les instructions ci-dessous.</p>
-<div class="sourceCode" id="cb2"><pre class="sourceCode sql"><code class="sourceCode sql"><a class="sourceLine" id="cb2-1" data-line-number="1">mysql&gt; <span class="kw">create</span> <span class="kw">database</span> demojava ;</a>
-<a class="sourceLine" id="cb2-2" data-line-number="2"><span class="kw">Database</span> changed</a>
-<a class="sourceLine" id="cb2-3" data-line-number="3"></a>
-<a class="sourceLine" id="cb2-4" data-line-number="4">mysql&gt; show <span class="kw">tables</span> ;</a>
-<a class="sourceLine" id="cb2-5" data-line-number="5"><span class="kw">Empty</span> <span class="kw">set</span> (<span class="fl">0.00</span> sec)</a></code></pre></div>
-<p>Nous allons maintenant définir les privilèges d’accès à la base de données:</p>
-<div class="sourceCode" id="cb3"><pre class="sourceCode sql"><code class="sourceCode sql"><a class="sourceLine" id="cb3-1" data-line-number="1">mysql&gt;</a>
-<a class="sourceLine" id="cb3-2" data-line-number="2"><span class="kw">CREATE</span> <span class="fu">USER</span> <span class="st">&#39;demouser&#39;</span>@<span class="st">&#39;%&#39;</span> <span class="kw">IDENTIFIED</span> <span class="kw">BY</span> <span class="st">&#39;MotDePasse&#39;</span>;</a>
-<a class="sourceLine" id="cb3-3" data-line-number="3"></a>
-<a class="sourceLine" id="cb3-4" data-line-number="4">mysql&gt; <span class="kw">GRANT</span> <span class="kw">ALL</span> <span class="kw">PRIVILEGES</span> <span class="kw">ON</span> demojava.* <span class="kw">TO</span> <span class="ot">&quot;demouser&quot;</span>@<span class="ot">&quot;%&quot;</span> <span class="kw">IDENTIFIED</span> <span class="kw">BY</span> <span class="ot">&quot;MotDePasse&quot;</span>;</a>
-<a class="sourceLine" id="cb3-5" data-line-number="5"><span class="kw">Query</span> OK, <span class="dv">0</span> <span class="kw">rows</span> affected (<span class="fl">0.00</span> sec)</a></code></pre></div>
-<p>Le <code>%</code> signifie que n’importe quelle machine pourra se connecter, ce qui n’est pas forcément une bonne chose.</p>
-<p>On pourra le remplacer soit par l’IP de l’hôte si elle est fixe, soit par <code>localhost</code>.</p>
-<p>Puis créer la table de démonstration:</p>
-<div class="sourceCode" id="cb4"><pre class="sourceCode sql"><code class="sourceCode sql"><a class="sourceLine" id="cb4-1" data-line-number="1">mysql&gt; <span class="kw">create</span> <span class="kw">table</span> personne (nom <span class="dt">varchar</span>(<span class="dv">64</span>), prenom <span class="dt">varchar</span>(<span class="dv">64</span>), dnaissance <span class="dt">date</span>);</a>
-<a class="sourceLine" id="cb4-2" data-line-number="2"><span class="kw">Query</span> OK, <span class="dv">0</span> <span class="kw">rows</span> affected (<span class="fl">0.01</span> sec)</a>
-<a class="sourceLine" id="cb4-3" data-line-number="3"></a>
-<a class="sourceLine" id="cb4-4" data-line-number="4">mysql&gt; show <span class="kw">tables</span> ;</a>
-<a class="sourceLine" id="cb4-5" data-line-number="5">+<span class="co">--------------------+</span></a>
-<a class="sourceLine" id="cb4-6" data-line-number="6">| Tables_in_demojava |</a>
-<a class="sourceLine" id="cb4-7" data-line-number="7">+<span class="co">--------------------+</span></a>
-<a class="sourceLine" id="cb4-8" data-line-number="8">| personne           |</a>
-<a class="sourceLine" id="cb4-9" data-line-number="9">+<span class="co">--------------------+</span></a>
-<a class="sourceLine" id="cb4-10" data-line-number="10"><span class="dv">1</span> <span class="kw">row</span> <span class="kw">in</span> <span class="kw">set</span> (<span class="fl">0.00</span> sec)</a></code></pre></div>
-<p>On peut voir la définition de la table avec la commande suivante:</p>
-<div class="sourceCode" id="cb5"><pre class="sourceCode sql"><code class="sourceCode sql"><a class="sourceLine" id="cb5-1" data-line-number="1">mysql&gt; describe personne;</a>
-<a class="sourceLine" id="cb5-2" data-line-number="2">+<span class="co">------------+-------------+------+-----+---------+-------+</span></a>
-<a class="sourceLine" id="cb5-3" data-line-number="3">| Field      | <span class="kw">Type</span>        | <span class="kw">Null</span> | <span class="kw">Key</span> | <span class="kw">Default</span> | Extra |</a>
-<a class="sourceLine" id="cb5-4" data-line-number="4">+<span class="co">------------+-------------+------+-----+---------+-------+</span></a>
-<a class="sourceLine" id="cb5-5" data-line-number="5">| nom        | <span class="dt">varchar</span>(<span class="dv">64</span>) | YES  |     | <span class="kw">NULL</span>    |       |</a>
-<a class="sourceLine" id="cb5-6" data-line-number="6">| prenom     | <span class="dt">varchar</span>(<span class="dv">64</span>) | YES  |     | <span class="kw">NULL</span>    |       |</a>
-<a class="sourceLine" id="cb5-7" data-line-number="7">| dnaissance | <span class="dt">date</span>        | YES  |     | <span class="kw">NULL</span>    |       |</a>
-<a class="sourceLine" id="cb5-8" data-line-number="8">+<span class="co">------------+-------------+------+-----+---------+-------+</span></a>
-<a class="sourceLine" id="cb5-9" data-line-number="9"><span class="dv">3</span> <span class="kw">rows</span> <span class="kw">in</span> <span class="kw">set</span> (<span class="fl">0.01</span> sec)</a></code></pre></div>
-<p>On ajoute une entrée:</p>
-<div class="sourceCode" id="cb6"><pre class="sourceCode sql"><code class="sourceCode sql"><a class="sourceLine" id="cb6-1" data-line-number="1">mysql&gt; <span class="kw">insert</span> <span class="kw">into</span> personne <span class="kw">values</span> (<span class="st">&#39;Luther King&#39;</span>,<span class="st">&#39;Martin&#39;</span>,<span class="st">&#39;1929-01-15&#39;</span>);</a>
-<a class="sourceLine" id="cb6-2" data-line-number="2"><span class="kw">Query</span> OK, <span class="dv">1</span> <span class="kw">row</span> affected (<span class="fl">0.01</span> sec)</a>
-<a class="sourceLine" id="cb6-3" data-line-number="3"></a>
-<a class="sourceLine" id="cb6-4" data-line-number="4">mysql&gt; <span class="kw">select</span> * <span class="kw">from</span> personne ;</a>
-<a class="sourceLine" id="cb6-5" data-line-number="5">+<span class="co">-------------+--------+------------+</span></a>
-<a class="sourceLine" id="cb6-6" data-line-number="6">| nom         | prenom | dnaissance |</a>
-<a class="sourceLine" id="cb6-7" data-line-number="7">+<span class="co">-------------+--------+------------+</span></a>
-<a class="sourceLine" id="cb6-8" data-line-number="8">| Luther King | Martin | <span class="dv">1929-01-15</span> |</a>
-<a class="sourceLine" id="cb6-9" data-line-number="9">+<span class="co">-------------+--------+------------+</span></a>
-<a class="sourceLine" id="cb6-10" data-line-number="10"><span class="dv">1</span> <span class="kw">row</span> <span class="kw">in</span> <span class="kw">set</span> (<span class="fl">0.00</span> sec)</a></code></pre></div>
-<h4 id="connecteur">Connecteur</h4>
-<p>Observez et analysez cet exemple :</p>
-<div class="sourceCode" id="cb7"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="kw">package</span><span class="im"> fr.greta.dwm2.database;</span></a>
-<a class="sourceLine" id="cb7-2" data-line-number="2"></a>
-<a class="sourceLine" id="cb7-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.sql.*;</span></a>
-<a class="sourceLine" id="cb7-4" data-line-number="4"></a>
-<a class="sourceLine" id="cb7-5" data-line-number="5"><span class="kw">public</span> <span class="kw">class</span> ConnectionMySQL {</a>
-<a class="sourceLine" id="cb7-6" data-line-number="6">    <span class="kw">private</span> <span class="bu">Connection</span> connection = <span class="kw">null</span>;</a>
-<a class="sourceLine" id="cb7-7" data-line-number="7">    <span class="kw">private</span> <span class="bu">String</span> user, password, host;</a>
-<a class="sourceLine" id="cb7-8" data-line-number="8"></a>
-<a class="sourceLine" id="cb7-9" data-line-number="9">    <span class="kw">private</span> <span class="dt">static</span> <span class="dt">boolean</span> driverLoaded = <span class="kw">false</span>;</a>
-<a class="sourceLine" id="cb7-10" data-line-number="10"></a>
-<a class="sourceLine" id="cb7-11" data-line-number="11">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">boolean</span> <span class="fu">isDriverLoaded</span>(){</a>
-<a class="sourceLine" id="cb7-12" data-line-number="12">        <span class="kw">return</span> driverLoaded;</a>
-<a class="sourceLine" id="cb7-13" data-line-number="13">    }</a>
-<a class="sourceLine" id="cb7-14" data-line-number="14"></a>
-<a class="sourceLine" id="cb7-15" data-line-number="15">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">init</span>() <span class="kw">throws</span> <span class="bu">ClassNotFoundException</span>, <span class="bu">IllegalAccessException</span>, <span class="bu">InstantiationException</span>{</a>
-<a class="sourceLine" id="cb7-16" data-line-number="16">        <span class="kw">if</span>(!driverLoaded){</a>
-<a class="sourceLine" id="cb7-17" data-line-number="17">            <span class="co">//Chargement du pilote</span></a>
-<a class="sourceLine" id="cb7-18" data-line-number="18">            <span class="bu">Class</span>.<span class="fu">forName</span>(<span class="st">&quot;com.mysql.jdbc.Driver&quot;</span>).<span class="fu">newInstance</span>();</a>
-<a class="sourceLine" id="cb7-19" data-line-number="19">            driverLoaded = <span class="kw">true</span>;</a>
-<a class="sourceLine" id="cb7-20" data-line-number="20">        }</a>
-<a class="sourceLine" id="cb7-21" data-line-number="21">    }</a>
-<a class="sourceLine" id="cb7-22" data-line-number="22"></a>
-<a class="sourceLine" id="cb7-23" data-line-number="23">    <span class="kw">public</span> <span class="fu">ConnectionMySQL</span>() {</a>
-<a class="sourceLine" id="cb7-24" data-line-number="24">        <span class="kw">if</span>(!driverLoaded){</a>
-<a class="sourceLine" id="cb7-25" data-line-number="25">            <span class="kw">throw</span> <span class="kw">new</span> <span class="bu">IllegalStateException</span>(<span class="st">&quot;Cannot instantiate if driver is not loaded. Please call &quot;</span>+<span class="fu">getClass</span>().<span class="fu">getName</span>()+<span class="st">&quot;.init() method before invoking this constructor.&quot;</span>);</a>
-<a class="sourceLine" id="cb7-26" data-line-number="26">        }</a>
-<a class="sourceLine" id="cb7-27" data-line-number="27">    }</a>
-<a class="sourceLine" id="cb7-28" data-line-number="28"></a>
-<a class="sourceLine" id="cb7-29" data-line-number="29">    <span class="kw">public</span> <span class="fu">ConnectionMySQL</span>(<span class="bu">String</span> host, <span class="bu">String</span> user, <span class="bu">String</span> password) {</a>
-<a class="sourceLine" id="cb7-30" data-line-number="30">        <span class="kw">this</span>();</a>
-<a class="sourceLine" id="cb7-31" data-line-number="31">        <span class="kw">this</span>.<span class="fu">host</span> = host;</a>
-<a class="sourceLine" id="cb7-32" data-line-number="32">        <span class="kw">this</span>.<span class="fu">user</span> = user;</a>
-<a class="sourceLine" id="cb7-33" data-line-number="33">        <span class="kw">this</span>.<span class="fu">password</span> = password;</a>
-<a class="sourceLine" id="cb7-34" data-line-number="34">    }</a>
-<a class="sourceLine" id="cb7-35" data-line-number="35"></a>
-<a class="sourceLine" id="cb7-36" data-line-number="36">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">connect</span>() <span class="kw">throws</span> <span class="bu">SQLException</span>{</a>
-<a class="sourceLine" id="cb7-37" data-line-number="37">        <span class="co">//Connexion a la base de données</span></a>
-<a class="sourceLine" id="cb7-38" data-line-number="38">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Connexion à la base de données&quot;</span>);</a>
-<a class="sourceLine" id="cb7-39" data-line-number="39"></a>
-<a class="sourceLine" id="cb7-40" data-line-number="40">        <span class="bu">String</span> dBurl = <span class="st">&quot;jdbc:mysql://&quot;</span>+host+<span class="st">&quot;/demojava&quot;</span>;</a>
-<a class="sourceLine" id="cb7-41" data-line-number="41">        connection = <span class="bu">DriverManager</span>.<span class="fu">getConnection</span>(dBurl, user, password);</a>
-<a class="sourceLine" id="cb7-42" data-line-number="42"></a>
-<a class="sourceLine" id="cb7-43" data-line-number="43">        <span class="co">/*</span></a>
-<a class="sourceLine" id="cb7-44" data-line-number="44"><span class="co">         * Autre utilisation possible:</span></a>
-<a class="sourceLine" id="cb7-45" data-line-number="45"><span class="co">            String dBurl = &quot;jdbc:mysql://&quot;+host+&quot;/demojava&quot;</span></a>
-<a class="sourceLine" id="cb7-46" data-line-number="46"><span class="co">                            + &quot;?user=&quot;+user+&quot;&amp;password=&quot;+password;</span></a>
-<a class="sourceLine" id="cb7-47" data-line-number="47"><span class="co">            connection = DriverManager.getConnection(dBurl);</span></a>
-<a class="sourceLine" id="cb7-48" data-line-number="48"><span class="co">         */</span></a>
-<a class="sourceLine" id="cb7-49" data-line-number="49"></a>
-<a class="sourceLine" id="cb7-50" data-line-number="50">    }</a>
-<a class="sourceLine" id="cb7-51" data-line-number="51">    <span class="kw">public</span> <span class="bu">ResultSet</span> <span class="fu">execute</span>(<span class="bu">String</span> requete) <span class="kw">throws</span> <span class="bu">SQLException</span>{</a>
-<a class="sourceLine" id="cb7-52" data-line-number="52">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;creation et execution de la requête :&quot;</span>+requete);</a>
-<a class="sourceLine" id="cb7-53" data-line-number="53">        <span class="bu">Statement</span> stmt = connection.<span class="fu">createStatement</span>();</a>
-<a class="sourceLine" id="cb7-54" data-line-number="54">        <span class="kw">return</span> stmt.<span class="fu">executeQuery</span>(requete);</a>
-<a class="sourceLine" id="cb7-55" data-line-number="55">    }</a>
-<a class="sourceLine" id="cb7-56" data-line-number="56"></a>
-<a class="sourceLine" id="cb7-57" data-line-number="57">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">close</span>() <span class="kw">throws</span> <span class="bu">SQLException</span>{</a>
-<a class="sourceLine" id="cb7-58" data-line-number="58">        connection.<span class="fu">close</span>();</a>
-<a class="sourceLine" id="cb7-59" data-line-number="59">    }</a>
-<a class="sourceLine" id="cb7-60" data-line-number="60">}</a></code></pre></div>
-<p>Méthode <code>main</code> :</p>
-<div class="sourceCode" id="cb8"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb8-1" data-line-number="1"><span class="kw">package</span><span class="im"> fr.greta.dwm2.database;</span></a>
-<a class="sourceLine" id="cb8-2" data-line-number="2"></a>
-<a class="sourceLine" id="cb8-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.sql.ResultSet;</span></a>
-<a class="sourceLine" id="cb8-4" data-line-number="4"><span class="kw">import</span><span class="im"> java.sql.ResultSetMetaData;</span></a>
-<a class="sourceLine" id="cb8-5" data-line-number="5"><span class="kw">import</span><span class="im"> java.sql.SQLException;</span></a>
-<a class="sourceLine" id="cb8-6" data-line-number="6"></a>
-<a class="sourceLine" id="cb8-7" data-line-number="7"><span class="kw">public</span> <span class="kw">class</span> AfficherTablePersonne {</a>
-<a class="sourceLine" id="cb8-8" data-line-number="8"></a>
-<a class="sourceLine" id="cb8-9" data-line-number="9">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">afficherDonnees</span>(<span class="bu">ResultSet</span> resultats) <span class="kw">throws</span> <span class="bu">SQLException</span>{</a>
-<a class="sourceLine" id="cb8-10" data-line-number="10">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Parcours des donnees retournees&quot;</span>);</a>
-<a class="sourceLine" id="cb8-11" data-line-number="11">        <span class="bu">ResultSetMetaData</span> rsmd = resultats.<span class="fu">getMetaData</span>();</a>
-<a class="sourceLine" id="cb8-12" data-line-number="12">        <span class="dt">int</span> nbCols = rsmd.<span class="fu">getColumnCount</span>();</a>
-<a class="sourceLine" id="cb8-13" data-line-number="13">        <span class="dt">boolean</span> contientDAutresDonnees = resultats.<span class="fu">next</span>();</a>
-<a class="sourceLine" id="cb8-14" data-line-number="14"></a>
-<a class="sourceLine" id="cb8-15" data-line-number="15">        <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">1</span>; i &lt;= nbCols; i++) {</a>
-<a class="sourceLine" id="cb8-16" data-line-number="16">            <span class="kw">if</span>(i &gt; <span class="dv">1</span>) {</a>
-<a class="sourceLine" id="cb8-17" data-line-number="17">                <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">print</span>( <span class="st">&quot; | &quot;</span>);</a>
-<a class="sourceLine" id="cb8-18" data-line-number="18">            }</a>
-<a class="sourceLine" id="cb8-19" data-line-number="19">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">print</span>(rsmd.<span class="fu">getColumnLabel</span>(i));</a>
-<a class="sourceLine" id="cb8-20" data-line-number="20">        }</a>
-<a class="sourceLine" id="cb8-21" data-line-number="21">        <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>();</a>
-<a class="sourceLine" id="cb8-22" data-line-number="22"></a>
-<a class="sourceLine" id="cb8-23" data-line-number="23">        <span class="kw">while</span> (contientDAutresDonnees) {</a>
-<a class="sourceLine" id="cb8-24" data-line-number="24">            <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">1</span>; i &lt;= nbCols; i++){</a>
-<a class="sourceLine" id="cb8-25" data-line-number="25">                <span class="kw">if</span>(i &gt; <span class="dv">1</span>) {</a>
-<a class="sourceLine" id="cb8-26" data-line-number="26">                    <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">print</span>( <span class="st">&quot; | &quot;</span>);</a>
-<a class="sourceLine" id="cb8-27" data-line-number="27">                }</a>
-<a class="sourceLine" id="cb8-28" data-line-number="28">                <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">print</span>(resultats.<span class="fu">getString</span>(i));</a>
-<a class="sourceLine" id="cb8-29" data-line-number="29">            }</a>
-<a class="sourceLine" id="cb8-30" data-line-number="30">            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>();</a>
-<a class="sourceLine" id="cb8-31" data-line-number="31">            contientDAutresDonnees = resultats.<span class="fu">next</span>();</a>
-<a class="sourceLine" id="cb8-32" data-line-number="32">        }</a>
-<a class="sourceLine" id="cb8-33" data-line-number="33"></a>
-<a class="sourceLine" id="cb8-34" data-line-number="34">        resultats.<span class="fu">close</span>();</a>
-<a class="sourceLine" id="cb8-35" data-line-number="35">    }</a>
-<a class="sourceLine" id="cb8-36" data-line-number="36"></a>
-<a class="sourceLine" id="cb8-37" data-line-number="37">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(java.<span class="fu">lang</span>.<span class="fu">String</span>[] args) {</a>
-<a class="sourceLine" id="cb8-38" data-line-number="38">        <span class="kw">try</span> {</a>
-<a class="sourceLine" id="cb8-39" data-line-number="39">            ConnectionMySQL.<span class="fu">init</span>();</a>
-<a class="sourceLine" id="cb8-40" data-line-number="40">        } <span class="kw">catch</span> (<span class="bu">ClassNotFoundException</span> | <span class="bu">IllegalAccessException</span> | <span class="bu">InstantiationException</span> e) {</a>
-<a class="sourceLine" id="cb8-41" data-line-number="41">            <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">&quot;La librairie n&#39;est pas disponible&quot;</span>);</a>
-<a class="sourceLine" id="cb8-42" data-line-number="42">            <span class="bu">System</span>.<span class="fu">exit</span>(<span class="dv">5</span>);</a>
-<a class="sourceLine" id="cb8-43" data-line-number="43">        }</a>
-<a class="sourceLine" id="cb8-44" data-line-number="44"></a>
-<a class="sourceLine" id="cb8-45" data-line-number="45"></a>
-<a class="sourceLine" id="cb8-46" data-line-number="46">        AfficherTablePersonne atp = <span class="kw">new</span> <span class="fu">AfficherTablePersonne</span>();</a>
-<a class="sourceLine" id="cb8-47" data-line-number="47">        ConnectionMySQL connecteur = <span class="kw">new</span> <span class="fu">ConnectionMySQL</span>(<span class="st">&quot;lamp.exemple.cesi&quot;</span>, <span class="st">&quot;demouser&quot;</span>, <span class="st">&quot;MotDePasse&quot;</span>);</a>
-<a class="sourceLine" id="cb8-48" data-line-number="48">        <span class="kw">try</span> {</a>
-<a class="sourceLine" id="cb8-49" data-line-number="49">            connecteur.<span class="fu">connect</span>();</a>
-<a class="sourceLine" id="cb8-50" data-line-number="50"></a>
-<a class="sourceLine" id="cb8-51" data-line-number="51">            <span class="bu">ResultSet</span> resultSet = connecteur.<span class="fu">execute</span>(<span class="st">&quot;SELECT * FROM personne&quot;</span>);</a>
-<a class="sourceLine" id="cb8-52" data-line-number="52">            atp.<span class="fu">afficherDonnees</span>(resultSet);</a>
-<a class="sourceLine" id="cb8-53" data-line-number="53"></a>
-<a class="sourceLine" id="cb8-54" data-line-number="54">            <span class="co">//Bonne pratique: fermer votre résultat</span></a>
-<a class="sourceLine" id="cb8-55" data-line-number="55">            resultSet.<span class="fu">close</span>();</a>
-<a class="sourceLine" id="cb8-56" data-line-number="56"></a>
-<a class="sourceLine" id="cb8-57" data-line-number="57">            <span class="co">//Bonne pratique: fermer le connecteur</span></a>
-<a class="sourceLine" id="cb8-58" data-line-number="58">            connecteur.<span class="fu">close</span>();</a>
-<a class="sourceLine" id="cb8-59" data-line-number="59">        } <span class="kw">catch</span> (<span class="bu">SQLException</span> e) {</a>
-<a class="sourceLine" id="cb8-60" data-line-number="60">            e.<span class="fu">printStackTrace</span>();</a>
-<a class="sourceLine" id="cb8-61" data-line-number="61">        }</a>
-<a class="sourceLine" id="cb8-62" data-line-number="62">        <span class="bu">System</span>.<span class="fu">exit</span>(<span class="dv">0</span>);</a>
-<a class="sourceLine" id="cb8-63" data-line-number="63">    }</a>
-<a class="sourceLine" id="cb8-64" data-line-number="64">}</a></code></pre></div>
-<h2 id="exercice">Exercice</h2>
-<p>Créez une classe qui permette de stocker les résultats en lisant un <code>ResultSet</code> et un algorithme qui instancie une Personne pour chaque entrée de la base.</p>
-<div class="sourceCode" id="cb9"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb9-1" data-line-number="1"></a>
-<a class="sourceLine" id="cb9-2" data-line-number="2"><span class="kw">public</span> <span class="kw">interface</span> Personne{</a>
-<a class="sourceLine" id="cb9-3" data-line-number="3">  <span class="co">//...</span></a>
-<a class="sourceLine" id="cb9-4" data-line-number="4">  <span class="kw">public</span> <span class="bu">String</span> <span class="fu">getNom</span>();</a>
-<a class="sourceLine" id="cb9-5" data-line-number="5">  <span class="kw">public</span> <span class="bu">String</span> <span class="fu">getPrenom</span>();</a>
-<a class="sourceLine" id="cb9-6" data-line-number="6"></a>
-<a class="sourceLine" id="cb9-7" data-line-number="7">  <span class="kw">public</span> <span class="bu">Date</span> <span class="fu">getDateNaissance</span>();</a>
-<a class="sourceLine" id="cb9-8" data-line-number="8">}</a></code></pre></div>
-<h2 id="ecrire-dans-les-bases-de-données">Ecrire dans les bases de données</h2>
-<p>La classe suivante montre comment écrire dans une base de données:</p>
-<div class="sourceCode" id="cb10"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb10-1" data-line-number="1"><span class="kw">package</span><span class="im"> fr.greta.dwm2.database.lecture;</span></a>
-<a class="sourceLine" id="cb10-2" data-line-number="2"></a>
-<a class="sourceLine" id="cb10-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.sql.SQLException;</span></a>
-<a class="sourceLine" id="cb10-4" data-line-number="4"><span class="kw">import</span><span class="im"> java.sql.Statement;</span></a>
-<a class="sourceLine" id="cb10-5" data-line-number="5"><span class="kw">import</span><span class="im"> java.text.SimpleDateFormat;</span></a>
-<a class="sourceLine" id="cb10-6" data-line-number="6"><span class="kw">import</span><span class="im"> java.util.InputMismatchException;</span></a>
-<a class="sourceLine" id="cb10-7" data-line-number="7"><span class="kw">import</span><span class="im"> java.util.List;</span></a>
-<a class="sourceLine" id="cb10-8" data-line-number="8"><span class="kw">import</span><span class="im"> java.util.Scanner;</span></a>
-<a class="sourceLine" id="cb10-9" data-line-number="9"></a>
-<a class="sourceLine" id="cb10-10" data-line-number="10"><span class="kw">import</span><span class="im"> fr.greta.dwm2.database.ConnectionMySQL;</span></a>
-<a class="sourceLine" id="cb10-11" data-line-number="11"><span class="kw">import</span><span class="im"> fr.greta.dwm2.database.DateSimple;</span></a>
-<a class="sourceLine" id="cb10-12" data-line-number="12"><span class="kw">import</span><span class="im"> fr.greta.dwm2.database.Personne;</span></a>
-<a class="sourceLine" id="cb10-13" data-line-number="13"><span class="kw">import</span><span class="im"> fr.greta.dwm2.util.GestionMenu;</span></a>
-<a class="sourceLine" id="cb10-14" data-line-number="14"></a>
-<a class="sourceLine" id="cb10-15" data-line-number="15"><span class="kw">public</span> <span class="kw">class</span> Ecriture {</a>
-<a class="sourceLine" id="cb10-16" data-line-number="16">    <span class="co">//INSERT INTO `personne`(`nom`, `prenom`, `dnaissance`) VALUES (&#39;RABHI&#39;,&#39;Pierre&#39;,&#39;1938-05-29&#39;)</span></a>
-<a class="sourceLine" id="cb10-17" data-line-number="17"></a>
-<a class="sourceLine" id="cb10-18" data-line-number="18">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">remplir</span>(ConnectionMySQL connecteur){</a>
-<a class="sourceLine" id="cb10-19" data-line-number="19">        <span class="co">//Nécessaire pour faire les insertions</span></a>
-<a class="sourceLine" id="cb10-20" data-line-number="20">        <span class="bu">Statement</span> stmt = <span class="kw">null</span>;</a>
-<a class="sourceLine" id="cb10-21" data-line-number="21">        <span class="kw">try</span> {</a>
-<a class="sourceLine" id="cb10-22" data-line-number="22">            connecteur.<span class="fu">connect</span>();</a>
-<a class="sourceLine" id="cb10-23" data-line-number="23">            stmt = connecteur.<span class="fu">getConnection</span>().<span class="fu">createStatement</span>();</a>
-<a class="sourceLine" id="cb10-24" data-line-number="24">            <span class="dt">boolean</span> continuer = <span class="kw">true</span>;</a>
-<a class="sourceLine" id="cb10-25" data-line-number="25">            <span class="kw">while</span>(continuer){</a>
-<a class="sourceLine" id="cb10-26" data-line-number="26">                <span class="bu">String</span> nom = GestionMenu.<span class="fu">getInstance</span>().<span class="fu">getValeur</span>(<span class="st">&quot;Entrez le nom:&quot;</span>);</a>
-<a class="sourceLine" id="cb10-27" data-line-number="27">                <span class="bu">String</span> prenom = GestionMenu.<span class="fu">getInstance</span>().<span class="fu">getValeur</span>(<span class="st">&quot;Entrez le prénom:&quot;</span>);</a>
-<a class="sourceLine" id="cb10-28" data-line-number="28">                DateSimple ds = <span class="kw">null</span>;</a>
-<a class="sourceLine" id="cb10-29" data-line-number="29">                <span class="kw">while</span>(ds == <span class="kw">null</span>){</a>
-<a class="sourceLine" id="cb10-30" data-line-number="30">                    <span class="bu">String</span> date = GestionMenu.<span class="fu">getInstance</span>().<span class="fu">getValeur</span>(<span class="st">&quot;Entrez une date:&quot;</span>);</a>
-<a class="sourceLine" id="cb10-31" data-line-number="31">                    ds = DateSimple.<span class="fu">checkDate</span>(date);</a>
-<a class="sourceLine" id="cb10-32" data-line-number="32">                }</a>
-<a class="sourceLine" id="cb10-33" data-line-number="33">                <span class="fu">inserer</span>(stmt, nom, prenom, ds);</a>
-<a class="sourceLine" id="cb10-34" data-line-number="34">                <span class="bu">String</span> doitContinuer = GestionMenu.<span class="fu">getInstance</span>().<span class="fu">getValeur</span>(<span class="st">&quot;Continuer (o/n):&quot;</span>);</a>
-<a class="sourceLine" id="cb10-35" data-line-number="35">                continuer = doitContinuer.<span class="fu">equals</span>(<span class="st">&quot;o&quot;</span>);</a>
-<a class="sourceLine" id="cb10-36" data-line-number="36">            }</a>
-<a class="sourceLine" id="cb10-37" data-line-number="37">        } <span class="kw">catch</span> (<span class="bu">SQLException</span> e) {</a>
-<a class="sourceLine" id="cb10-38" data-line-number="38">            e.<span class="fu">printStackTrace</span>();</a>
-<a class="sourceLine" id="cb10-39" data-line-number="39">        }</a>
-<a class="sourceLine" id="cb10-40" data-line-number="40">        <span class="kw">finally</span>{</a>
-<a class="sourceLine" id="cb10-41" data-line-number="41">            <span class="kw">if</span> (stmt != <span class="kw">null</span>) {</a>
-<a class="sourceLine" id="cb10-42" data-line-number="42">                <span class="kw">try</span> {</a>
-<a class="sourceLine" id="cb10-43" data-line-number="43">                    stmt.<span class="fu">close</span>();</a>
-<a class="sourceLine" id="cb10-44" data-line-number="44">                } <span class="kw">catch</span> (<span class="bu">SQLException</span> e) {</a>
-<a class="sourceLine" id="cb10-45" data-line-number="45">                    <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">&quot;Erreur à la sortie&quot;</span>);</a>
-<a class="sourceLine" id="cb10-46" data-line-number="46">                    e.<span class="fu">printStackTrace</span>();</a>
-<a class="sourceLine" id="cb10-47" data-line-number="47">                }</a>
-<a class="sourceLine" id="cb10-48" data-line-number="48">            }</a>
-<a class="sourceLine" id="cb10-49" data-line-number="49">        }</a>
-<a class="sourceLine" id="cb10-50" data-line-number="50">    }</a>
-<a class="sourceLine" id="cb10-51" data-line-number="51"></a>
-<a class="sourceLine" id="cb10-52" data-line-number="52"></a>
-<a class="sourceLine" id="cb10-53" data-line-number="53">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">changerDate</span>(ConnectionMySQL connecteur){</a>
-<a class="sourceLine" id="cb10-54" data-line-number="54">        <span class="co">//Nécessaire pour faire les insertions</span></a>
-<a class="sourceLine" id="cb10-55" data-line-number="55">        <span class="bu">Statement</span> stmt = <span class="kw">null</span>;</a>
-<a class="sourceLine" id="cb10-56" data-line-number="56">        <span class="kw">try</span> {</a>
-<a class="sourceLine" id="cb10-57" data-line-number="57">            connecteur.<span class="fu">connect</span>();</a>
-<a class="sourceLine" id="cb10-58" data-line-number="58">            stmt = connecteur.<span class="fu">getConnection</span>().<span class="fu">createStatement</span>();</a>
-<a class="sourceLine" id="cb10-59" data-line-number="59">            <span class="dt">boolean</span> continuer = <span class="kw">true</span>;</a>
-<a class="sourceLine" id="cb10-60" data-line-number="60">            <span class="kw">while</span>(continuer){</a>
-<a class="sourceLine" id="cb10-61" data-line-number="61">                <span class="bu">String</span> nom = GestionMenu.<span class="fu">getInstance</span>().<span class="fu">getValeur</span>(<span class="st">&quot;Entrez le nom:&quot;</span>);</a>
-<a class="sourceLine" id="cb10-62" data-line-number="62">                <span class="bu">String</span> prenom = GestionMenu.<span class="fu">getInstance</span>().<span class="fu">getValeur</span>(<span class="st">&quot;Entrez le prénom:&quot;</span>);</a>
-<a class="sourceLine" id="cb10-63" data-line-number="63">                DateSimple ds = <span class="kw">null</span>;</a>
-<a class="sourceLine" id="cb10-64" data-line-number="64">                <span class="kw">while</span>(ds == <span class="kw">null</span>){</a>
-<a class="sourceLine" id="cb10-65" data-line-number="65">                    <span class="bu">String</span> date = GestionMenu.<span class="fu">getInstance</span>().<span class="fu">getValeur</span>(<span class="st">&quot;Entrez une date:&quot;</span>);</a>
-<a class="sourceLine" id="cb10-66" data-line-number="66">                    ds = DateSimple.<span class="fu">checkDate</span>(date);</a>
-<a class="sourceLine" id="cb10-67" data-line-number="67">                }</a>
-<a class="sourceLine" id="cb10-68" data-line-number="68">                <span class="fu">inserer</span>(stmt, nom, prenom, ds);</a>
-<a class="sourceLine" id="cb10-69" data-line-number="69">                <span class="bu">String</span> doitContinuer = GestionMenu.<span class="fu">getInstance</span>().<span class="fu">getValeur</span>(<span class="st">&quot;Continuer (o/n):&quot;</span>);</a>
-<a class="sourceLine" id="cb10-70" data-line-number="70">                continuer = doitContinuer.<span class="fu">equals</span>(<span class="st">&quot;o&quot;</span>);</a>
-<a class="sourceLine" id="cb10-71" data-line-number="71">            }</a>
-<a class="sourceLine" id="cb10-72" data-line-number="72">        } <span class="kw">catch</span> (<span class="bu">SQLException</span> e) {</a>
-<a class="sourceLine" id="cb10-73" data-line-number="73">            e.<span class="fu">printStackTrace</span>();</a>
-<a class="sourceLine" id="cb10-74" data-line-number="74">        }</a>
-<a class="sourceLine" id="cb10-75" data-line-number="75">        <span class="kw">finally</span>{</a>
-<a class="sourceLine" id="cb10-76" data-line-number="76">            <span class="kw">if</span> (stmt != <span class="kw">null</span>) {</a>
-<a class="sourceLine" id="cb10-77" data-line-number="77">                <span class="kw">try</span> {</a>
-<a class="sourceLine" id="cb10-78" data-line-number="78">                    stmt.<span class="fu">close</span>();</a>
-<a class="sourceLine" id="cb10-79" data-line-number="79">                } <span class="kw">catch</span> (<span class="bu">SQLException</span> e) {</a>
-<a class="sourceLine" id="cb10-80" data-line-number="80">                    <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">&quot;Erreur à la sortie&quot;</span>);</a>
-<a class="sourceLine" id="cb10-81" data-line-number="81">                    e.<span class="fu">printStackTrace</span>();</a>
-<a class="sourceLine" id="cb10-82" data-line-number="82">                }</a>
-<a class="sourceLine" id="cb10-83" data-line-number="83">            }</a>
-<a class="sourceLine" id="cb10-84" data-line-number="84">        }</a>
-<a class="sourceLine" id="cb10-85" data-line-number="85">    }</a>
-<a class="sourceLine" id="cb10-86" data-line-number="86"></a>
-<a class="sourceLine" id="cb10-87" data-line-number="87">    <span class="kw">public</span> <span class="dt">void</span> <span class="fu">inserer</span>(<span class="bu">Statement</span> stmt,</a>
-<a class="sourceLine" id="cb10-88" data-line-number="88">            <span class="bu">String</span> nom, <span class="bu">String</span> prenom, DateSimple date) <span class="kw">throws</span> <span class="bu">SQLException</span>{</a>
-<a class="sourceLine" id="cb10-89" data-line-number="89">        stmt.<span class="fu">executeUpdate</span>(</a>
-<a class="sourceLine" id="cb10-90" data-line-number="90">                <span class="st">&quot;insert into personne &quot;</span> +</a>
-<a class="sourceLine" id="cb10-91" data-line-number="91">                <span class="st">&quot;values(&#39;&quot;</span>+nom+<span class="st">&quot;&#39;, &#39;&quot;</span>+prenom+<span class="st">&quot;&#39;, &#39;&quot;</span>+date.<span class="fu">getSqlRepresentation</span>()+<span class="st">&quot;&#39;)&quot;</span>);</a>
-<a class="sourceLine" id="cb10-92" data-line-number="92">    }</a>
-<a class="sourceLine" id="cb10-93" data-line-number="93"></a>
-<a class="sourceLine" id="cb10-94" data-line-number="94">    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
-<a class="sourceLine" id="cb10-95" data-line-number="95">        <span class="kw">try</span> {</a>
-<a class="sourceLine" id="cb10-96" data-line-number="96">            ConnectionMySQL.<span class="fu">init</span>();</a>
-<a class="sourceLine" id="cb10-97" data-line-number="97">        } <span class="kw">catch</span> (<span class="bu">ClassNotFoundException</span> | <span class="bu">IllegalAccessException</span> | <span class="bu">InstantiationException</span> e) {</a>
-<a class="sourceLine" id="cb10-98" data-line-number="98">            <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">&quot;La librairie n&#39;est pas disponible&quot;</span>);</a>
-<a class="sourceLine" id="cb10-99" data-line-number="99">            <span class="bu">System</span>.<span class="fu">exit</span>(<span class="dv">5</span>);</a>
-<a class="sourceLine" id="cb10-100" data-line-number="100">        }</a>
-<a class="sourceLine" id="cb10-101" data-line-number="101"></a>
-<a class="sourceLine" id="cb10-102" data-line-number="102"></a>
-<a class="sourceLine" id="cb10-103" data-line-number="103">        <span class="co">//On peut continuer ici:</span></a>
-<a class="sourceLine" id="cb10-104" data-line-number="104">        ConnectionMySQL connecteur = <span class="kw">new</span> <span class="fu">ConnectionMySQL</span>(<span class="st">&quot;lamp.exemple.cesi&quot;</span>, <span class="st">&quot;demouser&quot;</span>, <span class="st">&quot;MotDePasse&quot;</span>);</a>
-<a class="sourceLine" id="cb10-105" data-line-number="105">        Ecriture ins = <span class="kw">new</span> <span class="fu">Ecriture</span>();</a>
-<a class="sourceLine" id="cb10-106" data-line-number="106">        ins.<span class="fu">remplir</span>(connecteur);</a>
-<a class="sourceLine" id="cb10-107" data-line-number="107"></a>
-<a class="sourceLine" id="cb10-108" data-line-number="108">    }</a>
-<a class="sourceLine" id="cb10-109" data-line-number="109">}</a></code></pre></div>
-<p>Le code source des classes qu’elle utilise est disponible <a href="exemples/database">ici</a> :</p>
-<ul>
-<li><a href="exemples/database/fr/greta/dwm2/util/GestionMenu.java">GestionMenu.java</a></li>
-<li><a href="exemples/database/fr/greta/dwm2/database/DateSimple.java">DateSimple.java</a></li>
-</ul>
-<p>Voir aussi cette page : <a href="http://docs.oracle.com/javase/tutorial/jdbc/basics/retrieving.html">Retrieving and Modifying Values from Result Sets</a></p>
-<h2 id="pour-aller-plus-loin">Pour aller plus loin</h2>
-<p>Des exemples complets sur l’ensemble des fonctionnalités JDBC <a href="http://docs.oracle.com/javase/tutorial/jdbc/basics/index.html">sont disponibles ici</a>.</p>
-</body>
-</html>

+ 0 - 137
14-ThreadEtExecutionSimultanee.html

@@ -1,137 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
-<head>
-  <meta charset="utf-8" />
-  <meta name="generator" content="pandoc" />
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
-  <title>Thread</title>
-  <style type="text/css">
-      code{white-space: pre-wrap;}
-      span.smallcaps{font-variant: small-caps;}
-      span.underline{text-decoration: underline;}
-      div.column{display: inline-block; vertical-align: top; width: 50%;}
-  </style>
-  <link rel="stylesheet" href="pandoc.css">
-  <!--[if lt IE 9]>
-    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
-  <![endif]-->
-</head>
-<body>
-<div class="doctitle">Thread</div>
-<nav id="TOC">
-<ul>
-<li><a href="#thread-et-exécutions-concurrentes">Thread et exécutions concurrentes</a><ul>
-<li><a href="#introduction">Introduction</a></li>
-<li><a href="#observations">Observations</a><ul>
-<li><a href="#parallélisme">Parallélisme</a></li>
-<li><a href="#mise-en-pause-dun-thread">Mise en pause d’un Thread</a></li>
-<li><a href="#attente-de-fin-dexécution-dun-thread">Attente de fin d’exécution d’un Thread</a></li>
-<li><a href="#modification-conflictuelle-dune-même-ressource">Modification conflictuelle d’une même ressource</a></li>
-<li><a href="#exclusion-mutuelle-avec-synchronized">Exclusion mutuelle avec synchronized</a></li>
-<li><a href="#compte-en-banque-non-sécurisé">Compte en banque non sécurisé</a></li>
-<li><a href="#manipulation-de-comptes-mutuellement-exclusives">Manipulation de comptes mutuellement exclusives</a></li>
-<li><a href="#manipulation-de-comptes-mutuellement-exclusives-version-sans-boucle">Manipulation de comptes mutuellement exclusives version sans boucle</a></li>
-</ul></li>
-<li><a href="#exercices">Exercices</a><ul>
-<li><a href="#semaphore-et-lock">Semaphore et Lock</a></li>
-<li><a href="#le-problème-du-producteurconsommateur-verrou">Le problème du producteur/consommateur (verrou)</a></li>
-<li><a href="#le-problème-du-producteurconsommateur-moniteurs">Le problème du producteur/consommateur (moniteurs)</a></li>
-<li><a href="#application-des-countdownlatch-et-cyclicbarrier">Application des CountDownLatch et CyclicBarrier</a></li>
-</ul></li>
-<li><a href="#ressources">Ressources</a></li>
-</ul></li>
-</ul>
-</nav>
-<h1 id="thread-et-exécutions-concurrentes">Thread et exécutions concurrentes</h1>
-<h2 id="introduction">Introduction</h2>
-<p>De nos jours, les ordinateurs sont multi-tâches et sont capables d’exécuter plusieurs opérations simultanément (mise à jour en tâche de fond, contrôle de la bonne exécution d’une opération par une application tierce, etc).</p>
-<p>Il est fréquent que plusieurs acteurs accèdent de manière concurrente à une même ressource. Cela peut engendrer différents problèmes.</p>
-<h2 id="observations">Observations</h2>
-<h3 id="parallélisme">Parallélisme</h3>
-<p>Compiler et exécuter la classe <code>Thread1Parallelisme</code>.</p>
-<p>Le programme crée trois <em>threads</em> qui affichent 100 fois respectivement <code>Hello</code>, <code>World</code> et <code>and Everybody</code>.</p>
-<p>Que pouvez vous dire à propos de l’ordre d’affichage ? Expliquer.</p>
-<p><strong>Remarque</strong></p>
-<p>Ce programme hérite de <code>Thread</code> et réimplémente la méthode <code>run()</code> pour obtenir des flots d’exécutions parallèles.</p>
-<h3 id="mise-en-pause-dun-thread">Mise en pause d’un Thread</h3>
-<p>Compiler et exécuter plusieurs fois la classe <code>Thread2Sleep</code>.</p>
-<p>Voyez vous tous les affichages ?</p>
-<p>Essayez d’augmenter les valeurs d’attente (le troisième argument passé lors de la création des threads). Par quelle méthode de l’API Java est utilisé cette valeur ?</p>
-<p>Si vous mettez de trop grandes valeurs, vous devriez parfois ne plus voir aucun affichage.</p>
-<p><strong>Pourquoi ?</strong></p>
-<h3 id="attente-de-fin-dexécution-dun-thread">Attente de fin d’exécution d’un Thread</h3>
-<p>Dans la classe <code>Thread3Join</code>, nous faisons appel à la fonction join qui force le programme principal à attendre la terminaison des threads.</p>
-<p>Compiler le programme, Modifiez les valeurs d’attente (paramètre <code>delai</code>) et s’assurer que tous les affichages sont présents.</p>
-<h3 id="modification-conflictuelle-dune-même-ressource">Modification conflictuelle d’une même ressource</h3>
-<p>Dans la classe <code>Thread4ModificationConflictuelle</code>, nous manipulons une variable partagée d etype <code>Tableau</code>.</p>
-<p>Les Thread sont instanciés en leur donnant en paramètre un objet de type <code>Runnable</code> : la méthode <code>Runnable.run()</code> est exécutée par le Thread.</p>
-<p>Ces objets sont fabriqués par la classe <code>TacheTableau</code>. Deux types de tâches sont effectuées:</p>
-<ul>
-<li>les tâches <em>Déposer</em> incrémentent les valeurs dans le tableau</li>
-<li>les tâches <em>Retirer</em> décrémentent les valeurs dans le tableau</li>
-</ul>
-<p>Logiquement, à la fin les valeurs doivent être égales à 0 puisque les tâches incrémentant et décrementant s’annulent.</p>
-<p>Exécuter plusieurs fois le programme. Y a-t-il des cas où le résultat est différent ?</p>
-<h3 id="exclusion-mutuelle-avec-synchronized">Exclusion mutuelle avec synchronized</h3>
-<p>Pour corriger le problème dans l’exemple précédent, on ajoute le mot clé <code>synchronized</code> aux deux méthodes <code>incrementerValeurs</code> et <code>decrementerValeurs</code>.</p>
-<p>Exécuter le programme. S’assurer que le comportement est correct. Que remarquez vous au niveau du temps d’exécution ? Expliquer.</p>
-<h3 id="compte-en-banque-non-sécurisé">Compte en banque non sécurisé</h3>
-<p>Dans <code>Thread6CompteEnBanqueSansVerrou</code> la ressource partagée est un compte et non un tableau. Les opérations sont débiter, créditer et consulter.</p>
-<p>Est-ce que le solde est toujours égal à 0 à la fin ?</p>
-<h3 id="manipulation-de-comptes-mutuellement-exclusives">Manipulation de comptes mutuellement exclusives</h3>
-<p>Dans la classe <code>Thread7CompteSynchronized</code>, nous reprenons l’exemple de manipulation de comptes.</p>
-<p>Le programme est modifié pour interdire le retrait s’il n’y a pas assez d’argent.</p>
-<p>Quand le solde est insuffisant, les threads de retrait attendent (<code>wait()</code> dans la méthode <code>debiter</code>), ils sont réveillés par les threads de dépôt qui appellent la méthode <code>crediter</code> contenant un appel à <code>notify()</code>.</p>
-<p>Compiler et observer l’exécution de Thread7CompteSynchronized.</p>
-<p>Essayer de trouver un cas où un appel à retirer est fait avec un solde <code>0</code>. Que se passe-t-il ?</p>
-<h3 id="manipulation-de-comptes-mutuellement-exclusives-version-sans-boucle">Manipulation de comptes mutuellement exclusives version sans boucle</h3>
-<p>La classe <code>Thread8MutexSansBoucle</code> utilise <code>CompteMutexIf</code> est quasi identique à la classe <code>CompteMutex</code>.</p>
-<p>La différence tient dans le fait que pour la vérification de la condition avant <code>wait</code>, nous avons remplace le <code>while</code> par un <code>if</code>.</p>
-<p>Y a-t-il des cas où le solde devient négatif ? Expliquer.</p>
-<h2 id="exercices">Exercices</h2>
-<h3 id="semaphore-et-lock">Semaphore et Lock</h3>
-<p>Cet exercice est à faire initialement sur feuille papier, avant d’être programmé.</p>
-<p>Faites une recherche sur le concept de sémaphore dans le domaine du parallélisme.</p>
-<p>Etudiez la classe <code>DemoSemaphore</code>. Modifez les valeurs suivantes dans le <code>main</code>:</p>
-<ul>
-<li>paramètre <code>token</code> sur le constructeur</li>
-<li><code>numberOfLoops</code></li>
-</ul>
-<p>Observez ce qui se passe et concluez.</p>
-<p>Faites de même avec la classe <code>DemoLock</code>.</p>
-<p>Etudiez la documentation sur la classe <code>Semaphore</code>.</p>
-<p>Etudiez cette classe et l’interface <code>Lock</code> (et les classes qui l’implémentent).</p>
-<h3 id="le-problème-du-producteurconsommateur-verrou">Le problème du producteur/consommateur (verrou)</h3>
-<p>Programmer le problème du producteur/consommateur en utilisant les <code>Lock</code>. Pour cela, écrire une classe Stockage contenant un tableau d’Object ainsi que les méthodes <code>Object consomme()</code> et <code>void produit(Object)</code>.</p>
-<p>Écrire un programme principal qui instancie un objet Stockage puis qui crée de nombreux threads dont certains vont produire et d’autres consommer des objets.</p>
-<p>Faites en sorte que l’on puisse observer le déroulement des synchronisations (par exemple avec des <code>System.out.println()</code> judicieusement placés). Pour cela, vous aurez probablement à ralentir vos threads (en insérant des appels à <code>sleep(int)</code> à l’intérieur des sections critiques ou entre les productions/consommations d’objets).</p>
-<p>Note : vous pouvez utiliser la classe <code>Random</code> (voir la Javadoc) pour générer des temps d’attente aléatoires, ainsi que la classe <code>TimeUnit</code>.</p>
-<p>Gardez des traces montrant que certains threads sont effectivement endormis (et réveillés plus tard) lorsqu’ils essayent de consommer alors que le stockage est vide ou bien au contraire lorsqu’ils essayent de produire alors que le stockage est plein.</p>
-<h3 id="le-problème-du-producteurconsommateur-moniteurs">Le problème du producteur/consommateur (moniteurs)</h3>
-<p>Réécrivez le problème du producteur/consommateur en utilisant directement les moniteurs Java (i.e. sans utiliser la classe Semaphore ou Lock mais uniquement <code>synchronized</code>, <code>wait</code> et <code>notify</code>).</p>
-<h3 id="application-des-countdownlatch-et-cyclicbarrier">Application des CountDownLatch et CyclicBarrier</h3>
-<p>Ecrivez un programme simulant un repas fait par quatre convives (par l’affichage de messages).</p>
-<p>Les quatres convives doivent attendre d’être attablés avant de commencer le repas.</p>
-<p>Une fois le repas commencé, il se déroule comme suit:</p>
-<ul>
-<li>L’entrée est amenée. Les quatre convives mangent à des vitesses différentes (le premier met 2 minutes, le second 5 minutes, le troisième 3 minutes et le quatrième met 7 minutes).</li>
-<li>Une fois que tous les convives ont terminé leur entrée, le serveur enlève les assiettes vides.</li>
-<li>Le plat est alors amené et les quatre convives mangent également à des vitesses différentes (respectivement 4, 9, 6 et 5 minutes).</li>
-<li>Une fois le plat terminé par tous les convives il est desservi.</li>
-<li>Le café est alors servi et les convives mettent respectivement 2, 3, 1 et 4 minutes pour le boire.</li>
-<li>Le temps entre le moment où les convives ont terminé un met et le met suivant est servi est aléatoire (entre 1 et 15 minutes).</li>
-</ul>
-<p>Un serveur (géré par un Thread) enlève puis ramène les assiettes 2 par 2. Il met 1 minute pour effectuer un aller-retour en cuisine.</p>
-<p>Simulez ce repas (en remplaçant les minutes par des secondes pour plus de rapidité).</p>
-<p>Le programme doit inscrire dans un fichier les temps totaux d’exécution pour chaque repas (donc chaque lancement du programme).</p>
-<h2 id="ressources">Ressources</h2>
-<p>Un exemple d’utilisation de CyclicBarrier:</p>
-<p><a href="http://java67.blogspot.fr/2015/06/how-to-use-cyclicbarrier-in-java.html" class="uri">http://java67.blogspot.fr/2015/06/how-to-use-cyclicbarrier-in-java.html</a></p>
-<p>Une ressource pour les deux:</p>
-<p><a href="http://oppansource.com/cyclicbarrier-and-countdownlatch-in-java/" class="uri">http://oppansource.com/cyclicbarrier-and-countdownlatch-in-java/</a></p>
-<p>Un algorithme de tri parallèle:</p>
-<p><a href="http://www.javamex.com/tutorials/threads/CyclicBarrier_parallel_sort.shtml" class="uri">http://www.javamex.com/tutorials/threads/CyclicBarrier_parallel_sort.shtml</a></p>
-<p>Quelques explications sur l’usage de CountDownLatch:</p>
-<p><a href="http://howtodoinjava.com/2013/07/18/when-to-use-countdownlatch-java-concurrency-example-tutorial/" class="uri">http://howtodoinjava.com/2013/07/18/when-to-use-countdownlatch-java-concurrency-example-tutorial/</a></p>
-</body>
-</html>