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 :

Interception d'un événement


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut Interception d'un événement
    Bonjour,

    Je cherche à intercepter un événement (le KeyEvent.VK_CUT) dans un contrôle (ici un JTextField).
    L’ajout de listeners me permet d’ajouter du comportement sur cet événement, mais je peine à l’intercepter (je ne tiens pas à ce qu’il me supprime ma sélection).

    Quelqu’un pourrait-il orienter mes investigations ?

    Merci,
    Chris.

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    As-tu essayé la méthode consume() de la classe KeyEvent (héritée de la classe InputEvent) ?
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    Ca ne semble pas fantastique (ou mal exploité).
    Pour faire un peu bourrin, j’ai supprimé tous les listeners de mon contrôle.
    Puis j’ai créé un simple listener destiné à tout intercepter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            for ( KeyListener l : jTextField1.getKeyListeners() )
                jTextField1.removeKeyListener(l);
     
            jTextField1.addKeyListener(new KeyAdapter() {
                public void keyReleased(KeyEvent ke) {
                    ke.consume();
                    cr.setText("keyReleased");
                }
            });
    cr est juste un label qui me permet de constater que je suis bien passé dans mon listener.

    Bref, je m’attendais à ce que mon contrôle ne soit plus bien vif.
    Pourtant il vit encore .

  4. #4
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    c'est quoi KeyEvent.VK_CUT?
    juste pour dire que c'est pas CTRL + X

  5. #5
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    En fait, j’avais bon espoir que KeyEvent.VK_CUT réponde aussi bien à Ctrl+X qu’à MAJ+Suppr.

  6. #6
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    Citation Envoyé par jproto
    En fait, j’avais bon espoir que KeyEvent.VK_CUT réponde aussi bien à Ctrl+X qu’à MAJ+Suppr.
    pas du tout.
    dans la doc:
    Citation Envoyé par javadoc
    /* for Sun keyboards */
    /** @since 1.2 */
    public static final int VK_CUT = 0xFFD1;
    => specifique a un materiel.
    => pas utiliser.

  7. #7
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    Manifestement, ta javadoc est plus complète que la mienne : http://java.sun.com/j2se/1.5.0/docs/...nt.html#VK_CUT

    VK_CUT

    public static final int VK_CUT
    Since: 1.2
    See Also: Constant Field Values
    Mais je dois bien l'admettre, je n'en étais pas encore là. Merci pour l'info.

  8. #8
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    LOL

    ma javadoc c'est la meme que la tienne.
    c'est un copy paste du code
    regarde les
    /* */
    /** **/


    je peut savoir qu'est ce que tu veut faire?

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 911
    Billets dans le blog
    54
    Par défaut
    Vi, les claviers des stations UNIX (TX compris) en general et les claviers de Sun en particulier ont toujours eut pas mal de touche specialisees en plus (comme quoi Microsoft et Logitech n'ont rien invente).

    Souvenez-vous que les evenements du clavier ne gerent que les touches claviers (ou une composition de touches clavier qui sont toutes identifiables par masquage), donc si vous voyez "CUT"* cela signifie bien la touche CUT*, pas une eventuelle combinaison de touches (KeyStroke - dont la definition est relativement dependant du systeme ou de l'application**) qui ferai la meme chose.

    *Faudrai voir justement si ce genre de touche est supportee sur les claviers Office de Microsoft justement.

    **Voir copier/coller dans Emacs et VI ce n'est pas juste CTRL+C, CTRL+V, etc...
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  10. #10
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    Bien, en fait, je lutte toujours depuis quelque temps sur le fait de rendre inactive une zone texte sans perdre l’affichage de mon caret.

    L’important, dans mon cas, est d’empêcher coûte que coûte l’utilisateur de modifier ma zone, mais il doit pouvoir la copier.

    Dans l’immédiat, j’ai passé mon JTextField en inactif (non-editable), puis je lui ai restauré un affichage laissant croire qu’il est actif.

    Cependant lorsque je passe un JTextField disable, je perds l’affichage de mon caret. Or, l’utilisateur s’en sert pour se repérer (lorsqu'il se déplace à l'aide du clavier).

    Je tente donc de partir sur une autre solution.
    J’ai repassé le champ en actif (editable), puis je lui ai retiré son KeyMap.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    jTextField1.setKeymap(null);
    Ainsi l’utilisateur ne peut pas directement modifier le contenu de ma zone (j’approche de la solution ...), et il peut toujours la copier.
    Cependant, il peut aussi la couper. D’où mes tentatives pour intercepter l’action couper. Mais pour le moment sans grand succès.

  11. #11
    Membre averti
    Profil pro
    Architecte IT
    Inscrit en
    Janvier 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Architecte IT

    Informations forums :
    Inscription : Janvier 2006
    Messages : 24
    Par défaut
    Le fait de pouvoir couper le texte est lié aux InputMap il me semble? Pourquoi ne pas faire un remove sur le "Ctrl +X" ?

    Tu dois aussi poouvoir regarder du côté de l'editor kit (DefaultEditorKit) qui définit les actions sur les composants éditables.

  12. #12
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    mikaMike,

    Ta réponse m’a semblé de prime abord plutôt séduisante.

    J’ai donc essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    jTextField1.getInputMap().remove(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
    Mais je dois admettre qu’il s’en fout.

    Quelque peu vexé, je suis parti sur une version moins fine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    jTextField1.getInputMap().clear();
    Et bien je dois admettre que cela n’a toujours pas grand effet .

  13. #13
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    OK, je dois mal m'y prendre.

    En effet, si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    System.out.println("Avant");
    for( KeyStroke k : jTextField1.getInputMap().allKeys())
        System.out.println(k.toString());
     
    jTextField1.getInputMap().remove(KeyStroke.getKeyStroke("ctrl pressed X"));
     
    System.out.println("Après");
    for( KeyStroke k : jTextField1.getInputMap().allKeys())
        System.out.println(k.toString());
    Je me rend bien compte que le avant comme arpsè mon remove(), j'ai toujours "ctrl pressed X" de pris en charge par le InputMap.

    Idem avec le clear().

  14. #14
    Membre averti
    Profil pro
    Architecte IT
    Inscrit en
    Janvier 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Architecte IT

    Informations forums :
    Inscription : Janvier 2006
    Messages : 24
    Par défaut
    En effet, ça ne fonctionne pas, pour une raison que j'ignore... et que j'aimerais bien connaître.

    Néanmoins, ceci bloque le Ctrl+X:
    jTextField.getInputMap().put(KeyStroke.getKeyStroke("ctrl X"),"nothing");

    "nothing" ne renvoit à aucune action en fait.

    Pas super clean mais bon.

  15. #15
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    Je confirme, cela fonctionne, et je t'en remercie.

    Ne tiens plus qu'à moi d'emballer cela de façon élegante.

    Merci,
    Chris.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/10/2013, 23h40
  2. Interception de l'évènement autofill
    Par judefei dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 14/06/2012, 11h14
  3. Interception / Partage d'évènement
    Par Maniz dans le forum C#
    Réponses: 5
    Dernier message: 11/05/2012, 15h07
  4. [ASP.NET] Interception d'un événement "onclick"
    Par Skyou dans le forum ASP.NET
    Réponses: 2
    Dernier message: 05/05/2010, 18h19
  5. [C#2.0]Interception de l'évènement Ctrl + A
    Par fagos dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/06/2006, 15h28

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