我有一个只需要接受数字的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;
}
}
答案 0 :(得分:6)
尝试修改正则表达式(int验证方法containsOnlyNumbers)。
Pattern pattern = Pattern.compile("^[\\-\\+]?\\d+(\\.\\d+)?$");
这将接受以下数字:
我希望它有所帮助
乌迪
答案 1 :(得分:1)
这是对Udi优秀帖子的评论,但我无法弄清楚如何做到这一点。
我认为他的模式(d +)需要至少1位数,它应该是d?允许0-N位数。因为,当用户输入时,“ - ”是合法输入。小数点后跟无数字总是合法的,特别是在输入时。它只是在最后(当你失去焦点等,YMMV时),你可以要求至少一个数字,或者,容纳和实用,只需将字符串“ - ”视为0。
在开发这些正则表达式时,不要忘记用户可能正在复制和粘贴。