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

Composants Java Discussion :

[JCheckBox] raccourci clavier et KeyEvent KeyTyped


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 254
    Par défaut [JCheckBox] raccourci clavier et KeyEvent KeyTyped
    Bonjour,

    Je fixe le décor...

    J'ai un JPanel avec une JTable(données d'une table clients SQL), un JTextField(filtre les données, le nom du client par exemple) et un JCheckBox(filtre les données, correspond à un booleen de la table clients).

    Voici les comportements qui fonctionnent :

    Focus la JTable, quand je tape un caractère, je rempli mon JTextField avec pour filtrer mes données et les caractères suivant sont ajoutés au JTextField (ESC pour vider, les touches curseurs pour repasser sur la JTable)...pas de soucis.

    Clic sur le JCheckBox, les données sont filtrées...pas de soucis

    ...je voudrais ajouter un raccourci clavier(CTRL+O) sur ma JCheckBox

    Pour cela j'ai fais ceci...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    InputMap inputMap = jScrollPaneTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
     
    inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_DOWN_MASK), "obs");
    jScrollPaneTable.getActionMap().put("obs", new obs());
     
    class obs extends AbstractAction {
     
        public void actionPerformed(ActionEvent e) {
           ..................
        }
    }
    Mon problème est que quand je tape CTRL+O, l'action "obs" est executée mais le KeyTyped sur ma table aussi... et un espace est mis dans mon JTextField...

    Comment puis-je "filtrer" tous les CTRL+???? du ma methode qui gerent les KeyTyped ?


    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Sur le AbstractButton il y a le système du mnemonic, cela ne te va pas pour ton raccourci ?

    Ensuite cela m'étonne qu'il apparaisse quelque chose dans le JTexttField. C'est pas ton listener qui fait des trucs bizarres ?... de toutes façons c'est pas la bonne méthode, il ne faut JAMAIS utiliser les listeners pour modifier la source de l'évènement. (à moins de faire un invokeLater ofcourse).

    Enfin bon la Bonne Méthode À Suivre est de passer par Implementing a Document Filter.

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 254
    Par défaut
    Tout d'abord merci bcp pour la réponse...

    Mais j'avoue que je ne comprends pas bien ou je pourrais utiliser le AbstractButton...

    Tout cela est créer avec le GUI Builder de NetBeans 6.1, voici le JCheckBox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            jCheckObsolete.setMnemonic(KeyEvent.VK_O);
            java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("TableClients/langues"); // NOI18N
            jCheckObsolete.setText(bundle.getString("Obsoletes_visibles")); // NOI18N
            jCheckObsolete.setToolTipText(bundle.getString("_toottip_Clients_obsolete_visible_?")); // NOI18N
            jCheckObsolete.addMouseListener(new java.awt.event.MouseAdapter() {
                public void mouseClicked(java.awt.event.MouseEvent evt) {
                    jCheckObsoleteMouseClicked(evt);
                }
            });
    et voici la methode qui ecoute le KeyTyped
    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
    private void jXTableKeyTyped(java.awt.event.KeyEvent evt) {                                 
    // TODO add your handling code here:
        boolean maj=false;
        P.rintln("evt.getKeyChar() = " + evt.getKeyChar() + " evt.getKeyCode()) " + evt.getKeyCode());
        switch (evt.getKeyChar()) {
            case KeyEvent.VK_ESCAPE :
                //P.rintln("typed escape");
                if (!jTextFiltre.getText().isEmpty()) {
                    jTextFiltre.setText("");
                    maj=true;
                }
                break;
            case KeyEvent.VK_ENTER :
            case KeyEvent.VK_TAB :
                break;
            case KeyEvent.VK_BACK_SPACE :
                if (!jTextFiltre.getText().isEmpty()) {
                    jTextFiltre.requestFocus();
                    String nouvFiltre = jTextFiltre.getText();
                    jTextFiltre.setText(nouvFiltre.substring(0, nouvFiltre.length()-1));
                    maj=true;
                }
                break;
            default :
                if (jTextFiltre.getText().isEmpty()) {
                    jTextFiltre.requestFocus();
                    jTextFiltre.setText(""+evt.getKeyChar());
                    maj=true;
                }
                break;
        }
        //setSelectedId();
        if(maj) filtreClients();
    }
    Je ne veux pas changer la source de l'evenement...le "filtrage" donc je parlais ce serait un "case" qui ne ferait rien dans le cas de CTRL+o...

    Quand j'affiche :
    CTRL+o donne : evt.getKeyChar() = " " et evt.getKeyCode() = 0 (zero)
    o donne : evt.getKeyChar() = "o" et evt.getKeyCode() = 0( zero),
    ALT+o donne : evt.getKeyChar() = "o" et evt.getKeyCode() = 0( zero)

    Je ne sais pas quoi faire...

  4. #4
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut
    Ben moi j'utilise des "setMnemonic" lorsque j'ai le focus sur un JTextField , je combine même avec des "KeyStroke" , je n'ai jamais eu ce problème..
    Aucun caractère qui est rajouté ou autre

  5. #5
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 254
    Par défaut
    Suite au message de libuma j'ai fais une petite modif...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    InputMap inputMap = this.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
     
    inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_DOWN_MASK), "obs");
    this.getActionMap().put("obs", new obs());
    this est le JPanel qui contient le tout (JTable, jTextField et JCheckBox)

    et là le raccourci fonctionne correctement sauf si c'est la JTable qui a le focus, dans ce cas j'ai l'espace qui vient ds mon jTextField...donc comme disait gifffftane c'est mon listener jXTableKeyTyped qui fait des trucs bizarres...mais quoi ???

    Après qlq recherches j'ai trouvé comment "filtrer" les CTRL+??. si getModifiers() renvoi 0 cela veut dire qu'il n'y a pas de modifier à l'evenement KeyTyped.

    J'ai donc modifier mon listener comme suit et là tout fonctionne comme je veux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        if(evt.getModifiers()==0)
        {
            switch (evt.getKeyChar()) {
                case KeyEvent.VK_ESCAPE :
                          ........
                          ........
        }
    C'était tout simple...

    Merci à vous tous pour votre aide.

  6. #6
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut
    Citation Envoyé par genamiga Voir le message
    Suite au message de libuma j'ai fais une petite modif...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    InputMap inputMap = this.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
     
    inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_DOWN_MASK), "obs");
    this.getActionMap().put("obs", new obs());
    this est le JPanel qui contient le tout (JTable, jTextField et JCheckBox)

    et là le raccourci fonctionne correctement sauf si c'est la JTable qui a le focus, dans ce cas j'ai l'espace qui vient ds mon jTextField...donc comme disait gifffftane c'est mon listener jXTableKeyTyped qui fait des trucs bizarres...mais quoi ???

    Après qlq recherches j'ai trouvé comment "filtrer" les CTRL+??. si getModifiers() renvoi 0 cela veut dire qu'il n'y a pas de modifier à l'evenement KeyTyped.

    J'ai donc modifier mon listener comme suit et là tout fonctionne comme je veux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        if(evt.getModifiers()==0)
        {
            switch (evt.getKeyChar()) {
                case KeyEvent.VK_ESCAPE :
                          ........
                          ........
        }
    C'était tout simple...

    Merci à vous tous pour votre aide.
    Impecc

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

Discussions similaires

  1. [JTable] Raccourci clavier sur une Table
    Par sylvain_2020 dans le forum Composants
    Réponses: 5
    Dernier message: 05/07/2007, 09h01
  2. désactivation des raccourci clavier
    Par Arnaud-h dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/06/2004, 09h28
  3. [Debutant(e)] Liste raccourcis clavier
    Par lfournial dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 11/05/2004, 14h51
  4. [BPW]Raccourcis clavier dans une fenêtre enfant
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 18/02/2004, 20h07
  5. [] Raccourci clavier pour bouton d'une barre d'outil
    Par Sébastien dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 24/03/2003, 17h02

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