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 :

Animation sur JPanel


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 28
    Par défaut Animation sur JPanel
    Salut everybody!

    Voici mon problème :

    Je désire dessiner un rectangle sur mon JPanel et dans lequel on verrait la taille du rectangle diminuer au fil du temps. C'est a dire que dans une boucle for(int i =0;i<...) je dessine le carré, à chaque itération on soustrait à la longueur et largeur les valeur x et y puis on redessine le rectangle.
    Ce que j'aimerais c'est qu'on puisse voir à l'écran tous les dessins de manière à créer une animation.

    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
     
    import java.awt.Graphics;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
     
    public class Main extends JFrame{
     
     private int lon=200;
     private int lar=200;
     
        public Main(){
     
        JPanel pan;
     
        /*
         *      Boucle dans laquelle je dessine les carrées
         */
        for (int i=0;i<10;i++)
            {
            lon=lon-10;
            lar=lar-10;
            pan=new Paneau(lon,lar);    
            getContentPane().add(pan);
            }
     
        }
        public static void main(String[] args) {       
           Main Frame = new Main();
           Frame.setTitle("Dessin carré");
           Frame.setSize(300,300);
           Frame.setVisible(true);
        }
    }
     
     
    class Paneau extends JPanel{
    private int longueur=0;
    private int largeur=0;
     
        public Paneau(int lon, int lar){
        longueur=lon;
        largeur=lar;
        }
     
        public void paintComponent(Graphics g)
            {       
            g.drawRect(40,20,longueur,largeur);            
            }
    }
    Or avec mon code je ne peux visualiser que le résultat final.

    J'ai essayé de mettre un timer pour raffraichir le JPanel mais sans succes.

    Quelque'un aurait une suggestion?

  2. #2
    Membre très actif Avatar de unknow0
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 452
    Par défaut
    Bonjour,

    si je me souviens il me semble qu'après l'ajout d'un élément dans une Frame/Panel il faut la valider via un ou une fonction dans le même genre.

  3. #3
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Il faut faire un dessin, pas un ajout de composant !!!!!
    Exemple : dans une JFrame, tu places ton composant dérivant de JPanel. Dans la méthode paintComponent, tu effaces tout et tu dessines un rectangle en fonction des données membres.
    Dans un thread, tu modifies les données membres du panel et tu lui dit de se redéssiner.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    En fait il ne faut pas passer par une boucle.
    Mais par un Timer s'activant toutes les n millisecondes.

    Un truc dans le style:

    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
     
    package swing.tests;
     
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.geom.Rectangle2D;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.Timer;
     
    public class AnimatedRectangle extends JPanel {
     
     
        private Rectangle2D rect;
        private Timer timer;
     
        public AnimatedRectangle() {    
            rect = new Rectangle2D.Float(20,20,100,100);
            timer = new Timer(20,new ActionListener() {
     
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    System.out.println("hello width: "+rect.getWidth());
                    if(rect.getWidth()> 0) {
     
                        rect.setRect(rect.getBounds2D().getX()+1, rect.getBounds2D().getY()+1, rect.getBounds2D().getWidth()-2, rect.getBounds2D().getHeight()-2) ;
                    } else {
                        timer.stop();
                    }                
                    repaint();
                }
            });
            timer.start();
        }
     
        @Override
        protected void paintComponent(Graphics arg0) {    
            super.paintComponent(arg0);
            System.out.println(rect);
            Graphics2D g2d = (Graphics2D) arg0;
            g2d.setPaint(Color.red);
            g2d.fill(rect);
     
        }
     
        public static void main(String[] args) {
            JFrame f = new JFrame();
            f.add(new AnimatedRectangle());
            f.setSize(400,300);
            f.setLocationRelativeTo(null);
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setVisible(true);
        }
    }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 28
    Par défaut
    Merci beaucoup pour vos réponses

    @unknow : Oui j'avais utilisé validate() mais le pb venait d'autre chose car j'arrivais bien à voir le dessin mais seulement le dernier généré.

    @dinobogan : C'est vrai que c'est mieux de refaire le dessin que d'ajouter à chaque fois un JPanel je te l'accorde

    @Sinok : THANK YOU VERY MUCH!!

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

Discussions similaires

  1. [FLASH MX] Synchroniser une animation sur un long mp3
    Par calogerogigante dans le forum Flash
    Réponses: 9
    Dernier message: 05/07/2006, 11h37
  2. JPanel sur JPanel contenant des JButton
    Par loic_86 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 17/05/2006, 20h49
  3. FocusListener sur JPanel et son contenu
    Par Invité dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 11/05/2006, 14h23
  4. Probleme : load une animation sur une autre
    Par Basicman dans le forum Intégration
    Réponses: 2
    Dernier message: 26/04/2006, 15h14
  5. [FLASH MX] Animation sur bouton en boucle
    Par mascagne dans le forum Flash
    Réponses: 3
    Dernier message: 04/03/2006, 10h36

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