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 :

[debutant] effet mémoire des boutons swing.


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 82
    Par défaut [debutant] effet mémoire des boutons swing.
    Bonjour,

    Arrêtez moi si je me trompe
    J'ai l'impression que dans Swing (et peut etre ailleurs), les boutons ont un effet mémoire.

    Exemple,
    Mon appli à un bouton qui lance une action qui dure 2 secondes.
    Je click 12 fois sur ce bouton, et me voila parti pour 24 secondes d'attente...

    Je souhaiterai que tant qu'une action n'est pas terminée, les clicks successif soient "oubliés".
    J'ai essayé en mettant un boulean dans l'action, mais ca ne semble pas fonctionner.


    Avez vous déja été confronté à ca, ou avez vous des pistes pour résoudre mon probleme ?
    Merci d'avance
    Richard

  2. #2
    Membre éprouvé Avatar de minus
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 153
    Par défaut
    Un truc du genre tonBouton.setEnable(false) en debut de ta methode et tonBouton.setEnable(true) en final de ta methode.

    J'ai jamais essayé mais ca doit pas être super dur a faire

  3. #3
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Salut,

    Comme l'a dit minus, un setEnable() suffit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void actionPerformed(ActionEvent e)
    {
      monBouton.setEnable(false);
      /* tes opérations */
      monBouton.setEnable(true);
    }
    +

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 82
    Par défaut
    ben euh non, ca ne fonctionne pas. Les clicks souris sont toujours mis dans une espèce de file d'attente, et sont exécutés un par un...
    Peut etre que c'est tout simplement la methode qui ne va pas
    Je vous joins un bout de code tout con.

    Le code du bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        JButton btn_next = new JButton (">");
        GestionProchaineImage gestionProchaineImage = new GestionProchaineImage ();
        btn_next.addActionListener(gestionProchaineImage);

    et le code de l'actionListener
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class GestionProchaineImage implements ActionListener {
     public void actionPerformed(ActionEvent contexte) {
       Fenetre_principale.panneau_navigation.btn_next.setEnabled(false);
       ProjetBD.chargement_image_suivante_dans_app();
       Fenetre_principale.panneau_navigation.btn_next.setEnabled(true);
     }
    }
    Merci pour ces premières réponses en tout cas.

  5. #5
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bonjour,

    la fonction : ProjetBD.chargement_image_suivante_dans_app(); n'utilise-t-elle pas un thread ? Dans ce cas, il faut attendre la fin du thread pour réactiver le bouton (méthode join()).
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  6. #6
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par mavina
    Salut,

    Comme l'a dit minus, un setEnable() suffit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void actionPerformed(ActionEvent e)
    {
      monBouton.setEnable(false);
      /* tes opérations */
      monBouton.setEnable(true);
    }
    +
    Ou plutôt:
    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 e) {
        new Runnable() {
            public void run() {
                /// tes actions qui durent longtemps
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        /// les mises à jour graphiques
                    }
                });
            }
        }.start();
    }
    avec à la limite la désactivation du bouton si tu veux pas que ça se fasse plusieurs fois si tu cliques plusieurs fois... Mais de toute façon tu as toujours la main de cette manière

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 82
    Par défaut
    En fait mon probleme n'est pas la durée du traitement, mais le fait que 12 clicks successif = 12 actions.
    Désactiver le bouton lors du premier traitement ne semble pas avoir d'effet.

    Ha oui, le Runnable démarre avec Run() et pas start(), je le dis pour d'autres qui se creuserait la tete en copiant le bout de code

    plize hellpp

  8. #8
    Membre émérite Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Par défaut
    Citation Envoyé par Bighobbit
    En fait mon probleme n'est pas la durée du traitement, mais le fait que 12 clicks successif = 12 actions.
    Désactiver le bouton lors du premier traitement ne semble pas avoir d'effet.

    Ha oui, le Runnable démarre avec Run() et pas start(), je le dis pour d'autres qui se creuserait la tete en copiant le bout de code

    plize hellpp
    *


    Non, un Runnable ne se lance pas avec run...

    C'est juste que Rom s'est un petit peu trompé...

    Soit tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      new Thread() {
            public void run() {
                /// tes actions qui durent longtemps
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        /// les mises à jour graphiques
                    }
                });
            }
        }.start();
    soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      new Thread(new Runnable() {
            public void run() {
                /// tes actions qui durent longtemps
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        /// les mises à jour graphiques
                    }
                });
            }
        }).start();
    Toutefois je suis bien perplexe devant ce code et j'imagine que ceci devrait suffire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        /// les mises à jour graphiques
                    }
                });
    Bon courage

  9. #9
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Citation Envoyé par Bighobbit
    En fait mon probleme n'est pas la durée du traitement, mais le fait que 12 clicks successif = 12 actions.
    Désactiver le bouton lors du premier traitement ne semble pas avoir d'effet.
    Justement, si la méthode que tu appelles se contente de lancer un thread, le bouton sera désactivé puis réactivé aussitôt.
    Sinon simplement encadrer le contenu de actionPerformed() par des setEnabled comme tu le fais devrait marcher.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  10. #10
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 82
    Par défaut
    Donc j'oublis le thread (parfait, ca m'arrange dans un premier temps )

    Non l'encadrement par des setenable() ne fonctionne pas chez moi.
    J'ai l'impression (attention grosse boulette en approche), j'ai l'impression que l'ActionListener qui est attaché au bouton continu de mémoriser les clicks souris.
    Ainsi une fois le bouton réactivé (donc à la fin du premier appel), les events sont dépilés et lancés.

    arghh

  11. #11
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    NON ! Ce n'est pas une pile d'évènements, c'est une file (bon ok, je pinaille).
    Sinon c'est bien le principe. Si tu regardes la stackTrace d'une exception levée dans un actionPerformed, tu vois :
    - le nom du thread (awt-event-queue-dispatcher thread ou dans le genre)
    - des méthodes genre pumpEvent, dispatchEventForListeners, ... qui finissent par appeler ton actionPerformed.

    Mais si le bouton est désactivé, normalement aucun ActionEvent n'est reçu dans la file. Essaie de mesurer le temps passé dans la méthode actionPerformed (avec System.currentTimeMillis()) pour voir combien de temps ton bouton reste désactivé.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  12. #12
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 82
    Par défaut
    ca chipotte dur !

    Ben disons qu'en 2 secondes je clicke 5 fois.
    et chaque passage dans l'ActionPerfomed me prend environ 2850 Millisecondes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class GestionProchaineImage implements ActionListener {
     public void actionPerformed(ActionEvent contexte) {
      long date_debut = System.currentTimeMillis(); 
      Fenetre_principale.panneau_navigation.btn_next.setenabled(false);
      ProjetBD.chargement_image_suivante_dans_app();
      Fenetre_principale.panneau_navigation.btn_next.setenabled(true);
      long date_fin = System.currentTimeMillis();
      long temps = date_fin - date_debut;
      System.out.println("temps event : " + temps);
    }
    }
    voilou.

  13. #13
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bon, au moins, tu n'as pas de thread parasite. C'est au moins ça de réglé.
    Mais ça n'en est que plus bizarre.

    On sait jamais, essaie plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((JButton)contexte.getSource()).setEnabled(false);
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  14. #14
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par Bighobbit
    ca chipotte dur !

    Ben disons qu'en 2 secondes je clicke 5 fois.
    et chaque passage dans l'ActionPerfomed me prend environ 2850 Millisecondes.
    Un passage dans ActionPerformed doit tres rapide...
    Si tu as des actions longues a effectuer, il faut le faire dans un Thread... comme j'ai ecrit plus haut (en mettant Thread a la place de Runnable)...

    Et donc ton passage dans actionPerformed ne durera que qqs millisecondes maxi...

  15. #15
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 82
    Par défaut
    Formidable, ca fonctionne bien maintenant...

    Donc effectivement,
    - un passage rapide dans ActionPerformed,
    - doit absoluement etre combiné avec un mon_bouton.setenable(false), avant le traitement.
    - et le setenable(true) doit etre positionné non pas dans le ActionPerformed (car le bouton serait rendu dispo avant la fin du traitement), mais au contraire en fin du traitement.

    Merci à tous.
    Richard

  16. #16
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Citation Envoyé par Bighobbit
    Formidable, ca fonctionne bien maintenant...
    Qu'as-tu changé ? On peut voir le code de la méthode actionPerformed qui marche ?
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  17. #17
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 82
    Par défaut
    et voilou

    Le dévérouillage du bouton à lieu dans le traitement (très important, sinon marche pas).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    class GestionProchaineImage implements ActionListener {
     public void actionPerformed(ActionEvent contexte) {
      long date_debut = System.currentTimeMillis(); 
      Fenetre_principale.panneau_navigation.verouillage_app();
      //((JButton)contexte.getSource()).setEnabled(false);
      new Thread(new Runnable() {
         public void run() {
          chargement_image_suivante_dans_app();
         }
        }).start();
     }
    }

  18. #18
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par Bighobbit
    Formidable, ca fonctionne bien maintenant...

    Donc effectivement,
    - un passage rapide dans ActionPerformed,
    - doit absoluement etre combiné avec un mon_bouton.setenable(false), avant le traitement.
    - et le setenable(true) doit etre positionné non pas dans le ActionPerformed (car le bouton serait rendu dispo avant la fin du traitement), mais au contraire en fin du traitement.

    Merci à tous.
    Richard
    Ouais, et ton mon_bouton.setEnabled(false) tu peux le faire avant de lancer le nouveau Thread...
    Par contre le mon_bouton.setEnabled(true), il faut le mettre à la fin de ton traitement dans le Thread, mais en passant par Swing.invokeLater... Sinon c pas correct (même si ça marche globalement assez bien)...

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/12/2011, 16h41
  2. [Javascript Debutant]Comment positionner des boutons sur une Image?
    Par bylka dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/07/2007, 14h07
  3. [Swing]Placer des boutons ou et a la taille qu'on veux
    Par danje dans le forum AWT/Swing
    Réponses: 12
    Dernier message: 27/04/2006, 17h43
  4. [Debutant] Pb avec récupération valeurs des boutons radio
    Par Jibees dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 28/03/2006, 15h25
  5. [swing][JButton] Des boutons qui disparaissent!
    Par soulhouf dans le forum Débuter
    Réponses: 12
    Dernier message: 19/08/2005, 13h51

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