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

EDT/SwingWorker Java Discussion :

Temps d'attente interface


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Par défaut Temps d'attente interface
    Bonjour, dans le cadre d'un projet java je veux realiser une interface java et j'aimerais que lorsque j'appuie sur un bouton le message "j'ai faim" s affiche pendant 3 secondes et apres le message devient "je n'est plus faim". J'ai utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    try{
    Thread.sleep(3000);
    }catch(InterruptedException e){}
    Le probleme est qu à l affichage il y a le message "je n'est plus faim" qui s affiche apres 3 secondes mais avant je n'est rien qui s'affiche. Je ne vois pas quoi changer

  2. #2
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    qui s affiche après 3 secondes
    Donc le problème ne viens pas de la pause mais de ce qu'il y a avant....

    A tous hasard, tu as bien fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    monTexte.setText("J'ai faim");
    try{Thread.sleep(3000);}catch(InterruptedException e){}
    monTexte.setText("Je n'ai plus faim");

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Par défaut
    voila ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void actionPerformed(ActionEvent evt) {
            Object source = evt.getSource();
                if(source == boutonMiseEnMarche) {
                     monTexte.setText("J'ai faim");
                     try{
                        Thread.sleep(3000);
                     }
                     catch(InterruptedException e){}
                     monTexte.setText("Je n'ai plus faim");
                }
    voila et au resultat j'ai rien pendant 3 secondes et apres j'ai "Je n'ai plus faim" au lieu d'avoir "J'ai faim" pendant 3 secondes et apres "Je n'ai plus faim"

  4. #4
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    En faisant un sleep dans le actionPerformed tu bloques l'EDT (le thread en charge de la gestion de l'interface utilisateur, événements clavier, souris, mise à jour des zones de l'écran à redessiner) et tu ne lui rends pas la main : le composant monTexte n'est pas réactualisé à l'écran. A l'issue de l'attente, le texte du composant monTexte est mis à jour, tu rends la main à l'EDT qui cette fois peut rafraîchir la zone de l'écran impactée. Il ne faut pas pbloquer l'exécution du thread EDT. Dans ton cas tu peux faire comme ceci :
    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
     
    Timer timer = new Timer(3000,
                            new ActionListener() {
                               public void actionPerformed(ActionEvent evt) {
                                  monTexte.setText("Je n'ai plus faim");
                               }
                            });
    timer.setRepeats(false);
     
    public void actionPerformed(ActionEvent evt) {
            Object source = evt.getSource();
            if(source == boutonMiseEnMarche) {
               monTexte.setText("J'ai faim");
               timer.start();
            }
    }

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Par défaut
    Excuse moi mais ou je dois mettre " timer.setRepeats(false); "?

    car j'ai fait ce que tu m a dit mais j'ai : <identifier> expected pour cette instruction.
    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
    public class InterfaceTamaguchi extends JFrame implements ActionListener {
     
        public InterfaceTamaguchi(String filePath) { // constructeur
            super("Tamaguchi"); // Nom de la fenêtre
            this.filePath = filePath;
            initialize();
        } // fin constructeur
     
        private void initialize() {
            // fabrication de l'interface graphique
        } // fin initialize()
     
        Timer timer = new Timer(3000, new ActionListener() {
                                        public void actionPerformed(ActionEvent evt) {
                                            labelEtat.setText("Je n'ai plus faim");
                                        }
     
                                });
        timer.setRepeats(false);
     
        public void actionPerformed(ActionEvent evt) {
            Object source = evt.getSource();
            if(source == boutonMiseEnMarche) {
               monTexte.setText("J'ai faim");
               timer.start();
            }
        }
     
        public static void main(String[] args) {
            InterfaceTamaguchi Bill = new InterfaceTamaguchi(imagePath);
            Bill.pack();
            Bill.setVisible(true); // Affiche l'interface à l'écran
        } // fin main
     
    } // fin InterfaceTamaguchi

  6. #6
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Citation Envoyé par cedlapinte Voir le message
    Excuse moi mais ou je dois mettre " timer.setRepeats(false); "
    Où tu veux
    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 InterfaceTamaguchi extends JFrame implements ActionListener {
    
        // le timer permettant de ...
        private Timer timer;
    
        private void initialize() {
            // fabrication de l'interface graphique
    
            // Ici, ça semble bon non ?
            // Initialisation du timer :
            timer = new Timer(3000,
                              new ActionListener() {
                                  public void actionPerformed(ActionEvent evt) {
                                      labelEtat.setText("Je n'ai plus faim");
                                  }
                              });
            timer.setRepeats(false);
    
        } // fin initialize()
    }

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Par défaut
    j'ai fait ce que tu m'a indiqué et maintenant j'ai ce message d'erreur :

    "timer = new Timer(3000," :
    cannot find symbol
    symbol : constructor Timer (int,<anonymous java.awt.event.ActionListener>)

    sa veut dire que je dois faire un constructeur, non ? mais comment?

  8. #8
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    As tu importé la bonne classe ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import javax.swing.Timer;

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Par défaut
    c'était ca Merci ca marche

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Par défaut
    Maintenant que je sait comment faire marcher mon timer j'aimerais savoir si c'est possible de l'annuler au cours de son execution. C'est a dire que le timer affiche " j'ai faim " pendant 5 seconde ; si pendant ce temps j appuie sur le bouton " Faire manger " alors tout ce qui doit s'éxecuter dans le timer est annulé et une phrase est marqué : " je mange " ?

  11. #11
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Euh... tu n'as même pas jeté un coup d'oeil à la Javadoc de la classe Timer ? ce que tu demandes s'y trouve, à toi de faire l'effort de lire la doc

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Par défaut
    si j'ai regardé et j'ai utilisé : timer.cancel();

    lorsque j'appuie sur le boutonMiseEnMarche la phrase "Je vais bien" apparait pendant 5 secondes puis cette phrase devient "J'ai faim" pendant 5 secondes
    (grace au timer). Mais si pendant ce deuxieme laps de temps j appuie sur le boutonMiseATable je veux que le timer s 'arrete et inscrire "Je n'ai plus faim".

    vola ce que j'ai fait apres la declaration du timer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     public void actionPerformed(ActionEvent evt) {
            Object source = evt.getSource();
                if(source == boutonMiseEnMarche) {
                    monTexte.setText("Je vais bien");
                    timer.start();
                }
                else if(source == boutonMiseATable) {
                   timer.cancel();
                   monTexte.setText("Je n'ai plus faim");
                }
             }
    J'ai le message d'erreur suivant :
    " timer.cancel(); " : cannot find symbol ; symbol : method cancel () ; location: class javax.swing.Timer

  13. #13
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Citation Envoyé par cedlapinte Voir le message
    J'ai le message d'erreur suivant :
    " timer.cancel(); " : cannot find symbol ; symbol : method cancel () ; location: class javax.swing.Timer
    Encore une fois il s'agit de la classe : javax.swing.Timer et non de java.util.Timer

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Par défaut
    je l'avais deja mise :

    import javax.swing.Timer;

    le probleme reste ??!

  15. #15
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    cancel() n'existe pas sur javax.swing.Timer, il faut utiliser stop()

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Par défaut
    j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void actionPerformed(ActionEvent evt) {
    Object source = evt.getSource();
    if(source == boutonMiseEnMarche) {
    monTexte.setText("Je vais bien");
    timer.start();
    }
    else if(source == boutonMiseATable) {
    timer.stop();
    monTexte.setText("Je n'ai plus faim");
    }
    }
    il n'y a pas d'erreur a la compilation mais cela ne marche pas, le timer continue de s'executer et le message "Je n'ai plus faim" n'apparait pas

  17. #17
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    else if(source == boutonMiseATable) {
    // Mets une trace ici pour être sûr que tu passes dans ce code
    timer.stop();
    monTexte.setText("Je n'ai plus faim");
    }

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Par défaut
    que veut tu dire par // Mets une trace ?
    si tu veut dire mettre du code pour voir si celui ci s'execute j'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    else if(source == boutonMiseATable) {
    monTexte.setText("je suis dans le code");
    timer.stop();
    monTexte.setText("Je n'ai plus faim");
    }
    rien ne se passe comme precedemment le timer continue de s'executer.

    j'ai ensuite esayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    else if(source == boutonMiseATable) {
    boutonMiseEnMarche.addActionListener(this);//Rend le bouton actif
    timer.stop();
    monTexte.setText("Je n'ai plus faim");
    }
    idem le timer continue de s'executer.

  19. #19
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Citation Envoyé par cedlapinte Voir le message
    que veut tu dire par // Mets une trace ?
    une trace dans la console pour voir si tu passes bien dans le if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    else if(source == boutonMiseATable) {
    System.out.println("je suis dans boutonMiseATable : arrêt du timer");
    timer.stop();
    System.out.println("le timer est arrêté, mise à jour du texte");
    monTexte.setText("Je n'ai plus faim");
    System.out.println("le texte est mis à jour à : Je n'ai plus faim");
    }

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Par défaut
    je viens d'inserer les lignes de code que tu as proposées; et comme auparavant rien ne se passe le timer continue

Discussions similaires

  1. algorithme qui détecte et compte le nombre de visages et leur temps d'attention
    Par aptchagi dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 13/06/2007, 15h46
  2. [MSDNAA] Temps d'attente
    Par erfindel dans le forum Autres Logiciels
    Réponses: 6
    Dernier message: 02/02/2007, 12h34
  3. Splashscreen / Temps d'attente ?
    Par Bibipulse dans le forum Interfaces Graphiques en Java
    Réponses: 6
    Dernier message: 10/05/2006, 13h11
  4. [Info-bulles]Comment modifier le temps d'attente?
    Par minus dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 22/03/2006, 14h39
  5. [VB]temps d'attente entre 2 instructions
    Par XtoX dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 27/09/2005, 10h38

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