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 :

Comment faire clique sur tabulation automatiquement


Sujet :

AWT/Swing Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Points : 130
    Points
    130
    Par défaut Comment faire clique sur tabulation automatiquement
    Bonjour tout le monde.

    J'ai deux champs de type "JTextField", "champ1TextField" et "champ2TextField", je veux lorsque je saisis deux caractères dans le "champ1TextField" le curseur passe automatiquement au "champ2TextField" comme si je clique sur tabulation.

    J'utilise la fonction suivante :

    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
     /**
        * Méthode permet de controler la saisie dans les zones de text.
        * @param textField
        */
        private void limiterSaisie(final JTextField textField , final int longuerText){
         textField.addKeyListener(new java.awt.event.KeyAdapter() {
                public void keyTyped(java.awt.event.KeyEvent evt) {
                     if (!Character.isDigit(evt.getKeyChar()) || ((JTextField)evt.getComponent()).getText().length()==longuerText ){
                        evt.setKeyChar((char)0);
                        if("champ1TextField".equals(textField.getName())){
                            getChamp2TextField().requestFocusInWindow();
                        }
                    }
                }
            });
        }
    ça marche mais le problème c'est que lorsque j'écris les deux caratères dans "champ1TextField" le curseur ne passe pas automatiquement au champ2, mais si je tape une caractère le curseur passe (moi je veux que le curseur passe automatiquement après avoir taper le deuxième caractère dans champ1).

    J'espère que j'ai bien expliqué le problème.

  2. #2
    Membre éclairé

    Profil pro
    Technicien
    Inscrit en
    Février 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2009
    Messages : 338
    Points : 791
    Points
    791
    Par défaut
    Bonjour,

    Je te conseille d'utiliser d'overrider la méthode keyReleased() plutôt que keyTyped().
    En utilisant keyReleased(), la méthode .length() te renvoie la longueur en tenant compte du dernier caractère saisi.
    Alors qu'en utilisant keyTyped(), la valeur .length() ne tient pas compte du dernier caractère saisi.

    Autre chose : j'ai un doute sur l'utilité du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    evt.setKeyChar((char) 0);
    et sur l'ordre des if. Sur ces points là, je te laisse gérer.

    Benoit

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Points : 130
    Points
    130
    Par défaut
    Merci pour la réponse, mais ça marche pas, le curseur ne passe pas automatiquement à l'autre champ, je veux que lorsque je tape deux caractère le curseur passe au champ suivant comme si j'ai cliqué sur tabulation.

    Merci d'avance.

  4. #4
    Membre éclairé

    Profil pro
    Technicien
    Inscrit en
    Février 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2009
    Messages : 338
    Points : 791
    Points
    791
    Par défaut
    Bonjour,

    De tête, j'ai testé en saisissant 1 puis 2.
    1 s'est affiché dans la combo, puis 2 s'est affiché dans la combo et le focus est ensuite parti sur l'autre combo.

    Du coup, je ne comprends pas pourquoi ça ne fonctionne pas chez toi.

    Benoit

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Points : 130
    Points
    130
    Par défaut
    Voici le code que j'ai utilisé (j'ai laissé le keyTyped pour faire le contrôle sur les valeurs saisie : je veux empêcher la saisie des lettres et permettre que la saisie des chiffres, et la taille du champs ne doit pas dépasser 2 ou 4 selon le cas), la fonction keyReleased() n'accepte pas KEyEvent en paramètre.
    Peux-tu STP m'envoyer ton 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
    private void limiterSaisie(final JTextField textField , final int longuerText){
         textField.addKeyListener(new java.awt.event.KeyAdapter() {
                public void keyTyped(java.awt.event.KeyEvent evt) {
                     if (!Character.isDigit(evt.getKeyChar()) ||
                             ((JTextField)evt.getComponent()).getText().length()==longuerText ){
                        evt.setKeyChar((char)0);
                    }
                }
                public void keyReleased(){
                    if("jourRdvTextField".equals(textField.getName())){
                            getMoisRdvTextField().requestFocusInWindow();
                        }else if("moisRdvTextField".equals(textField.getName())){
                            getAnneeRdvTextField().requestFocusInWindow();
                        }else if("anneeRdvTextField".equals(textField.getName())){
                            getHeureRdvTextField().requestFocusInWindow();
                        }else if("heureRdvTextField".equals(textField.getName())){
                            getMinuteRdvTextField().requestFocusInWindow();
                        }
                }
            });
        }
    Merci d'avance.

  6. #6
    Membre éclairé

    Profil pro
    Technicien
    Inscrit en
    Février 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2009
    Messages : 338
    Points : 791
    Points
    791
    Par défaut
    La méthode keyReleased() accepte bien un KeyEvent en paramètre : http://docs.oracle.com/javase/1.5.0/docs/api/java/awt/event/KeyAdapter.html

    Je pense que la méthode telle que tu l'as faite n'est jamais appellée. Pour le code, j'avais simplement renommé ta méthode keyTyped() en keyReleased().

    Je te le ferais parvenir plus tard, si tu ne trouves pas entre temps.

    Benoit

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Points : 130
    Points
    130
    Par défaut
    Bonsoir, merci pour la réponse,

    Ma méthode est appelée au moment de construction comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     /** Creates new form NouveauRDVPanel */
        public NouveauRDVPanel() {
            initComponents();
            //Control sur les champs de rendez-vous.
            limiterSaisie(this.getJourRdvTextField(), 2);
            limiterSaisie(this.getMoisRdvTextField(), 2);
            limiterSaisie(this.getAnneeRdvTextField(), 4);
            limiterSaisie(this.getHeureRdvTextField(), 2);
            limiterSaisie(this.getMinuteRdvTextField(), 2);
        }
    Si tu peux STP m'envoyer ton code je serais reconnaissant .

    Merci d'avance.

  8. #8
    Membre éclairé

    Profil pro
    Technicien
    Inscrit en
    Février 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2009
    Messages : 338
    Points : 791
    Points
    791
    Par défaut
    Bonsoir,

    Je veux bien t'aider. Mais je pense que t'envoyer le code ne serait pas forcément t'aider à comprendre.

    Vu que je ne sais pas où tu bloques, voici une indication. Il faut découper ta vérification en 2 temps :
    1. Sur le keyTyped, faire le contrôle du type de caractère (et si ce n'est pas du numérique, refuser le caractère) ;
    2. Sur le keyReleased, faire le contrôle sur la longueur du champ (et si la longueur max est atteinte, effectuer le changement de focus) ;


    Une fois que tout ça fonctionnera, tu pourras envisager une petite évolution dans ton code : passer en paramètre de ta méthode limiterSaisie() le JTextField qui doit être destinataire du focus. Ainsi dans la méthode keyReleased() tu n'auras plus les 'if("jourRdvTextField".equals(textField.getName())){
    ' à faire mais ça sera fait dans NouveauRDVPanel() de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    limiterSaisie(this.getJourRdvTextField(), 2, this.getMoisRdvTextField())
    Benoit

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Points : 130
    Points
    130
    Par défaut
    Merci infiniment pour tes indications.
    en faîte, j'ai laissé la fonction limiterSaisie telle qu'elle est, et j'ai développé pour chaque texteField son keyReleased de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private void anneeRdvTextFieldKeyReleased(java.awt.event.KeyEvent evt) {
            if(this.getAnneeRdvTextField().getText().length() == 4){
               getHeureRdvTextField().requestFocusInWindow();
            }
        }
    je viens de comprendre pour quoi tu savais pas où je suis bloqué car c'est trop simple .

    Merci encore une fois.

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

Discussions similaires

  1. Comment faire SET sur une table lié a 3 autres tables
    Par Battosaiii dans le forum Oracle
    Réponses: 2
    Dernier message: 13/04/2011, 17h59
  2. [MySQL] Comment faire requete sur un champ TIMESTAMP
    Par cleminute dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 01/10/2009, 09h13
  3. comment faire newsletter sur dreamweaver
    Par jiji_belle dans le forum Dreamweaver
    Réponses: 2
    Dernier message: 08/09/2009, 10h44
  4. Réponses: 0
    Dernier message: 11/02/2009, 13h53
  5. Comment faire pour un envoi automatique de mail dans access
    Par chpierrot dans le forum VBA Access
    Réponses: 1
    Dernier message: 18/06/2008, 13h45

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