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

AWT/Swing Java Discussion :

déplacement d'un rectangle


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 354
    Par défaut déplacement d'un rectangle
    Bonjour à tous ,

    Je débute en Java et j'essaie de réaliser un rectangle qui se déplace dans une fenêtre.
    Pour l'instant j'arrive à afficher un rectangle tout court mais pas de déplacement.
    voici mon code
    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
     
    import java.awt.*;
    import javax.swing.*;
     
     
    class Point extends JPanel
    {
     
        //Les attributs
    	 int x ;
    	 int y ;
     
    	 //Le constructeur 
     
    	 public Point(int x , int y )
    	 {
    	 this.x = x ;
    	 this.y = y ;
    	 }
     
    	  public void paint (Graphics g)
    	 {
    	 g.setColor(Color.red);
    	 }
     
     
    }
     
    class Dessin_Rect extends Point
    {
     
        //Les attributs
    	 int largeur ;
    	 int longueur ;
     
    	 //Le Constructeur
     
    	 public Dessin_Rect(int x , int y , int largeur ,int longueur)
    	 {
     
    	 super( x , y) ;
    	 this.largeur = largeur ;
    	 this.longueur = longueur ;
     
    	 }
     
    	 //Redéfinition de la méthode paint()
     
    	 public void paint (Graphics g)
    	 {
    	 super.paint(g);
    	 g.fillRect( x , y , largeur , longueur ) ;
    	 }
    }
     
    //La classe qui va contenir la fenêtre
     
    class MonAffichage extends JFrame
    {
        //Les attributs
    	 Point A ;
    	 Dessin_Rect B ;
     
    	 //Le Constructeur
     
    	 public MonAffichage()
    	 {
    	 A = new Point(10,15) ;
    	 B = new Dessin_Rect(10,15,20,30) ;
    	 this.add(B);
    	 }
     
    }
     
    public class Test_Monaffichage
    {
     
       public static void main (String []argv)
    	{
    	MonAffichage essai = new MonAffichage();
    	essai.setSize(200,200);
    	essai.setVisible(true);
    	essai.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
     
    }
    J'aurai voulu utiliser par exemple la variable x et la faire évoluer par une boucle
    Donc pour utiliser x j'ai dans un autre essai utiliser les accesseurs mais dans ce cas ça ne complie pas.
    Je poste le code juste après.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 354
    Par défaut
    Voici la suite de mon message pour pas faire trop long.
    J'ai essayé d'utiliser un accesseur pour accéder à x et ainsi faire évoluer la valeur de x dans une boucle.
    Mais mon code ne compile pas j'ai le message : x is not public in java.awt.component; cannot be accessed from outside package

    Voici le code et merci d'avance pour toute l'aide que vous pourrez m'apportez.
    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
     
     
    import java.awt.*;
    import javax.swing.*;
     
     
    class Point extends JPanel
    {
     
        //Les attributs
    	 int x ;
    	 int y ;
     
    	 //Le constructeur 
     
    	 public Point(int x , int y )
    	 {
    	 this.x = x ;
    	 this.y = y ;
    	 }
     
    	  public void paint (Graphics g)
    	 {
    	 g.setColor(Color.red);
    	 }
     
        // Les accesseurs
    	 public int getX()
    	 {
    	 return x ;
    	 }
     
    	 public void SetX(int x)
    	 {
    	 this.x = x ;
    	 }
     
    }
     
    class Dessin_Rect extends Point
    {
     
        //Les attributs
    	 int largeur ;
    	 int longueur ;
     
    	 //Le Constructeur
     
    	 public Dessin_Rect(int x , int y , int largeur ,int longueur)
    	 {
     
    	 super( x , y) ;
    	 this.largeur = largeur ;
    	 this.longueur = longueur ;
     
    	 }
     
    	 //Redéfinition de la méthode paint()
     
    	 public void paint (Graphics g)
    	 {
    	 super.paint(g);
    	 g.fillRect( x , y , largeur , longueur ) ;
    	 }
    }
     
    //La classe qui va contenir la fenêtre
     
    class MonAffichage extends JFrame
    {
        //Les attributs
    	 Point A ;
    	 Dessin_Rect B ;
     
    	 //Le Constructeur
     
    	 public MonAffichage()
    	 {
    	 x = A.getX() ;
    	 A = new Point(x,5) ;
    	 B = new Dessin_Rect(x,15,20,30) ;
    	 this.add(B);
    	 }
     
    }
     
    public class Test_Monaffichage2
    {
     
       public static void main (String []argv)
    	{
    	MonAffichage essai = new MonAffichage();
    	essai.setSize(200,200);
    	essai.setVisible(true);
    	essai.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
     
    }

  3. #3
    Membre émérite

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Par défaut
    bonjour,

    x et y sont déja utilisé dans la classe java.awt.component tu ne peux les utiliser tu dois changer de nom de variable.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 354
    Par défaut
    Bonjour ,
    Effectivement le but est de réaliser des déplcements mais dans un premier temps j'aimerai dans mon main donner une valeur à x et le rectangle s'afficherait à cette valeur et une autre valeur à x et ainsi de suite.
    Pour le thread que ferait le thread ???

    Merci

  5. #5
    Membre émérite

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Par défaut
    Citation Envoyé par une_tite_question Voir le message
    Bonjour ,
    Effectivement le but est de réaliser des déplcements mais dans un premier temps j'aimerai dans mon main donner une valeur à x et le rectangle s'afficherait à cette valeur et une autre valeur à x et ainsi de suite.
    Pour le thread que ferait le thread ???

    Merci

    la plupart (pour ne pas dire toutes car je ne suis pas certain) des animations sont gerer par thread car il est facile d'endormir un thread pour un temps donné afin que l'animation ne soit pas instantané grace a la méthode sleep()

    on ne peut appliquer la méthode sleep a autre chose qu'un thread d'aprés ce que je sais... ton programme serai donc un thread dans lequel tu ferai varié x et y, afficher le rectangle et que tu endormirai durant un laps de temps défini a chaque fin de boucle par exemple. c'est comme ca que je le vois mais je peux me tromper

  6. #6
    Membre expérimenté Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Par défaut
    Salut,
    Tu peux te servir d'un timer swing pour réaliser une animation. Voici un bout de code:
    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
     
     
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    public class AnimationTest{
     
        public static void main(String[] args){
     
     
            JFrame frame = new JFrame("Animation Test");
            frame.setSize(600, 400);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            AnimationPanel panel =new AnimationPanel(0, 10, 40, 30);
            Container container = frame.getContentPane();
            container.add(panel);
     
            frame.setVisible(true);
            panel.startAnimation();
     
        }
     
     
    }
     
    class AnimationPanel extends JPanel implements ActionListener{
     
     
        private int x;
        private int y;
        private int width;
        private int height;
        private Timer timer;
     
        public AnimationPanel(int x, int y, int w, int h){
     
            this.x = x;
            this.y = y;
            width = w;
            height = h;
            timer = new Timer(200, this); // 200 millesecondes;
        }
     
     
        public void paintComponent(Graphics g){
     
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
     
            g2d.setColor(Color.black);
     
            g2d.fillRect(x, y, width, height);
     
        }
     
        public void actionPerformed(ActionEvent event){
     
            /* Chaque fois que le timer appelle cette methode
             * modifier les coordonnées du rectangle et appeller
             * la methode repaint pour le redessiner
             */
     
            x = (x + 5) % 100;
            repaint();
     
        }
     
        public void startAnimation(){
     
            timer.start();
        }
     
        public void stopAnimation(){
     
                timer.stop();
            }
     
    }
    x et y sont déja utilisé dans la classe java.awt.component tu ne peux les utiliser tu dois changer de nom de variable.
    C'est incorrect. A ma connaissance il n'existe pas de variables x et y dans la classe Component et même si elles existent, rien n'empêche d'utiliser des noms pareils si les variables ne sont pas visibles par la sous classe c'est-à-dire elles sont déclarées private.

  7. #7
    Membre émérite

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Par défaut
    Citation Envoyé par Amine_sas Voir le message
    C'est incorrect. A ma connaissance il n'existe pas de variables x et y dans la classe Component et même si elles existent, rien n'empêche d'utiliser des noms pareils si les variables ne sont pas visibles par la sous classe c'est-à-dire elles sont déclarées private.

    Mais mon code ne compile pas j'ai le message : x is not public in java.awt.component; cannot be accessed from outside package
    je ne fais que traduire et les variables x et y ne sont pas déclaré private et sont visible.
    Et si tu vérifie dans les sources de la classe Component tu verras que x et y existe vraiment.

  8. #8
    Membre expérimenté Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Par défaut
    Salut,
    Oui les variables x et y existent effectivement dans le code de Component mais elles sont déclarées sans le modificateur d'accès public donc elles ne son pas visibles en dehors du package contenant Component d'où le message:
    x is not public in java.awt.Component; cannot be accessed from outside package
    Le code que j'ai donné compile car j'ai declaré de nouvelles variables avec les noms x et y. Le compilateur va prendre en considération ces nouvelles variables et il ne pensera pas que vous essayiez d'utiliser les variable x et y de la super classe Component.

  9. #9
    Membre émérite

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Par défaut
    Citation Envoyé par Amine_sas Voir le message
    Salut,
    Oui les variables x et y existent effectivement dans le code de Component mais elles sont déclarées sans le modificateur d'accès public donc elles ne son pas visibles en dehors du package contenant Component d'où le message:
    Le code que j'ai donné compile car j'ai declaré de nouvelles variables avec les noms x et y. Le compilateur va prendre en considération ces nouvelles variables et il ne pensera pas que vous essayiez d'utiliser les variable x et y de la super classe Component.
    je n'est pas dit le contraire je répondais juste a votre réponse,... le code que vous avez poster doit effectivement compiler et je suis sur qu'il fonctionne

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 354
    Par défaut
    Bonjour,
    Merci beaucoup pour toutes vos réponses,ça me fait beaucoup de pistes à explorer.
    Concernant le message d'erreur , le problème est que j'utilise directement
    les x et y de la classe Point en utilisant les accesseurs getX() et set() le code compile.
    Merci

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 354
    Par défaut
    Bonjour,
    J'ai modifié mon code et donc je n'utilise plus directement les variables x et y mais les accesseurs getX() et SetX() ...Le code compile mais à l'execution j'ai un message java.lang.NullPointerException in thread "main" ,le problème doit venir du code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	 //Le Constructeur
    	 
    	 public MonAffichage()
    	 {
    	
    	 A.SetX(20);
                 A.SetY(40);
    	 A = new Point(getX(),getY()) ;
    	 B = new Dessin_Rect(getX(),getY(),20,30) ;
    	 this.add(B);
    	 }
    	 
    }
    Peut on utiliser la notation A.SetX(20) pour initialiser les variables ??
    Je ne pense pas puisque ça fait une erreur mais que faut il faire ??? parce que avec les valeurs de x et y par défault j'ai bien l'affichage mais ce que je veux c'est de pouvoir modifier x et y .

    Merci beaucoup

  12. #12
    Membre expérimenté Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Par défaut
    Salut,
    Tu doit d'abord initialiser la variable A avant d'utiliser les méthodes set et get.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    A = new Point(20,40);
    Juste une petite remarque: par le code suivant tu crées un objet Dessin_Rect en passant les coordonnées x et y de la classe Component de laquelle hérite JFrame:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    B = new Dessin_Rect(getX(),getY(),20,30) ;
    Si tu voudrais passer les coordonnées du point A il faut faire (après initialisation de A bien sur):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    B = new Dessin_Rect(A.getX(),A.getY(),20,30) ;

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 354
    Par défaut
    Ok merci beaucoup Amine et Nayah , j'ai réussi à faire déplacer un rectangle
    et effectivement en passant par les threads.Il faut encore que j'améliore le code pour l'instant je ne modifie que les x il me reste à modifier les y.

    Tu doit d'abord initialiser la variable A avant d'utiliser les méthodes set et get
    C'est pour cela que j'avais le message d'erreur NullPointerException.
    Peut être que je posterai le code pour que vous puissiez me conseiller ou apporter des améliorations.
    Encore Merci et à bientôt pour d'autres questions.

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

Discussions similaires

  1. Déplacement d'un rectangle en 2D
    Par Invité dans le forum Contribuez
    Réponses: 1
    Dernier message: 22/09/2017, 07h38
  2. Problème de déplacement des rectangles
    Par cornufreud dans le forum Général Python
    Réponses: 3
    Dernier message: 17/12/2012, 15h59
  3. Déplacement rectangle picturebox
    Par pierregr dans le forum VB.NET
    Réponses: 3
    Dernier message: 30/07/2012, 17h08
  4. Réponses: 3
    Dernier message: 11/05/2006, 11h32
  5. Limiter le déplacement de la souris
    Par el_bouleto dans le forum C++Builder
    Réponses: 4
    Dernier message: 08/11/2002, 23h56

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