| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382 |
- <!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">"Hello Swing"</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">"Hello World !!!"</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 “>”</li>
- <li>en deuxième position, un JButton affichant le texte “Cliquez ici”</li>
- <li>en premier, un JLabel affichant “<”</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&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">"Swing Frame"</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">"About to change Look and Feel"</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">"Does nothing"</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 >= 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">" : "</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>
|