Maison >Java >javaDidacticiel >Comment restreindre efficacement l'entrée JTextField aux seuls entiers ?

Comment restreindre efficacement l'entrée JTextField aux seuls entiers ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-09 07:06:09929parcourir

How to Effectively Restrict JTextField Input to Only Integers?

Confiner l'entrée JTextField à des entiers

Restreindre l'entrée utilisateur à des entiers positifs dans un contrôle JTextField est un problème courant en programmation. Bien que vous ayez essayé d'utiliser un KeyListener à cette fin, il existe une approche plus efficace.

La mise en œuvre d'un DocumentFilter, par opposition à un KeyListener, offre plusieurs avantages :

  • Il garantit que toutes les données entrant dans le composant texte, quelle que soit la méthode de saisie utilisée (clavier, copier-coller, etc.), sont conformes aux spécifications spécifiées. critères.
  • Il permet une validation supplémentaire au-delà des simples contrôles de plage numérique, comme la validation du type de données (par exemple, en garantissant que les données saisies peuvent être analysées comme un entier) et la longueur des données (par exemple, en appliquant un nombre maximum de chiffres).

Pour implémenter cela à l'aide d'un DocumentFilter, considérez ce qui suit exemple :

import javax.swing.text.PlainDocument;
import javax.swing.text.DocumentFilter;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;

class IntDocumentFilter extends PlainDocument {

    @Override
    public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {

        if (string == null || string.isEmpty()) {
            super.insertString(fb, offset, string, attr);
        } else {
            try {
                Integer.parseInt(string);
                super.insertString(fb, offset, string, attr);
            } catch (NumberFormatException e) {
                // warn the user and don't allow the insert
            }
        }
    }

    @Override
    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {

        if (text == null || text.isEmpty()) {
            super.replace(fb, offset, length, text, attrs);
        } else {
            try {
                Integer.parseInt(text);
                super.replace(fb, offset, length, text, attrs);
            } catch (NumberFormatException e) {
                // warn the user and don't allow the insert
            }
        }
    }
}

Pour utiliser ce filtre, instanciez-le et définissez-le sur l'objet PlainDocument associé au JTextField :

JTextField textField = new JTextField();
PlainDocument doc = (PlainDocument) textField.getDocument();
doc.setDocumentFilter(new IntDocumentFilter());

Cette implémentation :

  • Vérifie si la chaîne d'entrée peut être analysée comme un entier.
  • Permet l'insertion ou remplacement d'une entrée entière valide tout en ignorant toute entrée non entière.
  • Gère les cas où l'utilisateur tente d'insérer une chaîne nulle ou vide.

N'oubliez pas que ces techniques garantissent que l'entrée est conforme aux contraintes souhaitées, vous permettant de contrôler le type de données acceptées par le JTextField.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn