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

 Java Discussion :

Problème de mouvement d'un carré en Java


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 40
    Points : 28
    Points
    28
    Par défaut Problème de mouvement d'un carré en Java
    Bonjour, svp j'ai un problème au niveau d'animation d'un carré, pour l'affichage il s'affiche bien, mais pour la l'animation et le movement non !
    j'ai associé a ce carré une fonction move(); qui incrément sa position X et le dessiner une autre fois, mais je sais pas le problème car l'affichage s'arrete sans aucune condition , svp aidez-moi


    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
     
     
    package Pack_Tr_No1;
     
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import javax.swing.JPanel;
     
    /**
     *
     * @author CY_15
     */
    public class OG extends JPanel{
     
        private static int id;
        private final int idOG;
        private int x;
        private int y;
        private int h;
        private int l;
        private Color Col;
        private String Nom;
     
        public OG()
        {
            idOG=++id;
            x=0;
            y=0;
            h=0;
            l=0;
            Col=Color.BLUE;
            Nom="OG_"+idOG;
        }
        public OG( int xx, int yy, int ll, int hh, String nn )
        {
            idOG=++id;
            x=xx;
            y=yy;
            h=hh;
            l=ll;
            Nom=nn+idOG;
        }
        public OG( int xx, int yy, int ll, int hh)
        {
            idOG=++id;
            x=xx;
            y=yy;
            h=hh;
            l=ll;
            Nom="OG_"+idOG;
        }
     
       // les Methodes :
     
        @Override
        public void paintComponent(Graphics g) 
        {
            Graphics2D g1=(Graphics2D) g;
            super.paintComponent(g1);
     
            Color c1= this.getCol();
            g1.setColor( c1);
            g1.fillRect( x, y, h, l);
        }
     
        public void move()
        {
     
            while (true)
            {
                this.setX(++x);
                try 
                {
                    Thread.sleep(3);
                    repaint();
                }
                catch (InterruptedException ex) 
                {
                    System.out.println("Erreur");
                }
     
            }
        }
     
        //Geters & Seters :
        //Geters :
        public int getId()
        {
            return this.idOG;
        }
        @Override
        public int getX()
        {
            return this.x;
        }
        @Override
        public int getY()
        {
            return this.y;
        }
        public int getH()
        {
            return this.h;
        }
        public int getL()
        {
            return this.l;
        }
        public Color getCol()
        {
            return this.Col;
        }
        public String getNom()
        {
            return this.Nom;
        }
        // Setrs :
        public void setX(int xx)
        {
            this.x = xx;
        }
        public void setY(int yy)
        {
            this.y = yy;
        }
        public void setH(int hh)
        {
            this.h = hh;
        }
        public void setL(int ll)
        {
            this.l = ll;
        }
        public void setCol(Color cc)
        {   
            this.Col= cc;
        }
        public void setNom(String nn)
        {
            this.Nom = nn;
        }
     }
    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 Travail_No1_MOO{
     
        public static void main(String[] args) {
     
            JFrame f = new JFrame("OG ...");
            f.setSize(600, 500);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setResizable(false);
            f.setVisible(true);
     
            OG og=new OG();
            og.setL(50);
            og.setH(50);
            og.setCol(Color.CYAN);
            f.setContentPane(og);
     
            og.moveH();
        }
    }

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    C'est normal, ta méthode move bloque le thread de l'interface et donc tout freeze (niveau affichage).

    Je t'invite dés lors a lire ceci qui te permettra peut être d'y voir un peu plus claire http://gfx.developpez.com/tutoriel/j...ing-threading/
    (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

  3. #3
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Non, pas avec le code je vois là : move() (et pas moveH() comme indiqué dans le main()) s'éxecute dans le main et pas dans l'EDT. Le paint()/paintComponent() n'est plus exécuté au bout d'un moment parce que la zone visible n'est jamais dirty, donc pas besoin de redessiner.
    Ce qui est remarquable en revanche c'est que le carré ne disparaisse pas à droite : il semble se figer avant le bord droite de la fenêtre, à la moitié un peu près.
    En fait, c'est dû au fait de redéfinir getX() et getY() de JPanel : combiné à la non utilisation de revalidate(), ça déplace le panel en dépit du layouting (qui est assez particulier en plus vu qu'on a remplacé le contentPane de la fenêtre. Les coordonnées du rectangle en mouvement se confondent avec celles du JPanel et ça fait n'importe quoi.
    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.

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    En effet j'ai dit une connerie sur ce coup la. Mais bon au final je suppose qu'il va deplacer son appel a move ailleurs que dans le thread principal...
    (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

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Salut,

    Non, pas avec le code je vois là : move() (et pas moveH() comme indiqué dans le main()) s'éxecute dans le main et pas dans l'EDT. Le paint()/paintComponent() n'est plus exécuté au bout d'un moment parce que la zone visible n'est jamais dirty, donc pas besoin de redessiner.
    Ce qui est remarquable en revanche c'est que le carré ne disparaisse pas à droite : il semble se figer avant le bord droite de la fenêtre, à la moitié un peu près.
    En fait, c'est dû au fait de redéfinir getX() et getY() de JPanel : combiné à la non utilisation de revalidate(), ça déplace le panel en dépit du layouting (qui est assez particulier en plus vu qu'on a remplacé le contentPane de la fenêtre. Les coordonnées du rectangle en mouvement se confondent avec celles du JPanel et ça fait n'importe quoi.
    Merci de me répond, mais tant que un débutant j'ai pas compris la majorité de ce que tu as dis ! svp juste encore une petite explication , Merci

  6. #6
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Les méthodes getX() et getY() sont des méthodes standards des composants Swing : elles sont utilisées par Swing pour gérer la position du composant dans son parent, dans le cadre d'un mécanisme qu'on appelle layout. Ce mécanisme standard est géré par Swing, automatiquement lorsque c'est possible : si Swing ne peut savoir qu'on a fait un changement qui nécessite de modifier la position du composant, on doit appeler explicitement la méthode revalidate(). Lorsque tu appelles repaint(), la fenêtre est redessinée : tous les composants qui s'y trouvent le sont, à la position définie par getX() et getY(), qui, normalement devraient être calculée par le mécanisme de layout.

    Le fait que tu redéfinisses ces méthodes (notion de base de programmation objet : redéfinir une méthode est écrire la méthode avec du code à toi, qui fait que la méthode ne fait plus ce qu'elle faisait à l'origine : ceci est d'ailleurs indiqué par l'annotation @override) en disant que les coordonnées du panel OG sont celle du rectangle à l'intérieur fait qu'a chaque repaint() le panel est dessiner à la position du rectangle, puis le rectangle est dessiné dans ce panel à sa position. Le carré se déplace bien, mais le panel aussi.

    Ajouté à cela, il y a des mécanismes d'optimisation qui font que Swing ne redéssine que ce qu'il estime nécessaire : comme le panel se déplace vers la droite, il finit par sortir de la fenêtre, et donc ne se redessine plus (inutile de redessiner quelque chose qu'on ne peut pas voir). Le résultat est que ton rectangle se déplace bien (mais pas comme il devrait en réalité : il se déplace en fait plus vite, puisque le panel et le rectangle se déplacent tous les deux de 1 pixel vers la droite en même temps. Le panel finit par sortir, le rectangle aussi, mais il finit par rester affiché partiellement à droite parce que le panel n'est plus redessiné à un moment donné (quand il sort de la fenêtre). Si tu ajoutes une trace (un System.out.println("repaint"); dans ta méthode paintComponent) tu verras que cette trace ne s'affiche plus à partir d'un certain moment (si tu ajoutes une trace dans move(), elle continuera à s'afficher continuellement).

    Le fait que tu remplaces le content pane de la fenêtre par ton panel OG, au lieu de mettre ton panel OG dans le content pane, fait que les mécanismes spécifiques de layouting et redessin du content pane doit faire qu'il y a également interférence : peu importe les détails, mais le comportement n'en peut être que altéré.

    Il suffit que tu fasses des méthodes différentes pour gérer la position de ton rectangle : par exemple tu les appelles setRectangleX(), setRectangleY() getRectangleX() et getRectangleY(). Tu verras que ton rectangle se déplace vers la droite et disparaît complètement. Ensuite, il te faudra penser justement à éviter de déplacer ton rectangle indéfiniment vers la droite (while(true)), mais c'est un autre problème. Autre chose : la largeur est horizontale et la hauteur verticale (tant que c'est la même valeur ça ne fait pas de différence évidemment).
    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.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Mr. je vous remercie infiniment, le problème est réglé, merci encore une fois

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

Discussions similaires

  1. problème d'animation d'un carré en JAVA
    Par youness15 dans le forum Développement 2D, 3D et Jeux
    Réponses: 3
    Dernier message: 07/11/2015, 22h51
  2. Réponses: 2
    Dernier message: 09/04/2008, 09h55
  3. Problème de connection à la BD Mysql via Java
    Par ferrari75k dans le forum JDBC
    Réponses: 25
    Dernier message: 21/01/2008, 23h41
  4. [Inno Setup] Problème de lancement de fichier bat avec Java
    Par oliviercotedor dans le forum Outils
    Réponses: 3
    Dernier message: 13/12/2007, 16h27
  5. Problèmes de versions avec Xalan, Xerces et Java
    Par honeyz dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 05/06/2003, 10h18

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