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 :

JTextField : interdire le déplacement du curseur ?


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2014
    Messages : 51
    Points : 29
    Points
    29
    Par défaut JTextField : interdire le déplacement du curseur ?
    Bonjour,

    j'aimerais interdire le déplacement du curseur dans un JTextField :
    les lettres saisies par l'utilisateur s'ajouteraient bien dans le JTextField mais le curseur resterait toujours au même endroit, à savoir derrière la dernière lettre saisie, et l'utilisateur ne pourrait le déplacer.

    Est-ce possible ?

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    La position du curseur peut être modifiée par le clavier, ou par la souris (ou autre éventuellement)

    En ce qui concerne la gestion du clavier (key binding) d'un composant SWING est géré à l'aide de 2 mappings :

    • textfield.getInputMap() qui associe des combinaisons de touches du clavier (parce qu'on peut appuyer sur plusieurs touches en même temps), et des identifiants d'actions
    • textfield.getActionMap() qui associe les identifiants d'actions avec les actions à faire


    Tout le détail dans ce tutoriel oracle : How to Use Key Bindings.

    Tu peux par exemple, chercher tous les bindings dont la combinaison de touche comprend la touche "flêche gauche", soit KeyEvent.VK_LEFT, et remplacer l'action associée par une action qui ne fait rien.

    Par exemple :
    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
    textfield = new JTextField();
    InputMap inputMap = textfield.getInputMap();
    ActionMap actionMap = textfield.getActionMap();
    // action qui fait rien
    AbstractAction action = new AbstractAction() {
     
          @Override
          public void actionPerformed(ActionEvent e) {
          }
     
    };
    for(KeyStroke key : inputMap.allKeys()) {
     
        if (key.getKeyCode()==KeyEvent.VK_LEFT ) {
            actionMap.put(inputMap.get(key), action);
        }
     
    }
    Mais cela ne suffirait pas à empêcher de modifier la position du curseur, qui pourrait l'être avec la souris par exemple.

    Le plus simple est encore d'écouter les changements de position du curseur, et de forcer la position à la fin, à chaque fois que ça change. Comme forcer la position du curseur consiste à changer la position du curseur, il faut penser à empêcher que ça boucle infiniment. En plus, comme il possible également de changer la position du curseur en faisant une sélection, il faut empêcher qu'on puisse voir cette sélection le temps que l'écouteur force la position du curseur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    textfield = new JTextField();
    textfield.addCaretListener(new CaretListener() {
     
         @Override
         public void caretUpdate(CaretEvent e) {
             int positionFin = textfield.getText().length();
             if ( e.getDot()!=positionFin ) {
                 textfield.setCaretPosition(positionFin);
             }
         }
     
    });
    textfield.setHighlighter(null); // permet de ne pas voir la sélection
    Cependant, comme je suppose que le but est d'empêcher de modifier ce qui a déjà été saisi, donc en fait ne pouvoir qu'ajouter des caractères, il reste 2 problèmes :

    • On peut supprimer le dernier caractère saisi avec la touche backspace
    • On ne peut empêcher quelqu'un d'appuyer très vite sur des touches du clavier pendant qu'il clique à la souris, ce qui peut modifier (ou supprimer) ce qui a déjà été saisi


    Pour le premier cas, la solution de modifier le binding comme montré au début fonctionnera : au lieu de traiter la touche "flêche gauche", il faut gérer les associations avec la touche "backspace".

    Mais le plus simple est encore d'utiliser un DocumentFilter qui te permettra de contrôler exactement ce qu'on peut modifier dans le JTextField.

    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
    textfield = new JTextField();
    ((PlainDocument)textfield.getDocument()).setDocumentFilter(new DocumentFilter() {
     
         @Override
         public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException { 
            if(string == null) {
                return;
            } else{
                replace(fb, offset, 0, string, attr); // on renvoie l'insertion de caractère sur le remplacement pour traiter tous les cas une fois de la même manière
            }
         }
     
         @Override
         public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
            replace(fb, offset, length, "", null); // on renvoie l'insertion de caractère sur le remplacement pour traiter tous les cas une fois de la même manière
         }
     
         @Override
         public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
     
             Document doc = fb.getDocument();
             // on ne peut modifier que ce qui se trouve à la fin du texte saisi
             if ( offset==doc.getLength() ) {
                 super.replace(fb, offset, length, text, attrs);
             }
         }
            });
    Ceci n'empêche pas de modifier la position du curseur, ni de faire de la sélection, mais tu peux combiner le code qui traite l'évènement de changement de position du curseur ci-dessus avec celui-ci pour le faire.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2014
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    Merci pour cette réponse très complète.

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

Discussions similaires

  1. Interdire le déplacement de certaines cellules
    Par DBBB dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 14/01/2008, 22h54
  2. Excel - Interdire le déplacement d'une feuille
    Par JesuhsXVII dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/09/2007, 15h24
  3. Réponses: 6
    Dernier message: 20/02/2007, 18h39
  4. [PDO] Déplacement du curseur d'un recordset
    Par dorian53 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 08/11/2006, 11h52
  5. Réponses: 3
    Dernier message: 19/11/2004, 15h48

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