首页 > 解决方案 > 使用 JFormattedTextField(NumberFormat.getIntegerInstance()) 时出错;

问题描述

当我尝试使用时遇到问题:

JFormattedTextField(NumberFormat.getIntegerInstance());

当我将数字放入数字框时,我收到一个错误,即我输入的数字是错误的,因为数字之间有一个空格,如下所示:200 000当数字是200000我没有错误时。

标签: javaswing

解决方案


您可以MaskFormatter按照如何使用格式化文本字段中的说明使用 a 以避免获取非数字字符:

    JFormattedTextField textField = new JFormattedTextField(new MaskFormatter("#######"));

但是,如果您使用这种方式,当您复制粘贴文本200 000时,它要么不会被粘贴,要么只会粘贴 200 个。(空格后的其余部分 - 非数字字符将被忽略)

为了允许这样做,您必须使用仅保留数字的文档过滤器。因此,当输入带有空间200 000时,它将保持200000

class NumberOnlyDocumentFilter extends DocumentFilter {
    @Override
    public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr)
            throws BadLocationException {
        super.insertString(fb, offset, keepOnlyDigits(string), attr);
    }

    @Override
    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs)
            throws BadLocationException {
        super.replace(fb, offset, length, keepOnlyDigits(text), attrs);
    }

    private String keepOnlyDigits(String text) {
        StringBuilder sb = new StringBuilder();
        for (char c : text.toCharArray())
            if (Character.isDigit(c))
                sb.append(c);
        return sb.toString();
    }
}

并“安装”它:

JTextField textField = new JTextField();
AbstractDocument document = (AbstractDocument) textField.getDocument();
document.setDocumentFilter(new NumberOnlyDocumentFilter());

推荐阅读