あなたは本当に避けるべきです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
呼び出しもキャプチャされます。