你真的应该避免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
调用。