Refresh d'une JFrame ???

supers03 Messages postés 106 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 1 décembre 2008 - 24 mars 2005 à 17:41
supers03 Messages postés 106 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 1 décembre 2008 - 4 avril 2005 à 09:58
Bonjour à tous

J'ai un problème avec une JFrame contenant des JButton : je change la couleur de fond des JButton, puis j'appel une méthode qui comporte une boucle while(true) ... et malheuresement la nouvelle couleur de fond des JButton n'est pas remise à jour.

Je pense que c'est à cause de la boucle et que la JFrame attend que la boucle soit terminé mais j'en suis pas sur, je suis pas un pro du Swing...

Quelqu'un aurai une solution pour faire un refresh ???
A voir également:

20 réponses

cs_ducheseb Messages postés 344 Date d'inscription mardi 18 mai 2004 Statut Membre Dernière intervention 23 juin 2006 9
25 mars 2005 à 09:13
Il suffit de faire un repaint sur la JFrame.
0
supers03 Messages postés 106 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 1 décembre 2008
25 mars 2005 à 10:10
Ben j'avais essayé mais ça marche pas .... (j'avais même essayé de faire un repaint sur les JButton mais ça marche pas non plus)

J'aimerai vraiment trouver une solution parce que je n'ai pas vraiment envie de passer par des Threads ...
0
supers03 Messages postés 106 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 1 décembre 2008
25 mars 2005 à 17:28
En fait une autre info : lorsque je met une autre fenetre devant celle_ci ou que je la redimensionne ou autre, son affichage "foire" comme quand une applcation a buggé et qu'elle ne répond plus :s
0
cs_ducheseb Messages postés 344 Date d'inscription mardi 18 mai 2004 Statut Membre Dernière intervention 23 juin 2006 9
25 mars 2005 à 17:48
peux-tu fournir plus de code?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
supers03 Messages postés 106 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 1 décembre 2008
26 mars 2005 à 10:40
Bien sur je vais essayer.
Donc il s'agit d'un jeu d'echec. Lorsque je clique sur une case (JButton) le background des JButton sur lesquels la piece peu se déplacer deviennent rose. Puis suite au deuxieme click sur une case rose, ma piece se déplace, toute les case reprennent leur background d'origine puis c'est au joueur suivant de jouer (c'est ces deux dernières opérations qui sont illustré ci dessous) :

for (int i=0;i<8;i++){
for (int j=0;j<8;j++){
if (tab_piece[i][j].button.getBackground()==Color.pink){
tab_piece[i][j].button.setBackground(tab_piece[i][j].couleur);
}
}
}
change_joueur();

Avec dans le tab_piece[][] les JButton crées dans la JFrame
puis :

static void change_joueur(){
if (joueur==1){
joueur = 2;
}else{
joueur = 1;
}
Grid.no_joueur.setText(Integer.toString(joueur));
tab_joueur[joueur].play();
}

et dans le cas d'une IA ou d'un joueuer en réseau le tab_joueur[joueur].play(); peu tourner en boucle un petit moment ...

Par contre je viens de m'apercevoir d'une chose interessante : le label no_joueur (numéro du joueur) qui est en static lui se met à jours (à la différence de mes JButtons ... )

