IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Agents de placement/Fenêtres Java Discussion :

repaint () qui redessine un composant de trop


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 48
    Par défaut repaint () qui redessine un composant de trop
    Bonjour, alors tout d'abord ceci vient d'un énoncé scolaire donc je dois bien faire 2 fenêtres différentes.
    Le principe est de créer un "genre de billard", plutôt un flipper enfaite, avec des obstcales et où une balle est lancée, à chaque fois que la balle touche un obsctale, des points sont comptabiliser et afficher dans une autre fenêtre que la fenêtre principale.

    Je vais essayer d'être clair en vous montrant mon code :

    Ma classe Fenetre : la fenetre principale contenant le "billard" (flipper).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public class Fenetre extends JFrame
    {
        private Container container;
        private Billard billard;
     
        public Fenetre (String titre)
        {
            super(titre);
     
            setBounds(100, 100, 485, 655); //Position x, position y (coin haut gauche), largeur, hauteur.
     
            MyWindowListener winListener = new MyWindowListener ();
            this.addWindowListener(winListener);
     
            this.billard = new Billard ();
     
            container = getContentPane ();
            container.setLayout(new BorderLayout());
            container.add(billard, BorderLayout.CENTER);
     
            FenetrePoints fenetrePoints = new FenetrePoints("Points", billard); // Créer la 2ème fenêtre censer afficher les points.
     
            this.setVisible(true);
        }
    La classe fenetrePoints :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class FenetrePoints extends JFrame {
     
        private Container container;
        private Billard billard;
     
        public FenetrePoints (String titre, Billard billard)
        {
            super(titre);
            this.billard = billard;
     
            //billard.setIgnoreRepaint(true); J'ai essayer cette méthode mais ça ne fonctionne pas.
     
            setBounds(800, 100, 200, 200);
     
            container = getContentPane();
            container.setLayout(new BorderLayout());
            container.add(new Compteur(this.billard));
     
            this.setVisible(true);
        }
    La classe du compteur :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class Compteur extends JPanel {
     
        private Billard billard;
        private ThreadPoints threadPoints;
     
     
        public Compteur (Billard billard)
        {
            this.billard = billard;
     
            threadPoints = new ThreadPoints(this);
            Thread t = new Thread(threadPoints);
            t.start();  
        }
     
        @Override public void paint (Graphics g)
        {
            g.drawString(" " + billard.getTotalPoints(), 20, 20);
        }  
    }
    Et enfin ma Thread qui réaffiche constamment les points.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class ThreadPoints implements Runnable {
     
        private Compteur compteur;
        private boolean continuer;
     
        public ThreadPoints (Compteur compteur)
        {
            this.compteur = compteur;
            continuer = true;
        }
     
        @Override public void run ()
        {
            while(continuer == true)
            {
                compteur.repaint();
            }
        }  
    }
    Bon maintenant mon problème c'est que les points s'affiche bien mais par contre un 2ème "billard" se dessine dans la 2ème fenêtre, or je ne l'ai jamais demandé..

    J'ai remarqué en mettant la fonction repaint() à l'intérieur de la Thread en commentaire, que le paint() du compteur n'affiche pas le billard mais bien le repaint(), alors je me demande vraiment pourquoi..

    Déjà merci d'avance pour vos réponses ! :/

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    le contexte graphique utilisé pour dessiner (l'instance de classe Graphics) est recyclé : il est nécessaire de l'effacer pour dessiner à chaque paint(...), sinon tu peux avoir des reliquats de dessins faits dans d'autres composants.

    Ceci est fait par défaut dans les composants Swing, à partir du moment ou ils sont opaque (sauf pour la JFrame).

    Si tu ajoutes au début de la méthode paint(...) de ta classe Compteur un appel au super.paint(), ça devrait permettre justement d'exécuter le code par défaut du JPanel qui va effacer le contexte graphique avant que tu dessines ce que tu veux dans le panel Compteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Compteur extends JPanel {
     
       ...
     
       @Override
       public void paint (Graphics g) {
            super.paint(g);
            g.drawString(" " + billard.getTotalPoints(), 20, 20);
        }  
     
    }
    Ensuite tu ne dois pas appeler repaint() constamment, mais uniquement lorsque c'est nécessaire, donc pour ta classe Compteur, lorsque les points changent : sinon ton thread va consommer un max de cpu pour redessiner inutilement.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 48
    Par défaut
    Oh oui, ça fonctionne maintenant, un grand merci pour ton explication.
    Et je vais changer la façon dont mon Thread s'éxecute en y mettant un wait et un notify à chaque fois que des points y sont ajouté je pense, encore merci.

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 112
    Par défaut
    Tu pourrais faire ca, mais tu pourrais aussi supprimer carement le thread qui en l'état a mon avis ne sert a rien si ce n'est compliqué l'exercice inutilement. (C'est une boucle qui appelle un repaint sur le composant...)
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. repaint qui marche pas
    Par burhud dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 12/11/2006, 18h11
  2. Un programme qui veut bosser; mais pas trop.
    Par Flodelarab dans le forum C++
    Réponses: 8
    Dernier message: 28/08/2006, 15h33
  3. Réponses: 2
    Dernier message: 22/07/2006, 20h13
  4. [debutant] Redessiner un composant
    Par mawashee dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 20/04/2005, 20h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo