Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2018-01-13T17:56:05+01:00Les derniers messages parus sur le forum de Zeste de Savoir.Animation Java, message #1713102018-01-13T17:56:05+01:00JuDePom/@JuDePomhttps://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p171310<p>Tant que c’est résolu <img alt=":)" src="/static/smileys/smile.png"></p>Animation Java, message #1713072018-01-13T16:48:50+01:00g2i/@g2ihttps://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p171307<p>Bon, mea culpa…</p>
<p>L’erreur venait du fait que j’avais pas appelé addObserver depuis mainWindow –’</p>
<p>Désolé de t’avoir fait perdre ton temps, mais merci beaucoup en tout cas !</p>Animation Java, message #1710232018-01-11T11:18:58+01:00JuDePom/@JuDePomhttps://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p171023<figure>
<blockquote>
<p>Concernant ton problème, il vient selon moi de tes "sleeps", enfin, pas directement.</p>
<p>En fait, tu demande de dessiner ton personnage, tu attends, et tu demandes de dessiner ton personnage différemment. Le problème, c’est que le rafraîchissement de ta fenêtre ne se fait probablement qu’a la fin de ta fonction. D’où le problème d’affichage.</p>
</blockquote>
<figcaption><a href="https://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p169478">JuDePom</a></figcaption>
</figure>
<p>Si tu n’as pas édité et que tu fais toujours
- dessiner l’animation
- sleep(500)
- dessiner l’autre animation</p>
<p>effectivement, cela ne peux pas marcher.</p>
<p>Il faut que ta fonction paintCharacter ne dessine qu’une seule image a chaque appel, sinon, c’est forcément la dernière que tu auras.</p>Animation Java, message #1709742018-01-10T20:59:29+01:00g2i/@g2ihttps://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p170974<p>Je suis désolé, c’est la deuxième fois que je passe de résolu à non-résolu…</p>
<p>Mon problème initial subsiste : si je ne redessine pas par-dessus, j’obtiens bien les différentes étapes de déplacement superposées. Si je redessine par-dessus, j’obtiens l’état final. Mais si je met un Thread.sleep(500) entre les étapes, mon programme met juste une seconde à s’exécuter et je n’obtiens que l’état final, plutôt que l’effet d’animation comme souhaité…</p>
<p>J’ai l’impression que le problème vient de la manière dont j’ai imbriqué mes Panel. En effet, j’ai une fenêtre principale, ici :</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="kd">public</span> <span class="kd">class</span> <span class="nc">MainWindow</span> <span class="kd">extends</span> <span class="n">JFrame</span> <span class="kd">implements</span> <span class="n">Observer</span> <span class="o">{</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="kt">long</span> <span class="n">serialVersionUID</span> <span class="o">=</span> <span class="mi">201801142359L</span><span class="o">;</span>
<span class="c1">//private final MenuBar menuBar;</span>
<span class="kd">private</span> <span class="kd">final</span> <span class="n">MainPanel</span> <span class="n">mainPanel</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">AppModel</span> <span class="n">appModel</span><span class="o">;</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">update</span><span class="o">(</span><span class="n">Observable</span> <span class="n">observable</span><span class="o">,</span> <span class="n">Object</span> <span class="n">parameter</span><span class="o">)</span> <span class="o">{</span>
<span class="n">notifyForUpdate</span><span class="o">();</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">notifyForUpdate</span><span class="o">()</span> <span class="o">{</span>
<span class="n">mainPanel</span><span class="o">.</span><span class="na">notifyForUpdate</span><span class="o">();</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="n">AppModel</span> <span class="nf">getAppModel</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="na">appModel</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setAppModel</span><span class="o">(</span><span class="n">AppModel</span> <span class="n">appModel</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">appModel</span> <span class="o">=</span> <span class="n">appModel</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="nf">MainWindow</span><span class="o">(</span><span class="n">String</span> <span class="n">title</span><span class="o">,</span> <span class="kt">int</span> <span class="n">width</span><span class="o">,</span> <span class="kt">int</span> <span class="n">height</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">IOException</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">(</span><span class="n">title</span><span class="o">);</span>
<span class="k">this</span><span class="o">.</span><span class="na">mainPanel</span> <span class="o">=</span> <span class="k">new</span> <span class="n">MainPanel</span><span class="o">(</span><span class="k">this</span><span class="o">);</span>
<span class="k">this</span><span class="o">.</span><span class="na">appModel</span> <span class="o">=</span> <span class="k">new</span> <span class="n">AppModel</span><span class="o">();</span>
<span class="k">this</span><span class="o">.</span><span class="na">setSize</span><span class="o">(</span><span class="n">width</span><span class="o">,</span> <span class="n">height</span><span class="o">);</span>
<span class="k">this</span><span class="o">.</span><span class="na">setLocationRelativeTo</span><span class="o">(</span><span class="kc">null</span><span class="o">);</span>
<span class="k">this</span><span class="o">.</span><span class="na">setDefaultCloseOperation</span><span class="o">(</span><span class="n">JFrame</span><span class="o">.</span><span class="na">EXIT_ON_CLOSE</span><span class="o">);</span>
<span class="k">this</span><span class="o">.</span><span class="na">setContentPane</span><span class="o">(</span><span class="n">mainPanel</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
</pre></div>
</td></tr></table></div>
<p>Dont le conteneur principal est le MainPanel :</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="kn">package</span> <span class="nn">ui</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.awt.BorderLayout</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.swing.JPanel</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">MainPanel</span> <span class="kd">extends</span> <span class="n">JPanel</span> <span class="o">{</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="kt">long</span> <span class="n">serialVersionUID</span> <span class="o">=</span> <span class="mi">201801142359L</span><span class="o">;</span>
<span class="kd">private</span> <span class="kd">final</span> <span class="n">MazePanel</span> <span class="n">mazePanel</span><span class="o">;</span>
<span class="kd">private</span> <span class="kd">final</span> <span class="n">ButtonPanel</span> <span class="n">buttonPanel</span><span class="o">;</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">notifyForUpdate</span><span class="o">()</span> <span class="o">{</span>
<span class="n">mazePanel</span><span class="o">.</span><span class="na">notifyForUpdate</span><span class="o">();</span>
<span class="n">buttonPanel</span><span class="o">.</span><span class="na">notifyForUpdate</span><span class="o">();</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="nf">MainPanel</span><span class="o">(</span><span class="n">MainWindow</span> <span class="n">mainWindow</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">();</span>
<span class="k">this</span><span class="o">.</span><span class="na">setLayout</span><span class="o">(</span><span class="k">new</span> <span class="n">BorderLayout</span><span class="o">());</span>
<span class="k">this</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">mazePanel</span> <span class="o">=</span> <span class="k">new</span> <span class="n">MazePanel</span><span class="o">(</span><span class="n">mainWindow</span><span class="o">),</span> <span class="n">BorderLayout</span><span class="o">.</span><span class="na">CENTER</span><span class="o">);</span>
<span class="k">this</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">buttonPanel</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ButtonPanel</span><span class="o">(</span><span class="n">mainWindow</span><span class="o">),</span> <span class="n">BorderLayout</span><span class="o">.</span><span class="na">SOUTH</span><span class="o">);</span>
<span class="k">this</span><span class="o">.</span><span class="na">validate</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
</pre></div>
</td></tr></table></div>
<p>Qui contient donc deux Panel, que sont le MazePanel qui contient le labyrinthe et le ButtonPanel qui contient les boutons. Le problème, c’est que si par exemple je met mon MazePanel en BordelLayout.East, il me l’affiche en dehors de la fenêtre. De même, je le mets ici au centre en théorie, mais il me l’affiche en haut à droite… Si je fais un mainWindow.pack(), le Panel des boutons reste inchangé mais celui du labyrinthe se retrouve écrasé.</p>
<p>De quoi cela peut-il venir ? Est-ce la taille du JPanel qui pose problème, comme si elle ne se mettait pas à jour en lui affichant uniquement des images ?</p>Animation Java, message #1704972018-01-06T02:56:13+01:00g2i/@g2ihttps://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p170497<p>Je vois, merci beaucoup !</p>Animation Java, message #1702502018-01-04T17:39:06+01:00JuDePom/@JuDePomhttps://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p170250<p>Ce n’est pas une bonne idée car swing n’est pas prévu pour une telle utilisation (enfin, ce n’est pas son but).</p>
<p>Je ne sais pas si l’on peut parler de "mauvaise pratique", disons qu’il est recommandé de savoir pourquoi on fait ça au lieu de laisser ça au composant.</p>
<p>Par contre, même le comportement par défaut ne devrait pas impacter tant que ça :/.</p>
<p>Si tu fais juste dessiner des sprites, tu devrais le faire dans une image, et demander au JPanel de juste dessiner l’image que tu as générée. Il me semble que c’est le mieux.</p>Animation Java, message #1702382018-01-04T15:46:53+01:00g2i/@g2ihttps://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p170238<figure>
<blockquote>
<figure>
<blockquote>
<p>Sais-tu s’il est possible de dessiner sur un JPanel existant sans le modifier ?</p>
</blockquote>
<figcaption><a href="https://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p170165">BunshinKage</a></figcaption>
</figure>
<p>Le problème, c’est que tu souhaites modifier un composant (ou un de ses fils) sans que celui ci n’agisse. Swing n’est pas fait pour ça. Swing est optimiser pour gérer des hiérarchies d’objets graphiques qui pour la majorité sont statiques. Chaque modification d’un composant appelle a redessiner tout ou partie des parents et des enfants de se composant.</p>
</blockquote>
<figcaption><a href="https://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p170205">JuDePom</a></figcaption>
</figure>
<p>Damned, je suis obligé d’utiliser Swing <img alt=":'(" src="/static/smileys/pleure.png"></p>
<figure>
<blockquote>
<p>Il y a la fonction <a href="https://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#paintImmediately(int,%20int,%20int,%20int)">paintImmediatly(x, y, w, h)</a>, qui repeint unique la zone demandée, mais je ne pense pas du tout que cela soit une bonne idée.</p>
</blockquote>
<figcaption><a href="https://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p170205">JuDePom</a></figcaption>
</figure>
<p>Pourquoi ce n’est pas une bonne idée ? C’est une mauvaise pratique que d’utiliser cette fonction ?</p>Animation Java, message #1702052018-01-04T11:41:49+01:00JuDePom/@JuDePomhttps://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p170205<figure>
<blockquote>
<p>Sais-tu s’il est possible de dessiner sur un JPanel existant sans le modifier ?</p>
</blockquote>
<figcaption><a href="https://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p170165">BunshinKage</a></figcaption>
</figure>
<p>Le problème, c’est que tu souhaites modifier un composant (ou un de ses fils) sans que celui ci n’agisse. Swing n’est pas fait pour ça. Swing est optimiser pour gérer des hiérarchies d’objets graphiques qui pour la majorité sont statiques. Chaque modification d’un composant appelle a redessiner tout ou partie des parents et des enfants de se composant.</p>
<p>Il y a la fonction <a href="https://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#paintImmediately(int,%20int,%20int,%20int)">paintImmediatly(x, y, w, h)</a>, qui repeint unique la zone demandée, mais je ne pense pas du tout que cela soit une bonne idée.</p>Animation Java, message #1701652018-01-03T19:09:18+01:00g2i/@g2ihttps://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p170165<p>Désolé de revenir, mais j’ai jugé qu’il était plus pertinent de poser ma question ici comme elle est en lien avec le reste du sujet plutôt que d’en créer un autre.</p>
<p>Sais-tu s’il est possible de dessiner sur un JPanel existant sans le modifier ? En soi, le but serait de ne pas rafraîchir le JPanel contenant le terrain à chaque fois que le personnage fait un pas. Ce serait donc comme superposer un JPanel transparent ne contenant que le personnage sur le premier qui lui par contre se fera rafraîchir à chaque fois que le personnage fait un pas.</p>
<p>Je pensais avoir trouvé une solution avec JLayer et JLayerUI, mais a priori, cela rafraîchit quand même le JPanel sur lequel on dessine…</p>Animation Java, message #1694862017-12-26T12:53:03+01:00JuDePom/@JuDePomhttps://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p169486<figure>
<blockquote>
<p>D’accord, donc il voudrait mieux que je charge toutes les images au début de mon programme puis que je les utilise par la suite ? Pour la deuxième remarque, il n’y aurait pas l’impression de mouvement que je souhaite. Après, mon but pour l’instant est surtout de faire quelque chose de fonctionnel, donc si ça permet de débugger, ça me dérangera pas de l’enlever x)</p>
</blockquote>
<figcaption><a href="https://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p169483">BunshinKage</a></figcaption>
</figure>
<p>Pour l’effet recherché, il n’y a pas de différences, avec un fichier ressemblant à ceci:</p>
<p><a href="/media/galleries/4437/2c620e7d-bc39-4546-9aa8-1417fde92f4c.png"><img alt="Exemple de sprites issues du jeu Running guys" src="/media/galleries/4437/2c620e7d-bc39-4546-9aa8-1417fde92f4c.png.120x120_q95_crop.jpg"></a></p>
<p>Tu n’affiches qu’une petite portion de l’image, et le tour est joué <img alt=":)" src="/static/smileys/smile.png"></p>Animation Java, message #1694832017-12-26T12:13:59+01:00g2i/@g2ihttps://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p169483<p>Bonjour,</p>
<p>Merci de ta réponse déjà. Ensuite :</p>
<figure>
<blockquote>
<p>Pourquoi JAVA (et swing surtout)?</p>
</blockquote>
<figcaption><a href="https://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p169478">JuDePom</a></figcaption>
</figure>
<p>Parce que c’est un projet pour mon école où l’on est forcé d’utiliser JAVA et Swing <img alt=":p" src="/static/smileys/langue.png"></p>
<figure>
<blockquote>
<hr>
<p>Pourquoi tu as des "sleeps" et l’appel "drawboxes" dans ta fonction pour dessiner ton personnage ?
Je pense que c’est mal placé.</p>
<hr>
</blockquote>
<figcaption><a href="https://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p169478">JuDePom</a></figcaption>
</figure>
<p>Ce que je vouais faire en faisant ça, c’est de dessiner une première fois le personnage entre les deux cases avec l’animation de marche, puis, pour effacer le personnage, de redessiner le terrain par-dessus et de redessiner le personnage à sa nouvelle position. Le sleep sert à créer une "impression" de mouvement, même saccadée.</p>
<figure>
<blockquote>
<hr>
<p>Tu ne devrais pas avoir à charger à chaque utilisation tes images pour ton personnage.</p>
<p>De plus, tu ne devrais avoir qu’une seule image pour toutes les positions et actions de ton personnage. Comme ça tu n’as qu’à charger une image une bonne fois pour toute.</p>
<hr>
</blockquote>
<figcaption><a href="https://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p169478">JuDePom</a></figcaption>
</figure>
<p>D’accord, donc il voudrait mieux que je charge toutes les images au début de mon programme puis que je les utilise par la suite ? Pour la deuxième remarque, il n’y aurait pas l’impression de mouvement que je souhaite. Après, mon but pour l’instant est surtout de faire quelque chose de fonctionnel, donc si ça permet de débugger, ça me dérangera pas de l’enlever x)</p>
<figure>
<blockquote>
<hr>
<p>Tu ne devrais pas mettre à jour l’orientation en comparant l’évolution de la position, mais mettre à jour ton personnage directement depuis ton contrôleur.</p>
<hr>
</blockquote>
<figcaption><a href="https://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p169478">JuDePom</a></figcaption>
</figure>
<p>Je n’ai pas encore codé le contrôleur, je voulais surtout vérifier que les fonctions codées pour l’animation étaient fonctionnelles. Mais effectivement, ce serait plus logique, ce sera changé dans la suite du code, merci.</p>
<figure>
<blockquote>
<hr>
<p>Concernant ton problème, il vient selon moi de tes "sleeps", enfin, pas directement.</p>
<p>En fait, tu demande de dessiner ton personnage, tu attends, et tu demandes de dessiner ton personnage différemment. Le problème, c’est que le rafraîchissement de ta fenêtre ne se fait probablement qu’a la fin de ta fonction. D’où le problème d’affichage.</p>
</blockquote>
<figcaption><a href="https://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p169478">JuDePom</a></figcaption>
</figure>
<p>Il faudrait donc que je force la rafraîchissement de la fenêtre avant l’appel à paintBoxes ? Je vois, d’accord ! Mais du coup il faut que je change pas mal la structure de mon code x)</p>
<p>Merci beaucoup pour ta réponse en tout cas !</p>Animation Java, message #1694782017-12-26T11:38:20+01:00JuDePom/@JuDePomhttps://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p169478<p>Bonjour,</p>
<p>Pourquoi JAVA (et swing surtout)?</p>
<p>Soyons un peu plus sérieux.</p>
<hr>
<p>Pourquoi tu as des "sleeps" et l’appel "drawboxes" dans ta fonction pour dessiner ton personnage ?
Je pense que c’est mal placé.</p>
<hr>
<p>Tu ne devrais pas avoir à charger à chaque utilisation tes images pour ton personnage.</p>
<p>De plus, tu ne devrais avoir qu’une seule image pour toutes les positions et actions de ton personnage. Comme ça tu n’as qu’à charger une image une bonne fois pour toute.</p>
<hr>
<p>Tu ne devrais pas mettre à jour l’orientation en comparant l’évolution de la position, mais mettre à jour ton personnage directement depuis ton contrôleur.</p>
<hr>
<p>Concernant ton problème, il vient selon moi de tes "sleeps", enfin, pas directement.</p>
<p>En fait, tu demande de dessiner ton personnage, tu attends, et tu demandes de dessiner ton personnage différemment. Le problème, c’est que le rafraîchissement de ta fenêtre ne se fait probablement qu’a la fin de ta fonction. D’où le problème d’affichage.</p>Animation Java, message #1694692017-12-25T22:04:36+01:00g2i/@g2ihttps://zestedesavoir.com/forums/sujet/9907/animation-java/?page=1#p169469<p>Bonjour à tous,</p>
<p>Je m’adresse à vous parce que je ne vois pas où j’ai pu me tromper dans mon code. L’objectif est de coder le déplacement d’un personnage à la manière d’un jeu Pokémon dans la troisième génération pour ceux qui connaissent, c’est-à-dire que lorsque le personnage se déplace d’une case à une autre adjacente, une animation sur ses jambes est montrée.</p>
<p>Le problème, c’est que mon code s’exécute de manière un peu bizarre. C’est-à-dire que lorsque je l’exécute, je n’obtiens que l’état final escompté, et lorsque je mets une pause de deux secondes, je n’obtiens que l’état initial. Les codes sont les suivants :</p>
<p>Main :</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="kn">package</span> <span class="nn">main</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">maze.Maze</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">maze.MazeReadingException</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">ui.MainWindow</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">MainTest</span> <span class="o">{</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">MazeReadingException</span><span class="o">,</span> <span class="n">InterruptedException</span> <span class="o">{</span>
<span class="n">Maze</span> <span class="n">maze</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Maze</span><span class="o">();</span>
<span class="n">MainWindow</span> <span class="n">window</span> <span class="o">=</span> <span class="k">new</span> <span class="n">MainWindow</span><span class="o">(</span><span class="s">"Projet JAVA"</span><span class="o">);</span>
<span class="n">maze</span><span class="o">.</span><span class="na">initFromTextFile</span><span class="o">(</span><span class="s">"data/levels/labyrinthe.txt"</span><span class="o">);</span>
<span class="n">window</span><span class="o">.</span><span class="na">getAppModel</span><span class="o">().</span><span class="na">setDrawnBoxes</span><span class="o">(</span><span class="n">maze</span><span class="o">.</span><span class="na">getCaseMatrix</span><span class="o">());</span>
<span class="n">window</span><span class="o">.</span><span class="na">setVisible</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span>
<span class="c1">//Thread.sleep(2000);</span>
<span class="n">window</span><span class="o">.</span><span class="na">getAppModel</span><span class="o">().</span><span class="na">setCharXCharY</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">);</span>
<span class="n">window</span><span class="o">.</span><span class="na">getAppModel</span><span class="o">().</span><span class="na">setCharXCharY</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span>
<span class="n">window</span><span class="o">.</span><span class="na">getAppModel</span><span class="o">().</span><span class="na">setCharXCharY</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">2</span><span class="o">);</span>
<span class="n">window</span><span class="o">.</span><span class="na">getAppModel</span><span class="o">().</span><span class="na">setCharXCharY</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">3</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
</pre></div>
</td></tr></table></div>
<p>MainWindow est la classe créant ma fenêtre principale. Maze est une classe représentant le terrain, elle possède entre autres un attribut caseMatrix qui représente les cases du terrain. La méthode initFromTextFile sert à initialiser cet attribut à partir d’un fichier texte. AppModel est le modèle de mon application, qui possède comme attribut drawnBoxes qui représente les cases à dessiner. MainWindow possède comme content un panel qui contient deux JPanel, un pour les boutons, l’autre affichant le terrain. C’est celui-ci qui m’intéresse. Voici sa classe :</p>
<p>MainPanel :</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="kn">package</span> <span class="nn">ui</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.awt.Graphics</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.swing.JPanel</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">MazePanel</span> <span class="kd">extends</span> <span class="n">JPanel</span> <span class="o">{</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="kt">long</span> <span class="n">serialVersionUID</span> <span class="o">=</span> <span class="mi">201801142359L</span><span class="o">;</span>
<span class="kd">private</span> <span class="kd">final</span> <span class="n">MainWindow</span> <span class="n">mainWindow</span><span class="o">;</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">paintComponent</span><span class="o">(</span><span class="n">Graphics</span> <span class="n">g</span><span class="o">)</span> <span class="o">{</span>
<span class="n">mainWindow</span><span class="o">.</span><span class="na">getAppModel</span><span class="o">().</span><span class="na">paintBoxes</span><span class="o">(</span><span class="n">g</span><span class="o">);</span>
<span class="n">mainWindow</span><span class="o">.</span><span class="na">getAppModel</span><span class="o">().</span><span class="na">paintCharacter</span><span class="o">(</span><span class="n">g</span><span class="o">);</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">notifyForUpdate</span><span class="o">()</span> <span class="o">{</span>
<span class="n">repaint</span><span class="o">();</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="nf">MazePanel</span><span class="o">(</span><span class="n">MainWindow</span> <span class="n">mainWindow</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">();</span>
<span class="k">this</span><span class="o">.</span><span class="na">mainWindow</span> <span class="o">=</span> <span class="n">mainWindow</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</pre></div>
</td></tr></table></div>
<p>paintBoxes() affiche les cases contenues dans drawnBoxes et fonctionne <em>a priori</em> bien. En revanche, paintCharacter(), censée afficher les animations, ne fonctionne pas comme je le souhaite. Voici son code, contenu donc dans AppModel :</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="kd">public</span> <span class="kt">void</span> <span class="nf">paintCharacter</span><span class="o">(</span><span class="n">Graphics</span> <span class="n">g</span><span class="o">)</span> <span class="o">{</span>
<span class="k">try</span> <span class="o">{</span>
<span class="n">String</span> <span class="n">filePath</span> <span class="o">=</span> <span class="s">"data/sprites/"</span><span class="o">;</span>
<span class="n">filePath</span> <span class="o">+=</span> <span class="n">departureCharacterBoy</span> <span class="o">+</span> <span class="n">direction</span> <span class="o">+</span> <span class="n">leftFoot</span> <span class="o">+</span> <span class="s">".png"</span><span class="o">;</span>
<span class="n">Image</span> <span class="n">img</span> <span class="o">=</span> <span class="n">ImageIO</span><span class="o">.</span><span class="na">read</span><span class="o">(</span><span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="n">filePath</span><span class="o">));</span>
<span class="k">if</span> <span class="o">(</span><span class="n">direction</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="s">"Right"</span><span class="o">))</span> <span class="o">{</span>
<span class="n">g</span><span class="o">.</span><span class="na">drawImage</span><span class="o">(</span><span class="n">img</span><span class="o">,</span> <span class="mi">16</span><span class="o">*</span><span class="n">charX</span> <span class="o">-</span> <span class="mi">7</span><span class="o">,</span> <span class="mi">16</span><span class="o">*</span><span class="n">charY</span> <span class="o">-</span> <span class="mi">3</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span>
<span class="o">}</span>
<span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="n">direction</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="s">"Left"</span><span class="o">))</span> <span class="o">{</span>
<span class="n">g</span><span class="o">.</span><span class="na">drawImage</span><span class="o">(</span><span class="n">img</span><span class="o">,</span> <span class="mi">16</span><span class="o">*</span><span class="n">charX</span> <span class="o">+</span> <span class="mi">9</span><span class="o">,</span> <span class="mi">16</span><span class="o">*</span><span class="n">charY</span> <span class="o">-</span> <span class="mi">3</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span>
<span class="o">}</span>
<span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="n">direction</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="s">"Face"</span><span class="o">))</span> <span class="o">{</span>
<span class="n">g</span><span class="o">.</span><span class="na">drawImage</span><span class="o">(</span><span class="n">img</span><span class="o">,</span> <span class="mi">16</span><span class="o">*</span><span class="n">charX</span> <span class="o">+</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">16</span><span class="o">*</span><span class="n">charY</span> <span class="o">+</span> <span class="mi">5</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span>
<span class="o">}</span>
<span class="k">else</span> <span class="o">{</span>
<span class="n">g</span><span class="o">.</span><span class="na">drawImage</span><span class="o">(</span><span class="n">img</span><span class="o">,</span> <span class="mi">16</span><span class="o">*</span><span class="n">charX</span> <span class="o">+</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">16</span><span class="o">*</span><span class="n">charY</span> <span class="o">-</span> <span class="mi">11</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span>
<span class="o">}</span>
<span class="n">Thread</span><span class="o">.</span><span class="na">sleep</span><span class="o">(</span><span class="mi">500</span><span class="o">);</span>
<span class="n">paintBoxes</span><span class="o">(</span><span class="n">g</span><span class="o">);</span>
<span class="n">filePath</span> <span class="o">=</span> <span class="s">"data/sprites/"</span> <span class="o">+</span> <span class="n">departureCharacterBoy</span> <span class="o">+</span> <span class="n">direction</span> <span class="o">+</span> <span class="s">".png"</span><span class="o">;</span>
<span class="n">img</span> <span class="o">=</span> <span class="n">ImageIO</span><span class="o">.</span><span class="na">read</span><span class="o">(</span><span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="n">filePath</span><span class="o">));</span>
<span class="n">g</span><span class="o">.</span><span class="na">drawImage</span><span class="o">(</span><span class="n">img</span><span class="o">,</span> <span class="mi">16</span><span class="o">*</span><span class="n">charX</span> <span class="o">+</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">16</span><span class="o">*</span><span class="n">charY</span> <span class="o">-</span> <span class="mi">3</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span>
<span class="n">Thread</span><span class="o">.</span><span class="na">sleep</span><span class="o">(</span><span class="mi">500</span><span class="o">);</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
<span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
</pre></div>
</td></tr></table></div>
<p>Je voudrais donc que mon personnage se déplace de la moitié d’une case (une case étant un carré de 16x16 px) en une demi-seconde puis encore de la moitié en une demi-seconde également. Voici le code de la fonction setCharXCharY utilisée dans le main :</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="kd">public</span> <span class="kt">void</span> <span class="nf">setCharXCharY</span><span class="o">(</span><span class="kt">int</span> <span class="n">charX</span><span class="o">,</span> <span class="kt">int</span> <span class="n">charY</span><span class="o">)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="k">this</span><span class="o">.</span><span class="na">charX</span> <span class="o">></span> <span class="n">charX</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">direction</span> <span class="o">=</span> <span class="s">"Left"</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="k">this</span><span class="o">.</span><span class="na">charX</span> <span class="o"><</span> <span class="n">charX</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">direction</span> <span class="o">=</span> <span class="s">"Right"</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="k">this</span><span class="o">.</span><span class="na">charY</span> <span class="o">></span> <span class="n">charY</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">direction</span> <span class="o">=</span> <span class="s">"Back"</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">else</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">direction</span> <span class="o">=</span> <span class="s">"Face"</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">this</span><span class="o">.</span><span class="na">leftFoot</span> <span class="o">=</span> <span class="o">!</span><span class="n">leftFoot</span><span class="o">;</span>
<span class="k">this</span><span class="o">.</span><span class="na">charX</span> <span class="o">=</span> <span class="n">charX</span><span class="o">;</span>
<span class="k">this</span><span class="o">.</span><span class="na">charY</span> <span class="o">=</span> <span class="n">charY</span><span class="o">;</span>
<span class="n">setChanged</span><span class="o">();</span>
<span class="n">notifyObservers</span><span class="o">();</span>
<span class="o">}</span>
</pre></div>
</td></tr></table></div>
<p>C’est la première fois que je demande de l’aide en Java, et je me rends compte que ça serait vraiment lourd de poster ici toutes les classes ici, mais d’un autre côté je ne vois vraiment d’où peut venir l’erreur, donc je suis désolé de la longueur du post. Je tiens à préciser que ce n’est absolument pas professionnel, donc si vous avez besoin du reste du code, des images ou du fichier .txt je n’aurai aucun problème à vous les donner.</p>
<p>Merci d’avance <img alt=":)" src="/static/smileys/smile.png"></p>[Swing] Où décider de l'image à afficher ?, message #1527592017-06-08T20:05:03+02:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/8747/swing-ou-decider-de-limage-a-afficher/?page=1#p152759<p>C’est… Magnifique. Ainsi il n’est nécessaire d’adapter que les classes "<em>feuilles</em>".</p>
<p>Merci beaucoup pour ton aide @firm1 ! J’aurai appris quelque chose aujourd’hui.</p>[Swing] Où décider de l'image à afficher ?, message #1527532017-06-08T17:29:28+02:00firm1/@firm1https://zestedesavoir.com/forums/sujet/8747/swing-ou-decider-de-limage-a-afficher/?page=1#p152753<figure>
<blockquote>
<p>Et comment j’effectue des opération "<em>business</em>" sur une liste de <code>Displayable</code> ?</p>
</blockquote>
<figcaption><a href="https://zestedesavoir.com/forums/sujet/8747/swing-ou-decider-de-limage-a-afficher/?page=1#p152749">Novax</a></figcaption>
</figure>
<p>En reprenant ton exemple ci-dessus on travaille sur la base de la classe abstraite : </p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">Animal</span> <span class="o">{</span>
<span class="n">monOperationMetier1</span><span class="o">();</span>
<span class="n">monOperationMetier2</span><span class="o">();</span>
<span class="n">monOperationMetier3</span><span class="o">();</span>
<span class="o">}</span>
<span class="kd">interface</span> <span class="nc">Displayable</span> <span class="o">{</span>
<span class="n">Animal</span> <span class="nf">getInstance</span><span class="o">();</span> <span class="c1">// méthode qui te renvoi ton instance d'animal</span>
<span class="o">}</span>
<span class="kd">class</span> <span class="nc">Cat</span> <span class="kd">extends</span> <span class="n">Animal</span> <span class="o">{}</span> <span class="c1">// il va redéfinir les opérations métiers et getInstance()</span>
<span class="kd">class</span> <span class="nc">Dog</span> <span class="kd">extends</span> <span class="n">Animal</span> <span class="o">{}</span> <span class="c1">// il va redéfinir les opérations métiers et getInstance()</span>
<span class="kd">class</span> <span class="nc">Ant</span> <span class="kd">extends</span> <span class="n">Animal</span> <span class="o">{}</span> <span class="c1">// il va redéfinir les opérations métiers et getInstance()</span>
</pre></div>
</td></tr></table></div>
<p>Et donc par la suite tu fais : </p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="n">Displayable</span> <span class="n">monChat</span><span class="o">;</span>
<span class="n">monChat</span><span class="o">.</span><span class="na">getInstance</span><span class="o">().</span><span class="na">monOperationMetier1</span><span class="o">();</span>
<span class="n">monChat</span><span class="o">.</span><span class="na">getInstance</span><span class="o">().</span><span class="na">monOperationMetier2</span><span class="o">();</span>
<span class="n">monChat</span><span class="o">.</span><span class="na">getInstance</span><span class="o">().</span><span class="na">monOperationMetier3</span><span class="o">();</span>
</pre></div>
</td></tr></table></div>[Swing] Où décider de l'image à afficher ?, message #1527492017-06-08T16:29:39+02:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/8747/swing-ou-decider-de-limage-a-afficher/?page=1#p152749<p>Et comment j’effectue des opération "<em>business</em>" sur une liste de <code>Displayable</code> ?</p>[Swing] Où décider de l'image à afficher ?, message #1527262017-06-08T11:30:15+02:00firm1/@firm1https://zestedesavoir.com/forums/sujet/8747/swing-ou-decider-de-limage-a-afficher/?page=1#p152726<blockquote>
<p>Comment convertir une List<Animal> en une List<Displayable> ? </p>
</blockquote>
<p>La conversion ne peut se faire. Mais c’est normal, car logiquement dans ton ihm, tu ne devrais plus travailler qu’avec une <code>List<Displayable></code>. C’est difficile de voir ce que tu essayes de faire si tu n’as pas de code sous la main.</p>
<p>Mais dans ton canevas, tu devrais travailler avec une liste de Displyable directement. J’ignore ou tu initialises tes entités, mais à ce moment là, tu devrais lui créer un <code>*Displayable</code> pour gérer son affichage.</p>[Swing] Où décider de l'image à afficher ?, message #1526892017-06-07T21:10:02+02:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/8747/swing-ou-decider-de-limage-a-afficher/?page=1#p152689<p>Je vois très bien ce que tu veux faire avec tes classes <code>component*</code>.</p>
<p>Je vais reformuler ma question sur les collections hétérogènes :</p>
<p>Considérant les classes modèle suivantes :</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">Animal</span> <span class="o">{}</span>
<span class="kd">class</span> <span class="nc">Cat</span> <span class="kd">extends</span> <span class="n">Animal</span> <span class="o">{}</span>
<span class="kd">class</span> <span class="nc">Dog</span> <span class="kd">extends</span> <span class="n">Animal</span> <span class="o">{}</span>
<span class="kd">class</span> <span class="nc">Ant</span> <span class="kd">extends</span> <span class="n">Animal</span> <span class="o">{}</span>
</pre></div>
</td></tr></table></div>
<p>Comment convertir une <code>List<Animal></code> en une <code>List<Displayable></code> ? — Tel que, si j’ai tout compris :</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="kd">interface</span> <span class="nc">Displayable</span> <span class="o">{}</span>
<span class="kd">class</span> <span class="nc">CatDisplayable</span> <span class="kd">implements</span> <span class="n">Displayable</span> <span class="cm">/* Using Cat */</span> <span class="o">{}</span>
<span class="kd">class</span> <span class="nc">DogDisplayable</span> <span class="kd">implements</span> <span class="n">Displayable</span> <span class="cm">/* Using Dog */</span> <span class="o">{}</span>
<span class="kd">class</span> <span class="nc">AntDisplayable</span> <span class="kd">implements</span> <span class="n">Displayable</span> <span class="cm">/* Using Ant */</span> <span class="o">{}</span>
</pre></div>
</td></tr></table></div>[Swing] Où décider de l'image à afficher ?, message #1526082017-06-07T11:02:52+02:00firm1/@firm1https://zestedesavoir.com/forums/sujet/8747/swing-ou-decider-de-limage-a-afficher/?page=1#p152608<blockquote>
<p>Comment tu ferais l’adapter sur une collection d’entités hétérogène ?</p>
</blockquote>
<p>Je ne suis pas sur d’avoir compris ta question. Mais imaginons que tu aies 4 entités. <code>A</code>, <code>B</code>, <code>C</code>, <code>D</code>. Qui se traduisent ainsi : </p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="kd">class</span> <span class="nc">A</span> <span class="o">{</span>
<span class="o">}</span>
<span class="kd">class</span> <span class="nc">B</span> <span class="o">{</span>
<span class="o">}</span>
<span class="kd">class</span> <span class="nc">C</span> <span class="o">{</span>
<span class="o">}</span>
<span class="kd">class</span> <span class="nc">D</span> <span class="o">{</span>
<span class="o">}</span>
</pre></div>
</td></tr></table></div>
<p>Pour gagner en souplesse tu passe par des adaptateurs de composition. ce qui donnerait</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="kd">class</span> <span class="nc">componentA</span> <span class="kd">implements</span> <span class="n">Displayable</span><span class="o">{</span>
<span class="n">A</span> <span class="n">elt</span><span class="o">;</span>
<span class="kd">public</span> <span class="nf">componentA</span><span class="o">(</span><span class="n">A</span> <span class="n">elt</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">elt</span> <span class="o">=</span> <span class="n">elt</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="nf">display</span><span class="o">(</span><span class="n">Graphics</span> <span class="n">g</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">// affichage de l'entité de type A</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="kd">class</span> <span class="nc">componentB</span> <span class="kd">implements</span> <span class="n">Displayable</span><span class="o">{</span>
<span class="n">B</span> <span class="n">elt</span><span class="o">;</span>
<span class="kd">public</span> <span class="nf">componentB</span><span class="o">(</span><span class="n">B</span> <span class="n">elt</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">elt</span> <span class="o">=</span> <span class="n">elt</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="nf">display</span><span class="o">(</span><span class="n">Graphics</span> <span class="n">g</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">// affichage de l'entité de type B</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="kd">class</span> <span class="nc">componentC</span> <span class="kd">implements</span> <span class="n">Displayable</span><span class="o">{</span>
<span class="n">C</span> <span class="n">elt</span><span class="o">;</span>
<span class="kd">public</span> <span class="nf">componentC</span><span class="o">(</span><span class="n">C</span> <span class="n">elt</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">elt</span> <span class="o">=</span> <span class="n">elt</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="nf">display</span><span class="o">(</span><span class="n">Graphics</span> <span class="n">g</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">// affichage de l'entité de type C</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="kd">class</span> <span class="nc">componentD</span> <span class="kd">implements</span> <span class="n">Displayable</span><span class="o">{</span>
<span class="n">D</span> <span class="n">elt</span><span class="o">;</span>
<span class="kd">public</span> <span class="nf">componentD</span><span class="o">(</span><span class="n">D</span> <span class="n">elt</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">elt</span> <span class="o">=</span> <span class="n">elt</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="nf">display</span><span class="o">(</span><span class="n">Graphics</span> <span class="n">g</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">// affichage de l'entité de type D</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="err">`</span>
</pre></div>
</td></tr></table></div>
<p>Ce qui devrait te donner un canevas dans ce gout là : </p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="kd">class</span> <span class="nc">Windows</span> <span class="kd">extends</span> <span class="n">JPanel</span> <span class="o">{</span>
<span class="n">List</span><span class="o"><</span><span class="n">Displayable</span><span class="o">></span> <span class="n">entities</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">();</span>
<span class="kt">int</span> <span class="n">currentPosition</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="kd">public</span> <span class="nf">Windows</span><span class="o">()</span> <span class="o">{</span>
<span class="n">entities</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">componentA</span><span class="o">(...));</span>
<span class="n">entities</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">componentA</span><span class="o">(...));</span>
<span class="n">entities</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">componentB</span><span class="o">(...));</span>
<span class="n">entities</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">componentD</span><span class="o">(...));</span>
<span class="o">}</span>
<span class="cm">/* J'affiche l’élément suivant */</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">switchNext</span><span class="o">()</span> <span class="o">{</span>
<span class="n">currentPosition</span> <span class="o">=</span> <span class="o">(</span><span class="n">currentPosition</span> <span class="o">+</span> <span class="mi">1</span><span class="o">)</span> <span class="o">%</span> <span class="n">entities</span><span class="o">.</span><span class="na">size</span><span class="o">();</span>
<span class="o">}</span>
<span class="cm">/* J'affiche l’élément précédent */</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">switchPrevious</span><span class="o">()</span> <span class="o">{</span>
<span class="n">currentPosition</span> <span class="o">=</span> <span class="o">(</span><span class="n">currentPosition</span> <span class="o">-</span> <span class="mi">1</span><span class="o">)</span> <span class="o">%</span> <span class="n">entities</span><span class="o">.</span><span class="na">size</span><span class="o">();</span>
<span class="o">}</span>
<span class="c1">// les reste des bidules</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">paintComponent</span><span class="o">(</span><span class="n">Graphics</span> <span class="n">g</span><span class="o">)</span> <span class="o">{</span>
<span class="n">entities</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">currentPosition</span><span class="o">).</span><span class="na">display</span><span class="o">();</span>
<span class="kd">super</span><span class="o">.</span><span class="na">paintComponent</span><span class="o">(</span><span class="n">g</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
</pre></div>
</td></tr></table></div>
<p>Bon, je crois que je suis allé un peu loin là, mais c’était pour te donner une idée générale du truc (plus simple finalement a expliquer avec du code)</p>[Swing] Où décider de l'image à afficher ?, message #1525532017-06-06T18:46:27+02:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/8747/swing-ou-decider-de-limage-a-afficher/?page=1#p152553<p>Comment tu ferais l’<em>adapter</em> sur une collection d’entités hétérogène ?</p>
<hr>
<p>PS : Par ailleurs, merci de t’être donné pour ce sujet jusque là. <img alt=":)" src="/static/smileys/smile.png"></p>[Swing] Où décider de l'image à afficher ?, message #1525052017-06-06T12:16:20+02:00firm1/@firm1https://zestedesavoir.com/forums/sujet/8747/swing-ou-decider-de-limage-a-afficher/?page=1#p152505<blockquote>
<p>Qui est choqué ?</p>
</blockquote>
<p>Je suis pas certain d’avoir bien compris le concept, mais le problème de faire ce que tu fais dans paintComponent là, c’est que si la façon de dessiner est très différente selon les entités, tu surchargera ta méthode. Et crois moi, cette méthode a besoin d’être la moins conditionnelle possible.</p>
<blockquote>
<p>Est-ce que la solution Adapter a le même problème ?</p>
</blockquote>
<p>Justement, cette solution permet de se reposer sur le polymorphisme et donc de mieux répartir ton code. Tu n’auras jamais de problème d’instancof.</p>