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 :

[Swing] Problème animation d'objets avec bouton


Sujet :

Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2017
    Messages : 8
    Points : 6
    Points
    6
    Par défaut [Swing] Problème animation d'objets avec bouton
    Bonjour,

    Je suis étudiant en informatique L2, cette année j'ai appris à coder en java mais on a (presque) pas fait d'interface graphique, j'ai donc commencé à apprendre via open classroom comment en faire. Et je me trouve face à un problème que je ne comprends pas: j'ai un Jpanel panneau (juste un rond avec des geteurs et des setteurs sur ses coordonnées en x et y. Ma fenetre est composée de ce Jpanel et d'un bouton. J'ai aussi une fonction go() qui est sensée faire bouger mon rond en modifiant ses coordonnées avec thread.sleep pour donner l'impression de mouvement. En fait le problème c'est que je lance la fonction go() de 2 façons, une fois automatiquement dans mon main (et la tout se passe comme je le voudrais) et une autre fois dés que j’appuie sur mon bouton et le problème est la: quand j'appelle la fonction grace à mon bouton il n'y a pas de déplacement, mon rond se téléporte directement à sa position finale mais il ne se redessine pas au fur et à mesure (il y a quand meme un petit temps de latence du coup je suppose que la boucle et le thread.sleep s'exécutent bien mais je ne comprends pas pourquoi la meme fonction à un comportement différent en fonction de comment je la lance. Des idées ?

    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
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    public class Fenetre extends JFrame{
      private Panneau pan = new Panneau();
     
      private JPanel container = new JPanel();
     
      public Fenetre(){
        this.setTitle("Animation");
        this.setSize(300, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        container.setBackground(Color.white);
        JButton bouton = new JButton("mon bouton");
     
        bouton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent event){
     
            	go();	
            }
          });
        container.setLayout(new BorderLayout());
        container.add(pan, BorderLayout.CENTER);
        container.add(bouton, BorderLayout.SOUTH);
        this.setContentPane(container);
        this.setVisible(true);    
     
      }
     
      private void go(){  
     
        for(int i=0; i<100;i++){
          pan.setPosX(pan.getPosX()+1);
          pan.setPosY(pan.getPosY()+1);
          pan.repaint();
     
          try {
            Thread.sleep(3);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }    
      }  
     
     
     
    public static void main (String[] args){
     
        Fenetre f = new Fenetre();
        f.go();
     }
    }

  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 : 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,

    La différence entre le lancement dans main() et le lancement dans ton bouton, c'est que dans main() la méthode est exécuté dans le thread principal alors que dans le bouton, comme tout ce qui est exécuté pour Swing (interaction comme redessin), c'est exécuté dans l'Event Dispatch Thread. Comme ce thread sert à faire le dessin et qu'un thread ne peut exécuter qu'une seule chose à la fois, il ne peut pas faire à la fois ta boucle avec sleep() et le redessin. En fait, en procédant comme tu le fais tu figes l'interface le temps de ta boucle. On ne fait pas ça comme ça. Si le tutoriel que tu as regardé ne parle même pas de ça (de la notion d'Event Dispatch Thread), oublie-le et ne va jamais plus le regarder.

    De la même façon, il ne faudrait pas lancer go() dans le thread principal, parce que justement tu lance un thread qui manipule des éléments qui sont potentiellement manipulables également par l'Event Dispatch Thread, d'où :
    1. risque d'accès concurrents
    2. risque de latences


    Le plus simple est d'utiliser un timer swing.
    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.

Discussions similaires

  1. Animation sur fond avec boutons
    Par jeanclaude923 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 06/04/2017, 10h09
  2. Musique et animation en boucle avec boutons
    Par jeanclaude923 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 8
    Dernier message: 26/03/2017, 07h13
  3. [AC-2010] Problème de choix multiples avec boutons d'options.
    Par Axe_Débutant dans le forum VBA Access
    Réponses: 2
    Dernier message: 13/03/2015, 10h59
  4. Problèmes d'affichage de tableau d'objets avec swing
    Par amine1980 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 04/04/2011, 23h57
  5. problème animation en SDL avec SDL_Delay
    Par juju116 dans le forum Débuter
    Réponses: 4
    Dernier message: 30/08/2010, 21h04

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