你真的应该避免KeyListeners,它们对于你最终想要实现的目标来说太有限了,当你在字段试图更改文档时尝试更改字段文档时,你只会得到一个突变异常。
你真的应该使用DocumentFilter,这就是它的设计目的。
((AbstractDocument)field.getDocument()).setDocumentFilter(new DocumentFilter() {
    @Override
    public void insertString(FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {
        StringBuilder sb = new StringBuilder(64);
        for (char c : text.toCharArray()) {
            if (Character.isDigit(c)) {
                sb.append(c);
            }
        }
        fb.insertString(offset, text, attr);
    }
    @Override
    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
        StringBuilder sb = new StringBuilder(64);
        for (char c : text.toCharArray()) {
            if (Character.isDigit(c)) {
                sb.append(c);
            }
        }
        fb.replace(offset, length, sb.toString(), attrs);
    }
});
这是一个非常基本的例子,SO上有很多。
除了避免突变异常之外,过滤器在更新到达文档/字段之前拦截更新,因此屏幕上不会看到传入的更改,您还可以捕获任何粘贴事件或setText调用。