Problème d'affichage de JPanel (et de synchronisation?)

Signaler
Messages postés
12
Date d'inscription
mercredi 10 octobre 2007
Statut
Membre
Dernière intervention
3 janvier 2010
-
Messages postés
12
Date d'inscription
mercredi 10 octobre 2007
Statut
Membre
Dernière intervention
3 janvier 2010
-
Tout d'abord, Bonjour / Bonsoir à tous !
Et je remercie d'avance ceux qui auront le courage de lire jusqu'en bas et de tenter de m'aider : -)

...

Je suis en deuxième année d'IUT Informatique (à Montpellier), et ai pour projet de fin de semestre
le développement en Java d'un jeu Othello implantant l'algorithme min/max pour l'Intelligence Artificielle.

Si certains ne connaissent pas ce jeu, qui est très simple à comprendre,
voici un lien avec quelques explications ( moins d'une minute devrait vous suffir ^^ ) :
= > ["http://www.ffothello.org/jeu/regles.php" http://www.ffothello.org/jeu/regles.php]

Toute la structure d'une partie, c'est a dire le bon déroulement des tours de jeu, est en place.
L'interface graphique est aussi en place : une JFrame avec un JPanel, rempli de JButton! ( 64 pour le plateau de jeu )
=> Le processus principal et la fenêtre sont éxécutés dans deux tâches différentes.

[I]Voici un screen de ma fenêtre lors du premier tour :
( en bleu les cases jouables )/I

http://imageshack.us

...

Pour une meilleure compréhension,
je vous décris le déroulement d'un tour de jeu dans mon programme :

... 1- Tout d'abord, le programme calcule les cases étant jouables, et les affiche au joueur.
... ... = > Envoi du nouveau plateau a afficher au panneau de la fenêtre.
... 2- Ensuite, il attend qu'un coup soit joué. ( il se bloque devant une CyclicBarrier, initialement à 2, et qu'il met 1. )
... 3- Une fois le coup joué, la barrière s'ouvre, le processus principal en récupère les coordonnées, et les inscris dans le plateau.
... 4- Une fonction détermine ensuite les cases "prises en sandwich" / "à retourner", et modifie le plateau.
... 5- Puis le programme affiche le nouveau plateau de jeu, avant de passer au tour suivant.
... ... => Nouvel envoi du nouveau plateau au panneau.

Par "Envoi du nouveau plateau" , j'appelle une méthode "affectation", qui est une sorte de second constructeur du panneau,
et qui met à jour les données partagées par le panneau et la Partie, et fais un repaint() du panneau.
= > Dans ces données, il y a principalement le plateau, qui doit être réaffiché avec le repaint().
( ré-Affichage des 64 cases, qui sont des JButton )

...

Mon problème est le suivant :

- Lorsque c'est au premier tour, le processus principal calcule les coups jouables (pour le joueur blanc),
les envoie au panneau qui se charge de les afficher, puis attend devant la barriere que le coup soit joué.
= ==> La réactualisation du panneau marche , comme vous pouvez le voir avec le screen. (affichage des cases jouables en bleu )

- Dès que je clique sur une de ces cases jouables, celle ci se redessine avec la couleur du joueur, puis réveille le processus principal, et y envoie ses coordonnées. Le processus principal récupère ses coordonnées, les traite parfaitement... ( phases 3 et 4 )
== > Des test d'affichage en console montrent que le plateau est correctement à jour.

- Mais , a la phase 5, à l'envoi de ce nouveau plateau, et malgré le repaint(), le panneau ne se réactualise pas...
Et la fenetre affiche seulement l'ancien panneau (avec les cases jouables) et la case jouée qui s'est autoactualisée elle même.
( Hum... Je pense que certains vont commencer à se poser des questions sur mes méthodes de "repaintage" x-) )

