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 :

[KeyEvent] Problème de multiples appels


Sujet :

AWT/Swing Java

  1. #1
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Points : 145
    Points
    145
    Par défaut [KeyEvent] Problème de multiples appels
    bonjoir,

    j'ai un léger souci. j'ai ajouté un keyEvent sur un menu pour faire un zoom, le probleme c'est que si je maintiens appuyé la touche en question, le listener semble m'interpretr comme de multiples appuis et doit lancer plusieurs thread relatifs à l'action adapter, ce qui provoque un comportement non souhaité.

    Je suis peu clair, mais vous allez mieux comprendre. voici le code de l'actionPerformed associé au menuItem qui a ma key en accelarato :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    // autres actions avec un different 'modeAction' (modeAction vaut e.getActionCommand() )
    else if (modeAction == "zoom -") {
                System.out.println("ZOOM -");
                if (UtilityManager.zoomvalue > 0.25) {
                    UtilityManager.zoomvalue -= 0.25;
                }
                setMenuZoomText();
                float coeffZoom = 
                    (float) (UtilityManager.zoomvalue / (UtilityManager.zoomvalue + 0.25));                 
                getFrameMainProjetDesign().getPanelProjectDisplay().
                    resizeAndRepaint(coeffZoom);
            }
    si j'appuie sequentiellement sur la touche de zoom -, le zoom se bloque bien à 0.25, mais si je maintiens la touche, la fentetre ne s'arrete pas de diminuer..

  2. #2
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 165
    Points : 136
    Points
    136
    Par défaut
    Y a toujours une feinte mais je l'aime pas trop :

    Tu mets un compteur que tu incrémentes au premier déclenchement de l'évènement. Tu remets ce compteur à sa valeur initialle sur le KeyReleased. tu executes ton code pour le zoom que si le compteur est à la valeur initialle.

    Je suis en train de fouiller la javadoc pour trouver un truc plus propre ^^

  3. #3
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Points : 145
    Points
    145
    Par défaut
    oui c'est ce que je comptais faire plus ou moins, meme si c'est un peu bidouille.

    en fait j'ai trouvé la solution toute bete bien , qui est de mettre dans le if toutes les actions, ce qui fait que si il y a plusieurs lancements de l'action , le resize se fait avec le 0.25 et donc n'a pas d'effet si on est deja à 0.25 ...

    cela dit, je ne pense pas avoir saisi toute la subtilité du probleme pour autant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // autres actions avec un different 'modeAction' (modeAction vaut e.getActionCommand() )
    else if (modeAction == "zoom -") {
                System.out.println("ZOOM -");
                if (UtilityManager.zoomvalue > 0.25) {
                    UtilityManager.zoomvalue -= 0.25;
    setMenuZoomText();
                float coeffZoom =
                    (float) (UtilityManager.zoomvalue / (UtilityManager.zoomvalue + 0.25));                 
                getFrameMainProjetDesign().getPanelProjectDisplay().
                    resizeAndRepaint(coeffZoom);
                }
     
            }

  4. #4
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 165
    Points : 136
    Points
    136
    Par défaut
    Ma méthode en outre ne marchait pas pierre ... enfin elle marchait sous Windows ... mais pas sous Unix

    D'après un post que j'ai lu sur ce forum :

    l'enfoncement d'une touche sous windows <=>
    KeyPressed, KeyPressed, KeyPressed ...


    l'enfoncement d'une touche sous Unix <=>
    KeyPressed, KeyReleased, KeyPressed, KeyReleased, KeyPressed ...

    à vérifier mais si c'est vraiment le cas ca aurait réinitiallisé ta variable à chaque fois.



    En attendant si tu trouves une méthode propre poste la.

  5. #5
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Tu utilises quelle méthode de ton KeyListener?
    Si tu utilises keyTyped() ou keyReleased(), il ne lancera l'action que si tu relaches la touche.

    Ca peut résoudre ton problème, non?

  6. #6
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 165
    Points : 136
    Points
    136
    Par défaut
    D'après ce que j'ai compris il veut effectivement lancer l'action qu'une seule fois ... mais pas au moment ou il relache la touche mais au moment ou il appuie dessus ... ca résout donc pas son problème.

  7. #7
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Points : 145
    Points
    145
    Par défaut
    Citation Envoyé par seiryujay
    Tu utilises quelle méthode de ton KeyListener?
    Si tu utilises keyTyped() ou keyReleased(), il ne lancera l'action que si tu relaches la touche.

    Ca peut résoudre ton problème, non?
    je pense que tu as raison si on associe a un KeyReleased (et non pas KeyPressed), ca resout le probleme (mais on y perd la possibilité de la touche maintenue qui peut parfois servir malgré tout)

    mais pour te repondre, j'utilise un accelerator directement sur l'item qui est bien pratique (le raccourci est affiché a coté de l'item du menu)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    zoomItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, 0));

  8. #8
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Points : 145
    Points
    145
    Par défaut
    Citation Envoyé par n00bi
    D'après ce que j'ai compris il veut effectivement lancer l'action qu'une seule fois ... mais pas au moment ou il relache la touche mais au moment ou il appuie dessus ... ca résout donc pas son problème.
    mon probleme précis est resolu (voir deuxième post) mais je n'ai pas bien compris pourquoi en fait et c'est pour cela que j' n'ai pas encore mis le tag "résolu" car j'aimerai bien comprendre

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Points : 432
    Points
    432
    Par défaut
    C normal que ta fenetre continue a diminuer puisque quand zoomValue arrivera à 0.25 ton coef lui sera toujours égal à 0.5 donc ta fenetre retraicira.

    0.25 / (0.25+0.25) = 0.5
    Mess with the best, die like the rest!

  10. #10
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Points : 145
    Points
    145
    Par défaut
    Citation Envoyé par barbu0055
    C normal que ta fenetre continue a diminuer puisque quand zoomValue arrivera à 0.25 ton coef lui sera toujours égal à 0.5 donc ta fenetre retraicira.

    0.25 / (0.25+0.25) = 0.5
    tres juste mais alors pourquoi cela n'a pas lieu si je fais des appuis sequentiels ? en fait c'est meme ca qui est surprenant au final (!)

    (au moins avec le deuxieme code, effectivement la cette multiplication par 0.5 ne peut pas se produire et ca marche correctement)

    il doit bien y avoir un probleme de threads multiples dans cette histoire non ?

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Points : 432
    Points
    432
    Par défaut
    Effectivement il n y a aucune raison qu il le fasse lors d appui sequentiel, puisque rester appuyé sur la touche revient à un appui sequentiel.
    Là je sèche complètement.
    Mess with the best, die like the rest!

  12. #12
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 165
    Points : 136
    Points
    136
    Par défaut
    Question bête à laquelle je n'ai pas la réponse :

    Quand tu appuies en continue sur la touche il va te lancer tres rapidement plusieurs fois ta méthode. Il se peut peut être qu'il te lance la méthode pour la N+1 ème fois avant qu'il est terminé l'exécution de la méthode N ?


    genre dans le Nième appel t'as :
    UtilityManage.zoomvalue == 0.5

    et tu fais un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UtilityManager.zoomvalue -= 0.25;
    a l'appel de la N+1 ième méthode :

    si on affiche zoomvalue il va afficher 0.5 ou 0.25 ... Est-ce que cela peut dépendre du fait qu'il a passé l'instruction UtilityManager.zoomvalue -= 0.25; dans la Nième méthode ?

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Points : 432
    Points
    432
    Par défaut
    Moi ce qui m embete un peu plus c'est que pour que l'image ne bouge pas il faut un coef = 1.
    Hors dans son cas coef = n / (n + .25) ce qui sera toujours < 1 qqsoit n.
    Donc il pourra appuyer tant qu il voudra de la facon qu il voudra , l image changera en permanance si ce n'est pas dans le if.
    Il n'y a donc même de question de thread à se poser.
    Et d'ailleurs je doute que les Listener lance un thread à chaque fois qu il recoivent un event. Mais ca je ne puis l'affirmer avec certitude.
    Mess with the best, die like the rest!

  14. #14
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Points : 145
    Points
    145
    Par défaut
    barbu avait raison (comme toujours), voici ce qui se passe :
    [edit] on va dire "presque" toujours :p[/edit]

    sans le if qui contient que le set :

    ZOOM -
    zoom value modified, new value : 1.5
    size and repaint done with : 0.85714287 coeff zoom
    ZOOM -
    zoom value modified, new value : 1.25
    size and repaint done with : 0.8333333 coeff zoom
    ZOOM -
    zoom value modified, new value : 1.0
    size and repaint done with : 0.8 coeff zoom
    ZOOM -
    zoom value modified, new value : 0.75
    size and repaint done with : 0.75 coeff zoom
    ZOOM -
    zoom value modified, new value : 0.5
    size and repaint done with : 0.6666667 coeff zoom
    ZOOM -
    zoom value modified, new value : 0.25
    size and repaint done with : 0.5 coeff zoom
    ZOOM -
    size and repaint done with : 0.5 coeff zoom
    ZOOM -
    size and repaint done with : 0.5 coeff zoom
    ZOOM -
    size and repaint done with : 0.5 coeff zoom
    ZOOM -
    size and repaint done with : 0.5 coeff zoom
    avec le if qui contient tout :

    ZOOM -
    zoom value modified, new value : 0.75
    size and repaint done with : 0.75 coeff zoom
    ZOOM -
    zoom value modified, new value : 0.5
    size and repaint done with : 0.6666667 coeff zoom
    ZOOM -
    zoom value modified, new value : 0.25
    size and repaint done with : 0.5 coeff zoom
    ZOOM -
    ZOOM -
    ZOOM -
    ZOOM -
    ZOOM -
    ZOOM -
    Alors ce qui est bizarre c'est qu'en cas d'appui prolongé, les repaint se font, et si avec les appuis successifs, la multiplication par 0.5 a lieu mais pas le repaint (par contre si je bouge la fenetre on le voit bien).

    donc en fait un probleme qui n'en etait pas un m'a permis d'en resoudre un que je n'avai pas vu et qui etait une faute de conception (on dira d'inattention pour ne pas trop abimer mon amour propre)

    merci a vous

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

Discussions similaires

  1. Problème keyPressed/keyReleased appels multiples
    Par Mekel dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 22/03/2010, 12h19
  2. Réponses: 2
    Dernier message: 26/11/2009, 18h38
  3. [FLASH MX] Problème onPress multiple
    Par abenhass dans le forum ActionScript 1 & ActionScript 2
    Réponses: 3
    Dernier message: 14/04/2006, 09h25
  4. Réponses: 6
    Dernier message: 20/01/2006, 19h28
  5. [C#] Problème pour l'appel d'objet...
    Par AntiSAL dans le forum Windows Forms
    Réponses: 2
    Dernier message: 14/06/2004, 09h59

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