Voilà ...
0
cs_Yenapa Messages postés 67 Date d'inscription samedi 12 juillet 2003 Statut Membre Dernière intervention 26 juin 2009
26 mars 2005 à 15:51
Change ton if (tab_piece[i][j].button.getBackground()==Color.pink){
en if (tab_piece[i][j].button.getBackground().equals(Color.pink)){

en faisant if (tab_piece[i][j].button.getBackground()==Color.pink){tu teste juste si les adresses en memoire sont les memes, ce qui prouve que c'est le meme objet.
Bien sur, 2 objets ayant la meme adresses sont identiques (puisque c les memes) mais la reciproque est fausse.
La seule methode pour tester l'egalité de deux objets differents (par leur adresse) et d'utiliser la methode equals (que je vous conseille de surcharger dans vos classes...)

J'espere que ca resoudra ton probleme
0
supers03 Messages postés 106 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 1 décembre 2008
26 mars 2005 à 16:05
Bon j'ai testé ta solution mais ça arrange rien.
Je m'en doutais d'ailleur parce que mon test est tout à fait correct, alors si ce que tu dis est vrai je sais pas pourquoi ça marche mais je peu te garantir que ça marche...
0
cs_Yenapa Messages postés 67 Date d'inscription samedi 12 juillet 2003 Statut Membre Dernière intervention 26 juin 2009
26 mars 2005 à 16:09
Il va falloir que je pose quelques questions a mes anciens profs
0
supers03 Messages postés 106 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 1 décembre 2008
26 mars 2005 à 16:15
d'ailleur je viens de voir que je fais aussi "==" pour deux JButton ...
0
cs_ducheseb Messages postés 344 Date d'inscription mardi 18 mai 2004 Statut Membre Dernière intervention 23 juin 2006 9
26 mars 2005 à 17:57
Il est clair que le = = ne compare pas des adresses mémoires.

Je ne vois pas ta boucle while(true) mais si elle se trouve dans la même partie du code que ta mise à jour des couleur des boutons, c'est normal que cela ne s'affiche pas. Le rafraichissement ne se fait qu'à la fin de l'exécution de ton morceau de code.

Peut-être que tu devrais mettre ton code avec while(true) dans un autre Thread.
0
supers03 Messages postés 106 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 1 décembre 2008
27 mars 2005 à 16:42
ducheseb >> comme je l'ai mis à la fin du code, la boucle while(true) est appelé là : tab_joueur[joueur].play(); ... en fait dans le cas d'une IA par exemple, tant qu'elle ne trouvera pas de bon coup à jouer elle va continuer à chercher, et pendant ce temp là ben mon affichage ne se réactualise pas ...

en ce qui concerne les thread ben j'ai fini par en faire un mais j'aime pas trop ça, j'ai toujours un peu de mal pour syncroniser les actions des différentes parties du programme : je met une variable boolean qui m'indique si l'action est terminé ou pas, et de l'aiutre coté je fais une boucle while (avec un peutit sleep(200)) qui attend que cette variable soit sur 'true' ... et franchement je suis pas sur que ce soit la meilleur solution ...
0
cs_Yenapa Messages postés 67 Date d'inscription samedi 12 juillet 2003 Statut Membre Dernière intervention 26 juin 2009
27 mars 2005 à 18:12
et pourquoi pas utiliser wait et notify?
0
supers03 Messages postés 106 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 1 décembre 2008
28 mars 2005 à 13:47
Yenapa >> heu tout simplement parce que je connaissait pas !!!
Je vais tester voir ce que ça fait
0
supers03 Messages postés 106 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 1 décembre 2008
29 mars 2005 à 12:49
J'ai essayer de mettre un Wait() dans mon thread mais j'ai une Exception :
java.lang.IllegalMonitorStateException: current thread not owner

donc où puis-je mettre le wait() ??? quels sont ses restrictions
0
cs_Yenapa Messages postés 67 Date d'inscription samedi 12 juillet 2003 Statut Membre Dernière intervention 26 juin 2009
29 mars 2005 à 16:55
met le wait() dans un bloc synchronised

Par exemple:
synchronized(this) {
...wait();
}
0
supers03 Messages postés 106 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 1 décembre 2008
29 mars 2005 à 18:38
arf j'arrive pas à l'utiliser ....

voici la trame de mon code :

public Class class1 {
public static void main(String[] args) {
...
Thread t = new ThreadPerso();
// là je fais une frame avec des listeners qui vont utiliser le test()
...
}
public static test(){
pause();
}
public static pause(){
// de là j'aimerai mettre en pause du thread
}
}
0
supers03 Messages postés 106 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 1 décembre 2008
1 avril 2005 à 10:50
Bon alors je vais être un peu plus préci en espérant une aide.
Ma class Thread :

public class Thread_change extends Thread {

public Thread_change(){
//
}

public void run(){
int i=0;
while(true){
i++;
try {
Thread.sleep(200);
} catch (Exception e) {
//
}
System.out.println(i);

}
}
public synchronized void pause() {
try{
System.out.println("pause1");
wait();
System.out.println("pause2");
}catch(InterruptedException ie){
System.out.println("erreur"+ie);
}
}
}
et ma Class principale :

public class Chess {
static Thread_change t;
public static void main(String[] args) {
t = new Thread_change();
t.start();
t.pause();
}
}

est ben si je lance le programme j'ai :
pause1
1
2
3
4
5
6
etc .... sans le "pause2" ni d'erreur !!!

Y'a quelque chose de mauvais dans mon code
0
cs_ducheseb Messages postés 344 Date d'inscription mardi 18 mai 2004 Statut Membre Dernière intervention 23 juin 2006 9
1 avril 2005 à 17:23
Ton thread t a besoin de recevoir un notify() d'un autre thread pour se réveiller.
0
supers03 Messages postés 106 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 1 décembre 2008
1 avril 2005 à 18:47
ducheseb >> Je connais le notify() mais là j'arrive déjà pas à le mettre en pause, donc j'ai pas encore besoin de le reveiller : la méthode pause() est bien appelée (pour preuve le message "pause1") et bloque sur wait() (pour preuve je n'ai ni le message d'erreur ni le "pause2") ... mais comme tu peu le voir le Thread continuais à compter ... donc j'en déduit que le wait() n'a pas marché ...
0
supers03 Messages postés 106 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 1 décembre 2008
4 avril 2005 à 09:58
ça y est j'ai compris : quand je met wait() ça met en pause la méthode qui est "synchronized" donc il suffisait de rajouter synchronized dans le run ....

... merci à tous ceux qui m'ont aidé
0
Rejoignez-nous