使用Document FIlter过滤多个句点(。)

时间:2013-10-06 18:00:31

标签: java swing jtextfield documentfilter

假设用户必须在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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我的建议是,您可以更改已覆盖的terminateinsertString方法,以便检查在此插入或替换之前是否已插入任何replace并更改过滤器这个时期的方式'如果用户插入"."字符的任何后续时间,则将替换为空字符串。我已经说明如下:

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的{​​{1}}中插入一次。