[Resolvido] Trabalhando com máscaras

5 respostas
marcos3

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.

5 Respostas

F

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));

marcos3

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?

F

Só usar.

marcos3

fnx, muito obrigado pelo código!

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

F

@marcos3 isso aí.

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

Criado 4 de janeiro de 2017
Ultima resposta 4 de jan. de 2017
Respostas 5
Participantes 2