Não permitir acentuação - Java Desktop

Boa tarde a todos.

Estou desenvolvendo um pequeno aplicativo onde tenho que “não deixar” o usuário digitar acentos, pontos ou qualquer caractere diferente de letras ou numeros (´~^´.,) etc…
Existe alguma forma de se fazer isso no momento da digitação e não uma validação depois de sair do foco do campo texto?

grato.

Wanderley

voce pode usar um JFormattedTextField limitando esses tipos de caracteres ou criar um Document e setalo no seu JTextField.

Oi,

O JTextField tem um evento onKeyTyped. Você pode nesse evento pegar o texto digitado, tirar o acento e setar o texto de novo.

É uma solucao possível…

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class ControlarEntradaTexto extends PlainDocument
{
    @Override
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException
    {
        if(/*aqui voce faz a verificacao se 'str' tem acento ou nao*/)
            super.insertString(offs, str, a);
    }
}

depois no seu TextField é só fazer

mewTextField.setDocument(new ControlarEntradaTexto());

Podes usar o MaskFormatter, e indicar quais os dígitos não permitidos (ou permitidos, em outra abordagem).

A ideia de criar o PlainDocument parece ser a mais eficaz… na hora de sobrescrever o metodo insertString voce seta quais caracteres voce quer deixar no campo. Tipo assim olha… para aceitar apenas numeros eu faço assim:

public void insertString(int offs, String str, AttributeSet a)
			throws BadLocationException {
   if (str == null)
				return;
			String oldString = getText(0, getLength());
			String newString = oldString.substring(0, offs) + str
					+ oldString.substring(offs);
			try {
				Double.parseDouble(newString);
				// Integer.parseInt(newString);
				super.insertString(offs, str, a);
			} catch (NumberFormatException e) {
			}
    }

Coloque esse trecho no Evento KeyTyped do InputTextField

int k=evt.getKeyChar(); if((k>47 && k<58)){ } else{ evt.setKeyChar((char)KeyEvent.VK_CLEAR); }

o intervalo de maior que 47 e menor que 58 deixa digitar apenas numeros, e não letras
agora para o seu caso olhe na tabela ascii e use mais algumas condições para deixar do jeito que vc quer

MaskFormatter Mask = new MaskFormatter("U"); Mask.setInvalidCharacters("Todos os caracteres que deseja bloquear"); JFormattedTextField textfield = new JFormattedTextField(Mask);

Voce pode utilizar este evento KeyTyped:
Sendo (k > 58 && k < 126) libera para digitar letras
Sendo (k > 47 && k < 58 ) libera para digitar numeros

int k = evt.getKeyChar(); if((k > 58 && k < 126) ||(k > 47 && k < 58)) { if(tfCep.getText().length() == 10){ evt.setKeyChar((char)KeyEvent.VK_CLEAR); } } else { evt.setKeyChar((char)KeyEvent.VK_CLEAR); } }