Thread et affichage graphique

cs_bertrand69fr Messages postés 6 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 24 octobre 2005 - 21 oct. 2005 à 09:24
cs_bertrand69fr Messages postés 6 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 24 octobre 2005 - 24 oct. 2005 à 19:37
Bonjour,



J'essaye de faire un programme simple du genre course de chevaux. Les
chevaux sont simplement représentés par des cercles... Le problème est
que le programme n'affiche pas les résultats dans la fenêtre graphique
mais il les affiche bien dans la fenêtre de commande.



Voila comment est fait le programme ; j'ai deux classes, la première
"Course" crée la fenêtre graphique et contient le main. La seconde
"Cercle" s'occupe de lancer les threads et de faire l'affichage.



==========================



import javax.swing.* ;

import java.awt.event.*;

import java.awt.*;



public class Course extends JFrame {



Cercle cercle1;

Cercle cercle2;





public Course(){



super("Course de chevaux");

setSize(800,600);

setLocation(100,100);




cercle1 = new Cercle("cercle1", "green", 0);


cercle2 = new Cercle("cercle2", "red", 1);



Container cont= getContentPane();

cont.setLayout(new FlowLayout());

cont.add(cercle1);

cont.add(cercle2);



repaint();



WindowListener l=new WindowAdapter(){


public void windowClosing(WindowEvent e){


System.exit(0);


}

};

addWindowListener(l);



}



public static void main (String arg[]){



Course jeu = new Course();

jeu.setVisible(true);

jeu.demarrage();



}



public void demarrage(){



Thread T1 = new Thread(cercle1);

Thread T2 = new Thread(cercle2);



T1.start();

T2.start();



}



}





=============================



import java.awt.*;

import javax.swing.*;

class Cercle extends JPanel implements Runnable {



String couleur;

int decalage ;

String name;

int y;





public Cercle(String name, String couleur, int y){

this.couleur = couleur;

this.name = name;

this.decalage = decalage;

this.y = y;

}



public void run(){



decalage = 0;

for (int i =1; i<=100; i++) {


decalage++;


repaint();


try{Thread.sleep((int)(Math.random() * 100));




} catch (InterruptedException e) {}

}


System.out.println(name + " est arrive ! ");



}



public void paint(Graphics g){



g.fillOval(50 + decalage*10,300 + y*10, 20,20);

System.out.println(name + " decalage : " + decalage);



}



}





Si quelqu'un a une idée...

5 réponses

cs_bertrand69fr Messages postés 6 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 24 octobre 2005
21 oct. 2005 à 12:21
oups, j'ai remarqué qu'il fallait enlever



this.decalage = decalage;



dans

public Cercle(String name, String couleur, int y){

this.couleur = couleur;

this.name = name;

this.decalage = decalage;

this.y = y;

}





Ce que j'aimerais savoir, c'est la raison pour laquelle dans



public void paint(Graphics g){



g.fillOval(50 + decalage*10,300 + y*10, 20,20);

System.out.println(name + " decalage : " + decalage);



}



le System.out.println affiche bien, mais pour le g.fillOval, nada...
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
21 oct. 2005 à 20:25
faut pas appeler un repaint ?

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
cs_bertrand69fr Messages postés 6 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 24 octobre 2005
21 oct. 2005 à 22:00
Oui c'est l'idée je pense, j'appelle bien repaint() dans la méthode run() :





for (int i =1; i<=100; i++) {


decalage++;


repaint();


try{Thread.sleep((int)(Math.random() * 100));




} catch (InterruptedException e) {}

}



Je devrais l'appeler à un autre endroit ?
0
cs_bertrand69fr Messages postés 6 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 24 octobre 2005
24 oct. 2005 à 18:13
L'erreur était au niveau du gestionnaire de mise en forme. J'ai enlevé le FlowLayout



cont.setLayout(new FlowLayout());



que j'ai remplacé par :



cont.setLayout(new GridLayout(2,1));



et ça marche très bien :)
0

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

Posez votre question
cs_bertrand69fr Messages postés 6 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 24 octobre 2005
24 oct. 2005 à 19:37
Maintenant les threads marchent correctement mais seulement en
apparence car j'ai deux fois le même thread qui s'affiche à l'écran,
mais l'autre thread tourne pourtant bien.



Le code modifié



import javax.swing.* ;

import java.awt.event.*;

import java.awt.*;



public class Course extends JFrame {



Cercle cercle1;

Cercle cercle2;

boolean gagner;



public Course(){



super("Course de chevaux");

//setBounds(0,100,450,300);

setSize(800,600);

setLocation(100,100);




cercle1 = new Cercle("cercle1", Color.GREEN, 0);


cercle2 = new Cercle("cercle2", Color.RED, 20);



Container cont= getContentPane();

cont.setLayout(new GridLayout(2,1));

cont.add(cercle1);

cont.add(cercle2);



gagner = false;



WindowListener l=new WindowAdapter(){


public void windowClosing(WindowEvent e){


System.exit(0);


}

};

addWindowListener(l);



}



public synchronized boolean gagner(){

if (gagner)


return false;

else {


gagner = true;


return true;

}





}



public static void main (String arg[]){



Course jeu = new Course();

jeu.setVisible(true);

jeu.demarrage();



}



public void demarrage(){

Thread T1 = new Thread(cercle1);

Thread T2 = new Thread(cercle2);

T1.start();

T2.start();



}



class Cercle extends JPanel implements Runnable {



Color couleur;

int distance ;

String name;

int y;

boolean res;




public Cercle(String name, Color couleur, int y){


this.couleur = couleur;


this.name = name;


this.name = name;


this.y = y;


res = false;

}



public void run(){




distance = 0;


while(distance < 1000) {


distance = (int) (distance + Math.random()*25);


repaint();




try{Thread.sleep((int)(Math.random() * 100));




} catch (InterruptedException e) {}


}


System.out.println(name + " est arrive ! ");


res = gagner();


repaint();

}



public void update(Graphics g) {


super.update(g);


paint(g);



}



public void paint(Graphics g){




g.setColor(couleur);


g.fillOval(50 + distance, 200 + y*10, 20,20);


if (res) g.drawString( name + " a gagné ! ", 400, 200 );


System.out.println(name + " distance : " + distance + " " + res);



}



}



}



Je devrais avoir deux disques de couleur différente, mais à l'écran
j'ai la même couleur, celle qui correspond à "cercle1" ie vert.



Je ne comprends pas non plus pourquoi l'affichage à la fin "machin a gagné" se fait en double.
0
Rejoignez-nous