[I]Plateau affiché après le clic sur la case que l'on souhaite jouer :
( la case noire prise en sandwich en [4][5] devrait être blanche, ce qu'elle est en console )/I

http://imageshack.us
http://g.imageshack.us/img179/67952729pl1.jpg/1/

...

Mon souhait est donc simple :
=> Arriver à réactualiser mon panneau, avec les nouvelles informations de fin de tour !

Précisions:

- Comme dit au début, j'utilise deux tâches différentes pour la Partie et la fenêtre, synchronisées avec une CyclicBarrier (init à 2).
> Mais il y a peut être un foirage dans leur utilisation... ? :-/

- Quand je ne donne pas les coordonnées des coups avec l'interface graphique ( j'écris pour chaque tour les coordonnées dans le code ),
=> Tout se passe parfaitement ! Par ex, si je stoppe ma boucle de jeu au tour n°7, le panneau m'affiche le plateau comme il devrait être.
=> Par contre, si j'essaie de mettre un 'Thread.sleep()' de deux secondes a la fin de chaque tour, cela replante identiquement.
( En gros, mon programme n'aime pas trop qu'on le perturbe un chouilla semble t'il ... )

...

Voila donc en gros mon problème...
Dont je ne sais s'il est graphique ou 'synchronisationnel', ou bien même peut être les deux, ou encore moulte autre chose... ! ( o_O )
J'ai testé des 'panneau. revalidate ()' ou 'panneau.validate()' dans ma méthode 'affectation()', mais rien de plus...

Je sais que ce message est un beau paté, mais j'essaie d'être clair pour vous faciliter la chose.. ( ou pas :-o ) Mais cela fait en deux jours facilement 15h que je bute sur ce problème, en tentant le peu de choses que mes modestes compétences me permettent, et arpentant the Internet a la recherche de quelque chose.. Et je n'ai pour l'instant obtenu qu'un bon, beau, gros, frais, fort, nature... Pwet :-/

...

Pour le code source entier, si des généreux et courageux seraient tentés de s'y aventurer,
je l'ai mis à disposition à dans un dossier à dézipper, en format "projet" de Eclipse. ( Juste à importer )
=> [url]http://www.megaupload.com/fr/?d=1VP243BS/url

Je suis complètement partisan du "débrouilles toi avec ta besogne, on va pas te faire ton logiciel non plus !",
mais si cela peut vous permettre d'y voir plus clair dans le comment j'ai fait ma ... hum, alors et bien c'est avec plaisir : -)
( Le code est normalement "bien" commenté et lisible, vous devriez vous en sortir )

...

Voila voila... Pouf, allez je vais stopper ce message là.
Et remercie d'avance toutes personnes qui auront eu le courage d'arriver jusqu'ici, et qui essaieront de m'aider. : -)
Je reste bien sûr au taquet réactif à quelconque question, ou demande de précisions !

En vous souhaitant une Bonne fin de soirée, nuit, réveil !
NonoMoreno.

3 réponses

Messages postés
12
Date d'inscription
mercredi 10 octobre 2007
Statut
Membre
Dernière intervention
3 janvier 2010

Ouch ! C'est là que je me dis vraiment dommage qu'il n'y ait pas d'option "Prévisualisation"..
Moi qui pensait que comme sur d'autres sites, ça passerait...
Désolé pour les futurs lecteurs pour ce piteux formatage.. :-/
Messages postés
90
Date d'inscription
mercredi 24 décembre 2008
Statut
Membre
Dernière intervention
4 février 2009

Salut
click ici. Ca va peut-être t'aider.

Aussi, c'est hors contexte, mais les balises commencent par < et se terminent par > et non par [ et par ].

chris081

<hr width="100%" />

Est-ce que les femmes pètent autant que les hommes ?
Oui. Cependant, les hommes semblent en tirer plus de gloire que les femmes.

Retrouvez l'intégrale ici
Messages postés
12
Date d'inscription
mercredi 10 octobre 2007
Statut
Membre
Dernière intervention
3 janvier 2010

Du nouveau... !




Finalement, j'ai suivi le conseil d'une personne sur un autre fofo, et ai opté pour un modèle événementiel,
au lieu de mon ancien modèle "synchronisationnel foireux"... Et... Ca marche !

Après, j'ai quand même voulu re-essayer avec mon ancien modèle...
Et ca marche aussi maintenant !

La raison...?

...

=> A chaque repaint(), mes nouveaux composants s'affichaient * en dessous * des anciens.

...

Allez, j'importe java.util.zenToolkit et je n'essaie pas de comprendre...
En oubliant la trentaine d'heure passée sur un problème qu'un bon vieux removeAll() des campagnes a résolu avant chaque repaint()...

Donc voila. Maintenant je vais pouvoir attaquer mon IA, qui, soyons fou, j'espère sera prête pour ma soutenance demain x-)
Merci beaucoup quand même a toi chris081 pour ton aide, ça m'a fait de la doc en plus ; -)

Bonne continuation à ceux qui liront ce post,
et ptet, voire surement, à une prochaine sur ce forum !

NonoMoreno