Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTextArea仅包含数字,但允许负值_Java_Swing_Jtextarea_Negative Number_Documentfilter - Fatal编程技术网

Java JTextArea仅包含数字,但允许负值

Java JTextArea仅包含数字,但允许负值,java,swing,jtextarea,negative-number,documentfilter,Java,Swing,Jtextarea,Negative Number,Documentfilter,我有一个只接受数字的JTextArea。这是我的代码: DocumentFilter onlyNumberFilter = new AxisJTextFilter(); final JTextArea areaTextoXMin = new JTextArea(String.valueOf(xMin)); ((AbstractDocument)areaTextoXMin.getDocument()).setDocumentFilter(onlyNumberFilter); 适用

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

尝试修改正则表达式(在验证方法中包含sonlynumbers)

这将接受以下数字:

  • 1234
  • -1234
  • +1234
  • 1234.1234
我希望有帮助


Udi

这是对Udi优秀帖子的评论,但我不知道该怎么做

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


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

从来没有看到过,检查文档在哪里过滤负数字只是一个侧节点:您可以考虑存储模式而不是重新编译,在每个调用中都会使用JTrordField.但我像以前一样只需要3位小数,所以我改为Pattern=Pattern.compile(“^[\-\\+]?\\d+(\\.\\d{0,3}+)?$”;谢谢字符串应该是:“^[\-\+]?\\d+(\\.\\d{1,3})?$”@kleopatra当然,奇怪的是我忘了接受这个。很抱歉这是一个很好的评论。上面提到的regExp更适合文本字段失去焦点的情况。但是将“\d+”更改为“\d*”是不正确的,因为“-”不是有效的输入。谢谢你的意见!是的,严格来说,您应该有两个不同的regexp,一个用于用户键入时,另一个用于失去焦点时的“最终测试”。最终测试不接受“-”或“”,但必须键入。或者您可以采取更宽松、更务实的方法,只使用一个regExp,并将最后一个“-”和“”视为0。
Pattern pattern = Pattern.compile("^[\\-\\+]?\\d+(\\.\\d+)?$");