Ограничение пользовательского ввода: как ограничить количество символов в JTextField

В этой записи блога мы рассмотрим различные методы, позволяющие запретить пользователям вводить более 10 символов в компонент JTextField с помощью Java Swing. Мы рассмотрим различные подходы и предоставим примеры кода, которые помогут вам реализовать эти ограничения в ваших собственных приложениях. Давайте начнем!

Метод 1: DocumentFilter
Один из способов ограничить ввод пользователя в JTextField — использовать DocumentFilter. Этот класс позволяет перехватывать и изменять изменения, внесенные в текстовый документ. Создав подкласс DocumentFilter и переопределив метод InsertString, вы можете обеспечить ограничение максимального количества символов. Вот пример:

import javax.swing.*;
import javax.swing.text.*;
class CharacterLimitFilter extends DocumentFilter {
    private int maxCharacters;
    public CharacterLimitFilter(int maxCharacters) {
        this.maxCharacters = maxCharacters;
    }
    @Override
    public void insertString(FilterBypass fb, int offset, String text, AttributeSet attrs) throws BadLocationException {
        if ((fb.getDocument().getLength() + text.length()) <= maxCharacters)
            super.insertString(fb, offset, text, attrs);
    }
}
public class Main {
    public static void main(String[] args) {
        JTextField textField = new JTextField();
        ((AbstractDocument) textField.getDocument()).setDocumentFilter(new CharacterLimitFilter(10));
        // Add the JTextField to your UI and continue with the rest of your code
    }
}

Метод 2: KeyListener
Другой подход заключается в использовании KeyListener для перехвата событий нажатия клавиш и предотвращения ввода дополнительных символов при достижении предела. Вот пример:

import javax.swing.*;
import java.awt.event.*;
public class Main {
    public static void main(String[] args) {
        JTextField textField = new JTextField();
        textField.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                if (textField.getText().length() >= 10) {
                    e.consume(); // Prevents the character from being entered
                }
            }
        });
        // Add the JTextField to your UI and continue with the rest of your code
    }
}

Метод 3: PlainDocument
Вы также можете создать подкласс PlainDocument и переопределить метод InsertString, чтобы ограничить ввод желаемым количеством символов. Вот пример:

import javax.swing.*;
import javax.swing.text.*;
class CharacterLimitDocument extends PlainDocument {
    private int maxCharacters;
    public CharacterLimitDocument(int maxCharacters) {
        this.maxCharacters = maxCharacters;
    }
    @Override
    public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
        if ((getLength() + str.length()) <= maxCharacters)
            super.insertString(offset, str, attr);
    }
}
public class Main {
    public static void main(String[] args) {
        JTextField textField = new JTextField();
        textField.setDocument(new CharacterLimitDocument(10));
        // Add the JTextField to your UI and continue with the rest of your code
    }
}

Реализуя любой из этих методов, вы можете эффективно ограничить ввод пользователя максимум 10 символами в компоненте JTextField. Подходы DocumentFilter, KeyListener и PlainDocument обеспечивают гибкость в зависимости от конкретных требований вашего приложения. Выберите метод, который лучше всего соответствует вашим потребностям, и улучшите взаимодействие с пользователем, предотвратив чрезмерный ввод данных.