Не могу понять, что не так с моим DocumentFilter

Я попытался собрать пользовательский PlainDocument, сделанный другими, для того, который мне был нужен, но, поскольку я не знаю механики PlainDocument, у меня не получилось, и это не сработало. Мне нужно что-то, что гарантирует, что мое текстовое поле позволяет использовать только 2 буквы, поэтому все, что a-zA-Z встречается только дважды. Я попробовал это первым:

    public class LetterDocument extends PlainDocument {

    private String text = "";

    @Override
    public void insertString(int offset, String txt, AttributeSet a) {
        try {
            text = getText(0, getLength());
            if ((text + txt).matches("^[a-zA-Z]{2}$")) {
                super.insertString(offset, txt, a);
            }
         } catch (Exception ex) {
            Logger.getLogger(LetterDocument.class.getName()).log(Level.SEVERE, null, ex);
         }

        }
    }

Это даже не позволяет мне вводить что-либо. Затем я попробовал это, которое я попытался собрать из двух других потоков, один из которых позволял вводить только буквы, а другой ограничивал символы:

    public class LetterDocument extends PlainDocument {
    private int limit;
    private String text = "";

    LetterDocument(int limit) {
        super();
        this.limit = limit;
    }

    @Override
    public void insertString(int offset, String txt, AttributeSet a)
            throws BadLocationException {
        if (txt == null)
            return;
        try {
            text = getText(0, getLength());

            if (((text + txt).matches("[a-zA-Z]"))
                    && (txt.length()) <= limit) {
                super.insertString(offset, txt, a);
            }
        } catch (Exception ex) {
            Logger.getLogger(LetterDocument.class.getName()).log(Level.SEVERE,
                    null, ex);
        }

    }
}

Я понятия не имею, что случилось.


person Abdul    schedule 19.04.2014    source источник


Ответы (1)


Не используйте пользовательский документ.

Вместо этого используйте DocumentFilter. Прочтите раздел руководства Swing по Реализация фильтра документов для рабочего примера, который ограничивает количество символов, которые вы можете ввести в документ.

Затем просто добавьте дополнительную логику, чтобы убедиться, что добавляются только буквы.

Или более простой вариант — использовать JFormatttedTextField с маской символов. Снова см. руководство по Использование форматированного текстового поля.

person camickr    schedule 19.04.2014
comment
Я использовал средство форматирования маски для своего текстового поля phoneNumber и почтового индекса, поскольку для них требуются двумерные маски (ограничение символов и маска), и я использовал DocumentFilter для адреса, города, имени, поскольку я хочу ограничить его только символами и не слишком беспокоит размер. Спасибо! - person Abdul; 20.04.2014
comment
Кроме того, я не получаю никаких ошибок, но все ли в JTextField и JFormattedTextfield одинаково, например методы, за исключением гибкости? Я спрашиваю на случай, если мне придется пройти и внести изменения. - person Abdul; 20.04.2014