09-Swing-introduction.html 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. <!DOCTYPE html>
  2. <html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="generator" content="pandoc" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
  7. <title>Interfaces graphiques avec Swing</title>
  8. <style type="text/css">
  9. code{white-space: pre-wrap;}
  10. span.smallcaps{font-variant: small-caps;}
  11. span.underline{text-decoration: underline;}
  12. div.column{display: inline-block; vertical-align: top; width: 50%;}
  13. </style>
  14. <style type="text/css">
  15. a.sourceLine { display: inline-block; line-height: 1.25; }
  16. a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
  17. a.sourceLine:empty { height: 1.2em; position: absolute; }
  18. .sourceCode { overflow: visible; }
  19. code.sourceCode { white-space: pre; position: relative; }
  20. div.sourceCode { margin: 1em 0; }
  21. pre.sourceCode { margin: 0; }
  22. @media screen {
  23. div.sourceCode { overflow: auto; }
  24. }
  25. @media print {
  26. code.sourceCode { white-space: pre-wrap; }
  27. a.sourceLine { text-indent: -1em; padding-left: 1em; }
  28. }
  29. pre.numberSource a.sourceLine
  30. { position: relative; }
  31. pre.numberSource a.sourceLine:empty
  32. { position: absolute; }
  33. pre.numberSource a.sourceLine::before
  34. { content: attr(data-line-number);
  35. position: absolute; left: -5em; text-align: right; vertical-align: baseline;
  36. border: none; pointer-events: all;
  37. -webkit-touch-callout: none; -webkit-user-select: none;
  38. -khtml-user-select: none; -moz-user-select: none;
  39. -ms-user-select: none; user-select: none;
  40. padding: 0 4px; width: 4em;
  41. color: #aaaaaa;
  42. }
  43. pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
  44. div.sourceCode
  45. { }
  46. @media screen {
  47. a.sourceLine::before { text-decoration: underline; }
  48. }
  49. code span.al { color: #ff0000; font-weight: bold; } /* Alert */
  50. code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
  51. code span.at { color: #7d9029; } /* Attribute */
  52. code span.bn { color: #40a070; } /* BaseN */
  53. code span.bu { } /* BuiltIn */
  54. code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
  55. code span.ch { color: #4070a0; } /* Char */
  56. code span.cn { color: #880000; } /* Constant */
  57. code span.co { color: #60a0b0; font-style: italic; } /* Comment */
  58. code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
  59. code span.do { color: #ba2121; font-style: italic; } /* Documentation */
  60. code span.dt { color: #902000; } /* DataType */
  61. code span.dv { color: #40a070; } /* DecVal */
  62. code span.er { color: #ff0000; font-weight: bold; } /* Error */
  63. code span.ex { } /* Extension */
  64. code span.fl { color: #40a070; } /* Float */
  65. code span.fu { color: #06287e; } /* Function */
  66. code span.im { } /* Import */
  67. code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
  68. code span.kw { color: #007020; font-weight: bold; } /* Keyword */
  69. code span.op { color: #666666; } /* Operator */
  70. code span.ot { color: #007020; } /* Other */
  71. code span.pp { color: #bc7a00; } /* Preprocessor */
  72. code span.sc { color: #4070a0; } /* SpecialChar */
  73. code span.ss { color: #bb6688; } /* SpecialString */
  74. code span.st { color: #4070a0; } /* String */
  75. code span.va { color: #19177c; } /* Variable */
  76. code span.vs { color: #4070a0; } /* VerbatimString */
  77. code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
  78. </style>
  79. <link rel="stylesheet" href="pandoc.css">
  80. <!--[if lt IE 9]>
  81. <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
  82. <![endif]-->
  83. </head>
  84. <body>
  85. <div class="doctitle">Interfaces graphiques avec Swing</div>
  86. <nav id="TOC">
  87. <ul>
  88. <li><a href="#introduction">Introduction</a><ul>
  89. <li><a href="#swing-et-java-se">Swing et Java SE</a><ul>
  90. <li><a href="#une-librairie-historique">Une librairie historique…</a></li>
  91. <li><a href="#partie-intégrante-de-la-spécification-java-se">… partie intégrante de la spécification Java SE</a></li>
  92. </ul></li>
  93. <li><a href="#hello-world">Hello World</a></li>
  94. </ul></li>
  95. <li><a href="#instructions-particulières">Instructions particulières</a><ul>
  96. <li><a href="#fermeture-de-la-fenêtre">Fermeture de la fenêtre</a></li>
  97. <li><a href="#ajout-dun-composant">Ajout d’un composant</a></li>
  98. <li><a href="#affichage-de-la-fenêtre">Affichage de la fenêtre</a></li>
  99. <li><a href="#dimensionnement-automatique-de-la-fenêtre">Dimensionnement automatique de la fenêtre</a></li>
  100. <li><a href="#le-lancement-thread-safe">Le lancement Thread-safe</a></li>
  101. </ul></li>
  102. <li><a href="#les-composants">Les composants</a><ul>
  103. <li><a href="#le-paquet-awt">Le paquet AWT</a></li>
  104. <li><a href="#awt-swing">AWT + Swing</a></li>
  105. <li><a href="#composants-swing">Composants Swing</a><ul>
  106. <li><a href="#composants-swing-basiques">Composants Swing basiques</a></li>
  107. <li><a href="#composants-swing-boutons">Composants Swing : boutons</a></li>
  108. <li><a href="#composants-swing-texte">Composants Swing : texte</a></li>
  109. </ul></li>
  110. </ul></li>
  111. <li><a href="#disposition-des-éléments">Disposition des éléments</a><ul>
  112. <li><a href="#layout-agencement-et-disposition">Layout : agencement et disposition</a><ul>
  113. <li><a href="#section"></a></li>
  114. </ul></li>
  115. </ul></li>
  116. <li><a href="#composition-dihm">Composition d’IHM</a></li>
  117. <li><a href="#exercices">Exercices</a><ul>
  118. <li><a href="#jbutton-et-jlabel">JButton et JLabel</a></li>
  119. <li><a href="#jbutton-et-jlabel-1">JButton et JLabel</a></li>
  120. <li><a href="#jbutton-et-jlabel-2">JButton et JLabel</a></li>
  121. </ul></li>
  122. <li><a href="#changer-dapparence">Changer d’apparence</a><ul>
  123. <li><a href="#le-look-and-feel">Le Look And Feel</a><ul>
  124. <li><a href="#expérimentation-du-look-and-feel">Expérimentation du Look And Feel</a></li>
  125. <li><a href="#modification-en-cours-dexécution">Modification en cours d’exécution</a></li>
  126. <li><a href="#modification-au-démarrage">Modification au démarrage</a></li>
  127. </ul></li>
  128. </ul></li>
  129. <li><a href="#larchitecture-des-swing">L’architecture des Swing</a><ul>
  130. <li><a href="#larchitecture-mvc">L’architecture MVC</a></li>
  131. <li><a href="#intérêt-de-mvc">Intérêt de MVC</a></li>
  132. <li><a href="#swing-est-presque-mvc">Swing est (presque) MVC</a></li>
  133. </ul></li>
  134. </ul>
  135. </nav>
  136. <h1 id="introduction">Introduction</h1>
  137. <h2 id="swing-et-java-se">Swing et Java SE</h2>
  138. <h3 id="une-librairie-historique">Une librairie historique…</h3>
  139. <p>La librairie Swing est aujourd’hui largement utilisée dans de nombreuses applications Java.</p>
  140. <div class="incremental">
  141. <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>
  142. </div>
  143. <h3 id="partie-intégrante-de-la-spécification-java-se">… partie intégrante de la spécification Java SE</h3>
  144. <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>
  145. <div class="incremental">
  146. <p>Swing fait donc partie du JRE et le restera.</p>
  147. </div>
  148. <h2 id="hello-world">Hello World</h2>
  149. <p>Le programme Hello World en Swing peut se faire de la manière suivante :</p>
  150. <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>
  151. <a class="sourceLine" id="cb1-2" data-line-number="2"></a>
  152. <a class="sourceLine" id="cb1-3" data-line-number="3"><span class="kw">import</span><span class="im"> javax.swing.JFrame;</span></a>
  153. <a class="sourceLine" id="cb1-4" data-line-number="4"><span class="kw">import</span><span class="im"> javax.swing.JLabel;</span></a>
  154. <a class="sourceLine" id="cb1-5" data-line-number="5"><span class="kw">import</span><span class="im"> javax.swing.SwingUtilities;</span></a>
  155. <a class="sourceLine" id="cb1-6" data-line-number="6"></a>
  156. <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>
  157. <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>
  158. <a class="sourceLine" id="cb1-9" data-line-number="9"> <span class="co">//Initialise la fenêtre</span></a>
  159. <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>
  160. <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>
  161. <a class="sourceLine" id="cb1-12" data-line-number="12"> </a>
  162. <a class="sourceLine" id="cb1-13" data-line-number="13"> <span class="co">//Ajoute un label</span></a>
  163. <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>
  164. <a class="sourceLine" id="cb1-15" data-line-number="15"> frame.<span class="fu">getContentPane</span>().<span class="fu">add</span>(label);</a>
  165. <a class="sourceLine" id="cb1-16" data-line-number="16"> </a>
  166. <a class="sourceLine" id="cb1-17" data-line-number="17"> <span class="co">//Positionne et redimensionne la fenêtre</span></a>
  167. <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>
  168. <a class="sourceLine" id="cb1-19" data-line-number="19"> frame.<span class="fu">setVisible</span>(<span class="kw">true</span>);</a>
  169. <a class="sourceLine" id="cb1-20" data-line-number="20"> }</a>
  170. <a class="sourceLine" id="cb1-21" data-line-number="21"> </a>
  171. <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>
  172. <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>
  173. <a class="sourceLine" id="cb1-24" data-line-number="24"> }</a>
  174. <a class="sourceLine" id="cb1-25" data-line-number="25">}</a></code></pre></div>
  175. <p>Étapes principales:</p>
  176. <ul>
  177. <li>création d’une fenêtre (<code>JFrame</code>)</li>
  178. <li>création d’un <code>JLabel</code></li>
  179. <li>récupération du conteneur de la fenêtre (<code>getContentPane()</code>), un <code>JPanel</code></li>
  180. <li>ajout du label (<code>add(label)</code>)</li>
  181. </ul>
  182. <h1 id="instructions-particulières">Instructions particulières</h1>
  183. <h2 id="fermeture-de-la-fenêtre">Fermeture de la fenêtre</h2>
  184. <p>L’instruction suivante permet de terminer le programme dès que la fenêtre est fermée:</p>
  185. <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>
  186. <h2 id="ajout-dun-composant">Ajout d’un composant</h2>
  187. <p>L’ajout d’un composant se fait en utilisant la méthode <code>add(JComponent)</code></p>
  188. <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>
  189. <h2 id="affichage-de-la-fenêtre">Affichage de la fenêtre</h2>
  190. <p>Ajouter l’instruction suivante juste avant la ligne <code>frame.setVisible(true)</code> :</p>
  191. <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>
  192. <h2 id="dimensionnement-automatique-de-la-fenêtre">Dimensionnement automatique de la fenêtre</h2>
  193. <p>Ajouter l’instruction suivante juste avant la ligne <code>frame.setVisible(true)</code> :</p>
  194. <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>
  195. <h2 id="le-lancement-thread-safe">Le lancement Thread-safe</h2>
  196. <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>
  197. <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>
  198. <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>
  199. <h1 id="les-composants">Les composants</h1>
  200. <h2 id="le-paquet-awt">Le paquet AWT</h2>
  201. <p>AWT = Abstract Window Toolkit</p>
  202. <p>Ce paquet fait partie intégrante de l’API Java.</p>
  203. <p>Il inclut des composants utilisables sur tous les environnements graphiques.</p>
  204. <figure>
  205. <img src="images/AWT-classes.png" alt="Classes AWT" /><figcaption>Classes AWT</figcaption>
  206. </figure>
  207. <h2 id="awt-swing">AWT + Swing</h2>
  208. <p>Les composants Swing sont basés sur l’API AWT et les complètent avec des fonctionnalités supplémentaires.</p>
  209. <figure>
  210. <img src="images/AWT-classes+swing.png" alt="Classes AWT" /><figcaption>Classes AWT</figcaption>
  211. </figure>
  212. <h2 id="composants-swing">Composants Swing</h2>
  213. <p>Ces composants sont indépendants des environnements graphiques.</p>
  214. <figure>
  215. <img src="images/Swing-classes.png" alt="Composants Swing" /><figcaption>Composants Swing</figcaption>
  216. </figure>
  217. <h3 id="composants-swing-basiques">Composants Swing basiques</h3>
  218. <p><code>JPanel</code> et <code>JLabel</code> sont les composants les plus basiques:</p>
  219. <ul>
  220. <li><code>JLabel</code>: affichage de texte et/ou image</li>
  221. <li><code>JPanel</code>: conteneur de base</li>
  222. </ul>
  223. <figure>
  224. <img src="images/Swing-classes-basiques.png" alt="Composants Swing" /><figcaption>Composants Swing</figcaption>
  225. </figure>
  226. <h3 id="composants-swing-boutons">Composants Swing : boutons</h3>
  227. <p>Les boutons permettent d’interagir avec la souris sur les interfaces</p>
  228. <figure>
  229. <img src="images/Swing-classes-boutons.png" alt="Composants Swing" /><figcaption>Composants Swing</figcaption>
  230. </figure>
  231. <h3 id="composants-swing-texte">Composants Swing : texte</h3>
  232. <p>Les zones de texte permettent d’afficher/éditer du texte</p>
  233. <figure>
  234. <img src="images/Swing-classes-texte.png" alt="Composants Swing" /><figcaption>Composants Swing</figcaption>
  235. </figure>
  236. <h1 id="disposition-des-éléments">Disposition des éléments</h1>
  237. <h2 id="layout-agencement-et-disposition">Layout : agencement et disposition</h2>
  238. <p>Agencer les composants = assurer une cohérence visuelle</p>
  239. <div class="incremental">
  240. <p>Layout = Gestionnaire d’agencement</p>
  241. <p>L’architecte d’intérieur de l’interface graphique</p>
  242. <h3 id="section"></h3>
  243. </div>
  244. <h1 id="composition-dihm">Composition d’IHM</h1>
  245. <h1 id="exercices">Exercices</h1>
  246. <h2 id="jbutton-et-jlabel">JButton et JLabel</h2>
  247. <p>Créer une fenêtre contenant:</p>
  248. <ul>
  249. <li>en premier, un JLabel affichant “&gt;”</li>
  250. <li>en deuxième position, un JButton affichant le texte “Cliquez ici”</li>
  251. <li>en premier, un JLabel affichant “&lt;”</li>
  252. </ul>
  253. <p>Dimensionner la fenêtre pour que les éléments soient disposés sur une seule ligne</p>
  254. <h2 id="jbutton-et-jlabel-1">JButton et JLabel</h2>
  255. <p>Créer une fenêtre contenant:</p>
  256. <ul>
  257. <li>en haut, un JLabel affichant “Bonjour”</li>
  258. <li>en bas, un JButton affichant le texte “Valider”</li>
  259. </ul>
  260. <p>Faites en sorte que la dimension de la fenêtre</p>
  261. <h2 id="jbutton-et-jlabel-2">JButton et JLabel</h2>
  262. <p>Créer une fenêtre contenant:</p>
  263. <ul>
  264. <li>en haut, un JLabel affichant “Bonjour”</li>
  265. <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>
  266. <li>en bas, un JButton affichant le texte “Valider”</li>
  267. </ul>
  268. <h1 id="changer-dapparence">Changer d’apparence</h1>
  269. <h2 id="le-look-and-feel">Le Look And Feel</h2>
  270. <p>Le <em>Look And Feel</em> est une couche spécifique pour modifier l’affichage et le comportement des composants graphiques.</p>
  271. <p>Il peut être modifié au démarrage ou en cours d’exécution.</p>
  272. <h3 id="expérimentation-du-look-and-feel">Expérimentation du Look And Feel</h3>
  273. <p>Créer la classe <code>SwingExample.java</code> :</p>
  274. <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>
  275. <a class="sourceLine" id="cb7-2" data-line-number="2"></a>
  276. <a class="sourceLine" id="cb7-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.awt.BorderLayout;</span></a>
  277. <a class="sourceLine" id="cb7-4" data-line-number="4"></a>
  278. <a class="sourceLine" id="cb7-5" data-line-number="5"><span class="kw">import</span><span class="im"> javax.swing.JButton;</span></a>
  279. <a class="sourceLine" id="cb7-6" data-line-number="6"><span class="kw">import</span><span class="im"> javax.swing.JFrame;</span></a>
  280. <a class="sourceLine" id="cb7-7" data-line-number="7"><span class="kw">import</span><span class="im"> javax.swing.JLabel;</span></a>
  281. <a class="sourceLine" id="cb7-8" data-line-number="8"><span class="kw">import</span><span class="im"> javax.swing.SwingUtilities;</span></a>
  282. <a class="sourceLine" id="cb7-9" data-line-number="9"><span class="kw">import</span><span class="im"> javax.swing.UIManager;</span></a>
  283. <a class="sourceLine" id="cb7-10" data-line-number="10"><span class="kw">import</span><span class="im"> javax.swing.UnsupportedLookAndFeelException;</span></a>
  284. <a class="sourceLine" id="cb7-11" data-line-number="11"></a>
  285. <a class="sourceLine" id="cb7-12" data-line-number="12"><span class="kw">public</span> <span class="kw">class</span> SwingExample {</a>
  286. <a class="sourceLine" id="cb7-13" data-line-number="13"> <span class="kw">private</span> <span class="bu">JFrame</span> frame ;</a>
  287. <a class="sourceLine" id="cb7-14" data-line-number="14"> <span class="kw">private</span> <span class="bu">JLabel</span> label ;</a>
  288. <a class="sourceLine" id="cb7-15" data-line-number="15"> <span class="dt">void</span> <span class="fu">init</span>(){</a>
  289. <a class="sourceLine" id="cb7-16" data-line-number="16"> <span class="co">//Initialise la fenêtre</span></a>
  290. <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>
  291. <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>
  292. <a class="sourceLine" id="cb7-19" data-line-number="19"> </a>
  293. <a class="sourceLine" id="cb7-20" data-line-number="20"> <span class="co">//Ajoute un label</span></a>
  294. <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>
  295. <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>
  296. <a class="sourceLine" id="cb7-23" data-line-number="23"> </a>
  297. <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>
  298. <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>
  299. <a class="sourceLine" id="cb7-26" data-line-number="26"> </a>
  300. <a class="sourceLine" id="cb7-27" data-line-number="27"> <span class="co">//Positionne et redimensionne la fenêtre</span></a>
  301. <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>
  302. <a class="sourceLine" id="cb7-29" data-line-number="29"> frame.<span class="fu">setVisible</span>(<span class="kw">true</span>);</a>
  303. <a class="sourceLine" id="cb7-30" data-line-number="30"> }</a>
  304. <a class="sourceLine" id="cb7-31" data-line-number="31"> </a>
  305. <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>
  306. <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>
  307. <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>
  308. <a class="sourceLine" id="cb7-35" data-line-number="35"> <span class="kw">try</span> {</a>
  309. <a class="sourceLine" id="cb7-36" data-line-number="36"> <span class="bu">UIManager</span>.<span class="fu">setLookAndFeel</span>(className);</a>
  310. <a class="sourceLine" id="cb7-37" data-line-number="37"> label.<span class="fu">setText</span>(name);</a>
  311. <a class="sourceLine" id="cb7-38" data-line-number="38"> <span class="bu">SwingUtilities</span>.<span class="fu">updateComponentTreeUI</span>(frame);</a>
  312. <a class="sourceLine" id="cb7-39" data-line-number="39"> frame.<span class="fu">pack</span>();</a>
  313. <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>
  314. <a class="sourceLine" id="cb7-41" data-line-number="41"> | <span class="bu">UnsupportedLookAndFeelException</span> e) {</a>
  315. <a class="sourceLine" id="cb7-42" data-line-number="42"> e.<span class="fu">printStackTrace</span>();</a>
  316. <a class="sourceLine" id="cb7-43" data-line-number="43"> }</a>
  317. <a class="sourceLine" id="cb7-44" data-line-number="44"> }</a>
  318. <a class="sourceLine" id="cb7-45" data-line-number="45"> });</a>
  319. <a class="sourceLine" id="cb7-46" data-line-number="46"> </a>
  320. <a class="sourceLine" id="cb7-47" data-line-number="47"> }</a>
  321. <a class="sourceLine" id="cb7-48" data-line-number="48">}</a></code></pre></div>
  322. <h3 id="modification-en-cours-dexécution">Modification en cours d’exécution</h3>
  323. <p>Créer et exécuter la classe exécutable <code>LookAndFeel.java</code> :</p>
  324. <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>
  325. <a class="sourceLine" id="cb8-2" data-line-number="2"></a>
  326. <a class="sourceLine" id="cb8-3" data-line-number="3"><span class="kw">import</span><span class="im"> javax.swing.SwingUtilities;</span></a>
  327. <a class="sourceLine" id="cb8-4" data-line-number="4"><span class="kw">import</span><span class="im"> javax.swing.UIManager;</span></a>
  328. <a class="sourceLine" id="cb8-5" data-line-number="5"><span class="kw">import</span><span class="im"> javax.swing.UIManager.LookAndFeelInfo;</span></a>
  329. <a class="sourceLine" id="cb8-6" data-line-number="6"></a>
  330. <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>
  331. <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>
  332. <a class="sourceLine" id="cb8-9" data-line-number="9"> SwingExample example = <span class="kw">new</span> <span class="fu">SwingExample</span>();</a>
  333. <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>
  334. <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>
  335. <a class="sourceLine" id="cb8-12" data-line-number="12"> });</a>
  336. <a class="sourceLine" id="cb8-13" data-line-number="13"> </a>
  337. <a class="sourceLine" id="cb8-14" data-line-number="14"> LookAndFeelInfo[] lafiArray = <span class="bu">UIManager</span>.<span class="fu">getInstalledLookAndFeels</span>();</a>
  338. <a class="sourceLine" id="cb8-15" data-line-number="15"> <span class="dt">int</span> i = <span class="dv">0</span>;</a>
  339. <a class="sourceLine" id="cb8-16" data-line-number="16"> <span class="kw">while</span>(<span class="kw">true</span>){</a>
  340. <a class="sourceLine" id="cb8-17" data-line-number="17"> <span class="kw">if</span>(i &gt;= lafiArray.<span class="fu">length</span>){</a>
  341. <a class="sourceLine" id="cb8-18" data-line-number="18"> i = <span class="dv">0</span>;</a>
  342. <a class="sourceLine" id="cb8-19" data-line-number="19"> }</a>
  343. <a class="sourceLine" id="cb8-20" data-line-number="20"> LookAndFeelInfo lafi = lafiArray[i];</a>
  344. <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>
  345. <a class="sourceLine" id="cb8-22" data-line-number="22"> <span class="kw">try</span> {</a>
  346. <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>
  347. <a class="sourceLine" id="cb8-24" data-line-number="24"></a>
  348. <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>
  349. <a class="sourceLine" id="cb8-26" data-line-number="26"> } <span class="kw">catch</span> (<span class="bu">InterruptedException</span> e) {</a>
  350. <a class="sourceLine" id="cb8-27" data-line-number="27"> e.<span class="fu">printStackTrace</span>();</a>
  351. <a class="sourceLine" id="cb8-28" data-line-number="28"> }</a>
  352. <a class="sourceLine" id="cb8-29" data-line-number="29"> i++;</a>
  353. <a class="sourceLine" id="cb8-30" data-line-number="30"> }</a>
  354. <a class="sourceLine" id="cb8-31" data-line-number="31"> }</a>
  355. <a class="sourceLine" id="cb8-32" data-line-number="32">}</a></code></pre></div>
  356. <h3 id="modification-au-démarrage">Modification au démarrage</h3>
  357. <p>Créer une nouvelle classe nommée <code>FixedLookAndFeel</code>.</p>
  358. <p>Dans la méthode <code>main</code>, utiliser la méthode suivante avec un Look And Feel de votre choix :</p>
  359. <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>
  360. <p>Afficher la fenêtre de SwingExample.</p>
  361. <h1 id="larchitecture-des-swing">L’architecture des Swing</h1>
  362. <h2 id="larchitecture-mvc">L’architecture MVC</h2>
  363. <p>Modèle-Vue-Contrôleur</p>
  364. <figure>
  365. <img src="images/MVC.png" alt="MVC" /><figcaption>MVC</figcaption>
  366. </figure>
  367. <h2 id="intérêt-de-mvc">Intérêt de MVC</h2>
  368. <figure>
  369. <img src="images/MVC-utilisateur.png" alt="MVC" /><figcaption>MVC</figcaption>
  370. </figure>
  371. <ul>
  372. <li>évolution</li>
  373. <li>maintenance</li>
  374. <li>vues multiples d’une même donnée</li>
  375. </ul>
  376. <h2 id="swing-est-presque-mvc">Swing est (presque) MVC</h2>
  377. <p>Il a été difficile d’appliquer MVC à l’architecture Swing, cependant, celle-ci s’en inspire.</p>
  378. <figure>
  379. <img src="images/Swing-architecture.png" alt="MVC" /><figcaption>MVC</figcaption>
  380. </figure>
  381. </body>
  382. </html>