0

假设用户必须在 Jtextfield 中输入一个 Double 值,然后计算该值。
但是,如果用户突然使用超过 1 个句点,它会触发 NumberFormatException,所以我假设解决方案是使用文档过滤器过滤掉任何额外的句点或捕获异常并通知用户输入无效

目前使用 DocumentFilter 只允许数字和句点,但我的问题是如何过滤出第二个句点

PlainDocument filter = new PlainDocument();
            filter.setDocumentFilter(new DocumentFilter() {
                    @Override
                    public void insertString(FilterBypass fb, int off, String str, AttributeSet attr) 
                    throws BadLocationException 
                    {
                    fb.insertString(off, str.replaceAll("[^0-9.]", ""), attr);
                    } 
                    @Override
                    public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr) 
                    throws BadLocationException 
                    {
                    fb.replace(off, len, str.replaceAll("[^0-9.]", ""), attr);
                    }
            });

            apm.setDocument(filter);

例子

无效输入:1.2.2

有效输入:1.22

4

2 回答 2

0

是的,使用 try catch 块。在 try 块中实现快乐路径(即格式正确的数字)并在 catch 块中实现错误情况。例如,如果您想以红色突出显示框或弹出错误消息,您可以将该逻辑放入(或从中调用)catch 块。

于 2013-10-06T18:04:08.127 回答
0

我的建议是您可以更改覆盖的方法insertStringreplace方法,以便它检查是否"." 在此插入之前插入了任何内容,或者替换并更改过滤器,以使“句点”将被空白字符串替换(如果以后有任何时间)period字符由用户插入。我已经说明如下:

@Override
public void insertString(FilterBypass fb, int off, String str, AttributeSet attr) 
                throws BadLocationException {
    String regExp;
    Document doc = fb.getDocument();
    if(doc.getText(0, doc.getLength()).indexOf(".") == -1){
        regExp = "[^0-9.]";
    } else {
        regExp = "[^0-9]";
    }
    fb.insertString(off, str.replaceAll(regExp, ""), attr);
}

@Override
public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr) 
                throws BadLocationException {
    String regExp;
    Document doc = fb.getDocument();
    if(doc.getText(0, doc.getLength()).indexOf(".") == -1){
        regExp = "[^0-9.]";
    } else {
        regExp = "[^0-9]";
    }
    fb.replace(off, len, str.replaceAll(regExp, ""), attr);
}

上面的代码将只允许将“句点”插入设置Document为一次DocumentFilter

于 2015-06-06T07:35:18.767 回答