Thread et paintComponent

banniwe Messages postés 13 Date d'inscription vendredi 31 octobre 2008 Statut Membre Dernière intervention 22 mai 2009 - 22 mai 2009 à 12:07
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 - 23 mai 2009 à 02:08
bonjour,

Encours nous avons vu comment effectuer le deplacement d'un mobile (un carrer noir) à travers un Jframe à l'aide des Threads.
voici le code
classe Unmobile:
import javax.swing.*;
import java.awt.*;

class UnMobile extends JPanel implements Runnable
{
    int saLargeur, saHauteur, sonDebutDessin;
    final int sonPas=10,sonTemps =100, sonCote=40;
   
    public UnMobile(int telleLargeur, int telleHauteur)
    {
        super();
        saLargeur = telleLargeur;
        saHauteur = telleHauteur;
        setSize(saLargeur, saHauteur);
    }
   
    public void run()
    {
        for(sonDebutDessin=0; sonDebutDessin<saLargeur-sonCote; sonDebutDessin+=sonPas)
        {
            repaint();
            try
            {
                Thread.sleep(sonTemps);
            }
            catch(InterruptedException parExt)
            {
                parExt.printStackTrace();
            }
        }
    }
   
    public void paintComponent(Graphics telContexteGraphique)
    {
        super.paintComponent(telContexteGraphique);
        telContexteGraphique.fillRect(sonDebutDessin,saHauteur/2,sonCote,sonCote);
    }
   
}

classe Fenetre
import java.awt.*;
import javax.swing.*;

class Fenetre extends JFrame
{
    private UnMobile mobile = new UnMobile(200,300);
   
    public Fenetre()
    {
        super("titre");
        Container conteneur = getContentPane();
        conteneur.add(mobile);
        new Thread(mobile).start();
        setSize(200,300);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

pour l'instant aucun probleme , mais je n'arrive pas à faire la généralisation de se cas ( avec plusieur mobiles)
les mobile n'apparaissent pas toujours en mem temps...
voici mon code

classe fenetre
import java.awt.*;
import javax.swing.*;

class Fenetre extends JFrame
{
    private UnMobile mobile = new UnMobile(200,300);
    private UnMobile mobile2 = new UnMobile(400,600);
    public Fenetre()
    {
        super("titre");
        Container conteneur = getContentPane();
        conteneur.add(mobile);
        new Thread(mobile).start();
        conteneur.add(mobile2);
        new Thread(mobile2).start();
        setSize(400,600);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

pour la classe UnMobile rien n'est changé ( jai essayé de synchroniser le contenu de la boucle for (avec synchronized(un_objet_static) ) mais cela n'a eu aucun effet))

merci pour votre aide

1 réponse

uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
23 mai 2009 à 02:08
Tu peus essayer ceci:

...
    private UnMobile mobile = new UnMobile(200, 300);
    private UnMobile mobile2 = new UnMobile(200, 300);//<-------------------
...
        super("titre");
        Container conteneur = getContentPane();
        conteneur.setLayout(new FlowLayout());//<-------------------
...
class UnMobile extends JPanel implements Runnable {
...
    public UnMobile(final int telleLargeur, final int telleHauteur) {
        super();
        saLargeur = telleLargeur;
        saHauteur = telleHauteur;
        setPreferredSize(new Dimension(saLargeur, saHauteur));//<-------------------
    }
...
}
Rejoignez-nous