3

我有一个只需要接受数字的 JTextArea。这是我的代码:

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

适用于正数,但不适用于负数。我该如何解决?

编辑:抱歉,AxisJTextFilter 是在 Internet 上找到的,我忘记了。它的代码是:

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;
    }
}
4

2 回答 2

6

尝试修改正则表达式(int 验证方法 containsOnlyNumbers)。

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

这将接受以下数字:

  • 1234
  • -1234
  • +1234
  • 1234.1234

我希望它有帮助

乌迪

于 2011-10-03T08:38:03.383 回答
1

这是对 Udi 出色帖子的评论,但我不知道该怎么做。

我认为他的模式(d+)至少需要1位数字,应该是d?允许 0-N 个数字。因为,当用户键入时,“-”是合法输入。小数点后面没有数字总是合法的,尤其是在打字时。只有在最后(当你失去焦点时,等等,YMMV)你才能要求至少一位数字,或者,包容和务实,只将字符串“-”视为 0。

并且在开发这些类型的正则表达式时不要忘记用户可能正在复制和粘贴。

于 2011-10-04T00:03:37.190 回答