Duvida com o enum

14 respostas
M

ola pessoal, estou tentando usar o enum mas estou com problemas …
tenho uma classe onde eu monto todas as mascaras que vou usar no meu sistema …

import java.text.ParseException;
import javax.swing.text.MaskFormatter;
public class Mascara {
public Mascara() {
}
public enum TipoMascara{CGC,CPF,TEL,CEP} ;
public MaskFormatter mascar ;
public MaskFormatter getMascara(TipoMascara tipo) throws ParseException {
switch (tipo) {
case CPF:
mascar = new MaskFormatter("###.###.###-##");
case CEP:
mascar = new MaskFormatter("##.###-###");
case TEL:
mascar = new MaskFormatter("(##)####-####");
case CGC:
mascar = new MaskFormatter("##.###.###/####-##");
}
return mascar;
}
}

dae no meu cadastro, eu chamo essa classe de mascara usando jformatedtextfield da seguinte maneira …

jFormattedTextField1 = new JFormattedTextField( Mascara.TipoMascara.CGC );

mas ao inves de me retornar a mascara de cgc - ("##.###.###/####-##"); - retorna a palavra “CGC” …
o que esta de errado no meu codigo que nao quer aparecer a mascara …

obrigado

14 Respostas

emmanuel.silva

Está certo acontecer isso mesmo, vc está chamando o construtor do componente JFormattedTextField o Enum que vc criou, ele não vai conseguir adivinhar para você qual mascara você quer usar a partir do enum, você precisa chamar o metodo getMascara() que você criou, porque lá vc retorna a mascara de acordo com cada enum ficando assim:

Mascara m = new Mascara();
new JFormattedTextField(m.getMascara(Mascara.TipoMascara.CEP));

Blz…

Acho que é isso…

ViniGodoy

O mais elegante seria você declarar as máscaras dentro do seu enum:

import java.text.ParseException;
import javax.swing.text.MaskFormatter;

public enum Mascara
{
    CGC("##.###.###/####-##"),
    CPF("###.###.###-##"), 
    TEL("(##)####-####"), 
    CEP("##.###-###");

    private String mask;
    
    private Mascara(String mask) {
        this.mask = mask;
    }
    
    public MaskFormatter getMascara() throws ParseException {
        return new MaskFormatter(mask);
    }
}
E na hora de usar, só fazer:
new JFormattedTextField(Mascara.CEP.getMascara());
M

deu certo …
muito obrigado pessoal

Ironlynx

ViniGodoy, taí um excelente uso para Enum!!!
Acabei de refatorar umas 10 classes de máscaras aqui de bobeira… :lol:

ViniGodoy

Gostou?

Então aproveite e dê uma olhada também neste tópico.

M

ola …

surgiu mais um problema com o enum …
ai vai meu codigo …

public enum letras{NONE, UPPER, LOWER} ;
	static letras formata ;

        switch (formata) {
        case NONE:
        	str = str ; //str.trim() ;
        case UPPER:
        	str = str.toUpperCase();
        case LOWER:
        	str = str.toLowerCase();
        }
        System.out.println("fim " + str);

jTextField1.setDocument( new Validacao( Validacao.letras.UPPER ) );

explicando, o que quero fazer no textfield1 passo o parametro que quero, nesse caso, “UPPER”, pra que o que seja digitado fique maiusculo (vejo isso no switch) - mas ele esta passando pelos 3 casos - NONE, UPPER, LOWER - ou seja, sempre vai retornar como lower, por ser o ultimo …

o que eu faco, tentei trocar o switch por if e tambem nao deu certo …

ViniGodoy

Faltou break no seu switch.

switch (formata) { case NONE: str = str ; //str.trim() ; break; case UPPER: str = str.toUpperCase(); break; case LOWER: str = str.toLowerCase(); break; }

Mas, novamente, você está subaproveitando o enum.

Via de regra, fuja do switch!!! Quando possível, use o polimorfismo. Dá uma olhada no link que eu passei ali em cima e vê se consegue refatorar esse seu código.

ViniGodoy

Então, com o código refatorado ficaria assim:

Primeiro, e num letras usando polimorfismo:
public enum Letras {
    NONE {
        @Override public String formata(String texto) {
            return texto;
        }
    }, 
    UPPER {
        @Override public String formata(String texto) {
            return texto.toUpperCase();
        }
    }, 
    LOWER {
        @Override public String formata(String texto) {
            return texto.toLowerCase();
        }
    };
    
    public abstract String formata(String texto);
}
Depois, o local de uso:
static letras formata;

str = formata.formata(str);

jTextField1.setDocument(new Validacao(Validacao.letras.UPPER));

Dá uma olhada no link lá em cima para mais explicações.

M

estou com um problema para definir o tamanho de caracteres digitados num textfield…

usei o seguinte :

if( this.getLength() == total ) {
        	return;
        }

onde “total” eu passo via parametro …
mas tem um problema, defini “total” como 5, se eu digitar “1234” , copiar “123”, e colar, ele deixar colar, nao veta os 5 de tamanho maximo, o que posso fazer pra corrigir isso ??

ViniGodoy

Você tem que usar a interface document, como descrito neste tutorial e implementado neste tópico.

M

mais um problema …
tenho varios textfield …

jTextField1.setDocument( new Validacao(10, Validacao.letras.NONE ) );

jTextField2.setDocument( new Validacao(20, Validacao.letras.UPPER ) );

jTextField3.setDocument( new Validacao(30, Validacao.letras.LOWER ) );

o “10”,“20”,“30” eh o tamanho maximo de caracteres, o “NONE” pra formatar o campo … mas ele esta aceitando apenas o ultimo, ou seja, todos os textfield …

ViniGodoy

Tem cheiro de que algum atributo dentro da sua classe Validacao é estático. Se for, faça-o deixar de ser.

Se não for isso, anexa o código da classe num post aí pra gente dar uma olhada…

M

sobre a ultima duvida deu certo …
estavam mesmo como static, mudei para public e cada textfield ficou com sua devida validacao …

obrigado novamente

M

ola

a mascara deu certo, esta funcionando …
mas ela fica aparecendo assim : " . - " no caso do cep …
tem como mudar os espacos em branco por "" ??
procurei algo sobre " .setPlaceholderCharacter(’
’); " mas nao sei como implementar isso no meu codigo …

Criado 25 de abril de 2007
Ultima resposta 8 de mai. de 2007
Respostas 14
Participantes 4