O document impede o copy&paste.
Set é uma das estruturas de dados previstas na Collections Framework. É uma estrutura que representa um conjunto de dados sem repetição. Uma das grandes vantagens do set é o tempo de busca, que tenta ser próximo de O(1) - ou seja, constante e geralmente tão rápido quanto acessar um array.
O HashSet é um tipo de Set.
Ele não é ordenado, com tempo de busca de O(1).
Outro tipo é o TreeSet, que é um Set Ordenado, com tempo de busca igual a O(log2n).
Para criar, você faz assim:
Character chs[] = {'0', '1', '2', '3', '4', ...}; //Coloque aqui todos os caracteres válidos
Set<Character> validos = new HashSet<Character>(Arrays.asList(chs));
E aí é só deixar seu Document assim:
public class ControlarEntradaTexto extends PlainDocument{
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException{
char[] chars = str.toUpperCase().toCharArray();
StringBuilder inserted = new StringBuilder();
for (char ch : chars) {
if (validos.contains(ch)) {
inserted.append(ch); //Filtramos só o que é válido
}
}
super.insertString(offs, inserted.toString(), a);
}
É por causa do copy&paste que também não basta só testar o conteúdo do charAt(0). Com copy&paste podem vir vários caracteres no insertString.