JTextArea только с числами, но допускает отрицательные значения - PullRequest
3 голосов
/ 03 октября 2011

У меня есть JTextArea, который должен принимать только цифры. Это мой код:

DocumentFilter onlyNumberFilter = new AxisJTextFilter();
    final JTextArea areaTextoXMin = new JTextArea(String.valueOf(xMin));
    ((AbstractDocument)areaTextoXMin.getDocument()).setDocumentFilter(onlyNumberFilter);

Работает нормально для положительных чисел, но не для отрицательных. Как я могу это исправить?

РЕДАКТИРОВАТЬ: Извините, AxisJTextFilter был найден в Интернете, и я забыл об этом. Его код:

import javax.swing.text.*;
import java.util.regex.*;

public class AxisJTextFilter extends DocumentFilter
{
    public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException
    {
        StringBuilder sb = new StringBuilder();
        sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
        sb.insert(offset, text);
        if(!containsOnlyNumbers(sb.toString())) return;
        fb.insertString(offset, text, attr);
    }
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attr) throws BadLocationException
    {
        StringBuilder sb = new StringBuilder();
        sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
        sb.replace(offset, offset + length, text);
        if(!containsOnlyNumbers(sb.toString())) return;
        fb.replace(offset, length, text, attr);
    }
    public boolean containsOnlyNumbers(String text)
    {
        Pattern pattern = Pattern.compile("\\d*(\\.\\d{0,3})?");
        Matcher matcher = pattern.matcher(text);
        boolean isMatch = matcher.matches();
        return isMatch;
    }
}

Ответы [ 2 ]

6 голосов
/ 03 октября 2011

Попробуйте изменить регулярное выражение (int метод проверки содержитOnlyNumbers).

Pattern pattern = Pattern.compile("^[\\-\\+]?\\d+(\\.\\d+)?$");

Примут следующие значения:

  • 1234
  • -1234
  • + 1234
  • 1234.1234

Надеюсь, это поможет

Udi

1 голос
/ 04 октября 2011

Это предназначено как комментарий к отличному посту Уди, но я не могу понять, как это сделать.

Я думаю, что его шаблон (d +) требует как минимум 1 цифру, и это должно быть d?разрешить 0-N цифр.Поскольку, поскольку пользователь печатает, "-" является допустимым вводом.И десятичная точка, за которой не следуют цифры, всегда допустима, особенно при наборе текста.Только в конце (когда вы теряете фокус и т. Д., YMMV) вам может потребоваться хотя бы одна цифра, или вы должны быть прагматичны и просто относиться к строке «-» как 0.

Ипри разработке таких регулярных выражений не забывайте, что пользователь может копировать и вставлять.

...