Ограничение текстовых полей в Java - PullRequest
4 голосов
/ 26 января 2010

Есть ли способ ограничить текстовое поле, чтобы разрешить только цифры 0-100, исключая таким образом буквы, символы и тому подобное? Я нашел способ, но он намного сложнее, чем кажется необходимым.

Ответы [ 4 ]

10 голосов
/ 26 января 2010

Если вам нужно использовать текстовое поле, вы должны использовать JFormattedTextField с NumberFormatter . Вы можете установить минимальные и максимальные значения, допустимые в NumberFormatter.

NumberFormatter nf = new NumberFormatter();
nf.setValueClass(Integer.class);
nf.setMinimum(new Integer(0));
nf.setMaximum(new Integer(100));

JFormattedTextField field = new JFormattedTextField(nf);

Однако предложение Йоханнеса об использовании JSpinner также уместно, если оно подходит для вашего случая использования.

5 голосов
/ 26 января 2010

Я бы посоветовал вам пойти с JSpinner в этом случае. С текстовыми полями работать в Swing довольно сложно, поскольку даже самые простые однострочные имеют полноценный класс Document.

1 голос
/ 26 января 2010

Вы можете установить DocumentFilter PlainDocument, используемого JTextField. Методы DocumentFilter будут вызываться до изменения содержимого Document и могут дополнять или игнорировать эти изменения:

    PlainDocument doc = new PlainDocument();
    doc.setDocumentFilter(new DocumentFilter() {
        @Override
        public void insertString(FilterBypass fb, int offset, String text, AttributeSet attr)
        throws BadLocationException {
            if (check(fb, offset, 0, text)) {
                fb.insertString(offset, text, attr);
            }
        }
        @Override
        public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs)
        throws BadLocationException {
            if (check(fb, offset, length, text)) {
                fb.replace(offset, length, text, attrs);
            }
        }
        // returns true for valid update
        private boolean check(FilterBypass fb, int offset, int i, String text) {
            // TODO this is just an example, should test if resulting string is valid
            return text.matches("[0-9]*");
        }
    });

    JTextField field = new JTextField();
    field.setDocument(doc);

в приведенном выше коде вы должны заполнить метод check в соответствии с вашими требованиями, в конечном итоге получить текст поля и заменить / вставить текст для проверки результата.

0 голосов
/ 26 января 2010

Вы должны реализовать и добавить новый DocumentListener в ваш textField.getDocument (). Я нашел реализацию здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...