[Resolvido] Trabalhando com máscaras

Pessoal, abri este tópico porque já tentei pesquisar no google, já olhei neste mesmo fórum e não encontrei nada (pelo menos da forma como eu pesquisei) semelhante ao problema que estou tentando resolver aqui.

Criei máscaras para os campos de telefone, celular e cep. Vou colocar apenas a máscara para o cep, o código abaixo está escrito na propriedade “pós-criação” de um JTextField:

   try{
             javax.swing.text.MaskFormatter cep = new javax.swing.text.MaskFormatter("##.###-###");
        
             cep.setPlaceholderCharacter('_');

             jtxCepEscola = new javax.swing.JFormattedTextField(cep);

    } catch(Exception e) {}

Estou com os seguintes problemas:

1 - se o usuário não digitar o cep no momento em que grava o registro no banco de dados e depois voltar no registro e fizer uma atualização o campo não aceita, assim que perde o foco apaga o conteúdo;

2 - ao navegar entre os registros quando passa num registro que foi cadastrado sem cep (e que deveria estar em branco) o campos exibe o valor do último registro que foi mostrado.

Alguém pode me indicar um link ou um exemplo do que preciso fazer para resolver este problema?

Desde já agradeço.

Você gostaria de testar uma outra abordagem para formatação de campos?

public class CEPDocument extends PlainDocument {

    private final int tamanho;

    public CEPDocument(int tamanhoMax) {
        super();
        this.tamanho = tamanhoMax;
    }

    @Override
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
        if (str == null) {
            return;
        }
        String campo;
        if (!strEmpty(getText(0, getLength()))) {
            campo = getText(0, getLength()) + str;
        } else {
            campo = str;
        }
        if (campo.length() <= tamanho) {
            campo = soNumeros(campo);
            if (offs > 0) {
                remove(0, offs);
            }
            super.insertString(0, campo.length() == 8 ? format(campo) : campo, a);
        }
    }

    private boolean strEmpty(String s) {
        return s == null || s.equals("");
    }

    private String soNumeros(String s) {
        return s.replaceAll("[^0-9]", "");
    }

    private String format(String cep) {
        return cep.substring(0, 5) + "-" + cep.substring(5);
    }
}

Usabilidade:

No construtor da tela (DlgCliente, por exemplo), faça:

jTextFieldCEP.setDocument(new CEPDocument(9));

fnx, vou tentar aqui… agora só mais uma dúvida a partir do momento em que setar o Document no construtor da tela, usar get e set no jtextfield deverá ter alguma particularidade ou basta usar normalmente?

Só usar.

fnx, muito obrigado pelo código!

Agora só adaptar para os campos de telefone, celular e cpf.

@marcos3 isso aí.

ps: sinalize a resposta com a solução para auxiliar outras pessoas que, eventualmente, possam fazer uso deste post