【问题标题】:JTextArea only with numbers, but allowing negative valuesJTextArea 仅带有数字,但允许负值
【发布时间】:2011-11-29 17:59:42
【问题描述】:

我有一个只需要接受数字的 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;
    }
}

【问题讨论】:

  • 从来没有看到过,检查您的文档过滤负数的位置
  • 只是一个侧节点:您可以考虑存储模式而不是在每次调用中重新编译
  • 我会为此使用 JTextField。

标签: java swing jtextarea negative-number documentfilter


【解决方案1】:

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

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

这将接受以下数字:

  • 1234
  • -1234
  • +1234
  • 1234.1234

希望对你有帮助

乌迪

【讨论】:

  • 工作正常,但我只需要 3 个十进制数字,所以我改为 Pattern pattern = Pattern.compile("^[\\-\\+]?\\d+(\\. \\d{0,3}+)?$");谢谢!
  • 字符串应该是:"^[\\-\\+]?\\d+(\\.\\d{1,3})?$"
  • @kleopatra 当然,很奇怪我忘了接受这个。对不起!
【解决方案2】:

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

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

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

【讨论】:

  • 这是一个很好的评论。上面提到的正则表达式更适合文本字段失去焦点的情况。但是将 '\d+' 更改为 '\d*' 是不正确的,因为 '-' 不是有效输入。感谢您的意见!
  • 是的,严格来说,你应该有两个不同的正则表达式,一个用于用户打字时,另一个用于失去焦点时的“最终测试”。最终测试不会接受“-”或“”,而打字必须。或者你可以采取一种更宽松、更务实的方法,只使用一个正则表达式,并将最后的“-”和“”视为 0。
猜你喜欢
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多