Problema JFormattedTextField

15 respostas
Zeed01

Boa tarde Colegas !

Preciso criar um campo para entrada de valores com duas casas decimais e não estou conseguindo.

Para a entrada de datas utilizei um JFormattedTextField.

Metodo criado que retorna o formato:

public static DefaultFormatterFactory setFormatoData()   
    {   
        MaskFormatter formatoData = null;   
        try    
        {    
            formatoData = new MaskFormatter("##/##/####");   
        }    
        catch (Exception pe) { }   

        DefaultFormatterFactory factory = new DefaultFormatterFactory(ftmData, ftmData);   

        return factory;
    }

Para data funcionou…
Tentei adaptar para o números, como segue, mas não funcionou:

public static DefaultFormatterFactory setFormatoData()   
    {   
       NumberFormatter ftmNumero = null;
        try    
        {    
          ftmNumero = new NumberFormatter(NumberFormat.getPercentInstance());
        }    
        catch (Exception pe) { }   
        DefaultFormatterFactory factory = new DefaultFormatterFactory(ftmNumero, ftmNumero);   
        return factory;
    }

Alguém pode me ajudar ?

Obrigado a todos.

Abraços.

15 Respostas

Juliano_Pedroso_da_S

Segue alguns exemplos de formato de datas..

public DefaultFormatterFactory setFormatoData() {
        MaskFormatter comFoco = null;
        
        try {
            comFoco = new MaskFormatter("##/##/####");
        } catch (ParseException pe) { }
        DefaultFormatterFactory factory = new DefaultFormatterFactory(comFoco, comFoco);
        return factory;
    }
    
    //método para retornar uma máscara para um jFormatedTextField para DDD
    public DefaultFormatterFactory setFormatoDdd() {
        MaskFormatter comFoco = null;
        try {
            comFoco = new MaskFormatter("(##)");
        } catch (ParseException pe) { }
        DefaultFormatterFactory factory = new DefaultFormatterFactory(comFoco, comFoco);
        return factory;
    }
    
    //método para retornar uma máscara para um jFormatedTextField para fone com 8 digitos
    public DefaultFormatterFactory setFormatoFone() {
        MaskFormatter comFoco = null;
        try {
            comFoco = new MaskFormatter("####-####");
        } catch (ParseException pe) { }
        DefaultFormatterFactory factory = new DefaultFormatterFactory(comFoco, comFoco);
        return factory;
    }
    
    //método para retornar uma máscara para um jFormatedTextField para hora com horas e minutos
    public DefaultFormatterFactory setFormatoHora() {
        
        DateFormat f = new SimpleDateFormat("kk:mm");
        
        MaskFormatter comFoco = null;
        try {
            comFoco = new MaskFormatter("##:##");
        } catch (Exception pe) {
            System.out.println("Erro ao Formatar a Hora! -- ControleFormataDatas.java");
        }
        DefaultFormatterFactory factory = new DefaultFormatterFactory(comFoco);
        return factory;
    }
    
    //método para retornar uma data formatada COMUM
    public Date trasformaData(String data){
        DateFormat formataData = new SimpleDateFormat("dd/MM/yyyy");
        try{
            Date d = formataData.parse(data);
            //Compara se a data atual é maior que a data de cadastro
            if (d.compareTo(new Date()) &gt 0 ){
                //  JOptionPane.showMessageDialog(this.getOwner(), "Data não pode ser maior que a atual!","Atenção!",JOptionPane.WARNING_MESSAGE);
                return null;
            }
            return d;
        }catch(ParseException pex){
            //JOptionPane.showMessageDialog(this.getOwner(), "Data inválida!","Atenção!",JOptionPane.WARNING_MESSAGE);
            return null;
        }
    }
    //Verifica se a Hora é valida e transforma ela em data
    public Date transformaHora(String hora){
        //Seta o formato da hora
        DateFormat formatHora = new SimpleDateFormat("HH:mm");
        
        try {
            //Verifica se a hora inicial e final estão preenchida
            if(!"".equals(hora) || hora == null){
                //Seta o formato da hora inicial e final
                Date horaRes = (Date) formatHora.parse(hora);
                return horaRes;
            }else{
                return null;
            }
            
        } catch (ParseException e) {
            //JOptionPane.showMessageDialog(this.getOwner(), "Hora Inválida!","Atenção!",JOptionPane.WARNING_MESSAGE);
            return null;
        }
    }
    
    public String setStringFormatoData(Date d) {
        String res = null;
        //Seta o formato da data
        DateFormat formatData = new SimpleDateFormat("dd/MM/yyyy");
        
        try {
            res = formatData.format(d);
            return res;
        } catch (IllegalArgumentException arg) {
            return res;
        }
    }
    
    public String setStringFormatoHora(Date d) {
        String res = null;
        //Seta o formato da hora
        DateFormat formatHora = new SimpleDateFormat("HH:mm");
        
        try {
            res = formatHora.format(d);
            return res;
        } catch (IllegalArgumentException arg) {
            return res;
        }
    }
    
    public String setStringFormatoHoraTotal(Float f) {
        String res = null;
        Integer tHora = f.intValue();
        
        try {
            res = new String(tHora.toString());
            if(res.length()&lt4){
                res = "0"+tHora.toString();
                return res;
            }else{
                res = tHora.toString();
                return res;
            }
        } catch (IllegalArgumentException arg) {
            return res;
        }
    }
    
    public Date trasformaDataTotal(Float data){
        DateFormat formataHora = new SimpleDateFormat("hh:MM:ss");
        String res = null;
        Integer tHora = data.intValue();
        
        try{
            res = new String(tHora.toString());
            if(res.length()&lt6){
                res = "0"+tHora.toString();
            }else{
                res = tHora.toString();
            }
            Date d = formataHora.parse(res);
            //Compara se a data atual é maior que a data de cadastro
            if (d.compareTo(new Date()) &gt 0 ){
                //  JOptionPane.showMessageDialog(this.getOwner(), "Data não pode ser maior que a atual!","Atenção!",JOptionPane.WARNING_MESSAGE);
                return null;
            }
            return d;
        }catch(ParseException pex){
            //JOptionPane.showMessageDialog(this.getOwner(), "Data inválida!","Atenção!",JOptionPane.WARNING_MESSAGE);
            return null;
        }
    }
    
    //método para retornar uma data formatada COMUM
    public Date trasformaDataBrasil(Object data){
        Locale brasil = new Locale("pt","BR");
        DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM, brasil);
        String dataBr = df.format(data);
        DateFormat formataData = new SimpleDateFormat("dd/MM/yyyy");
        
        try{
            Date d = formataData.parse(dataBr);
            //Compara se a data atual é maior que a data selecionada
            if (d.compareTo(new Date()) &gt 0 ){
                return null;
            }
            return d;
        }catch(ParseException pex){
            return null;
        }
    }
    
    //método para retornar uma data formatada COMUM
    public boolean comparaData(Date dat1, Date dat2){
        
        try{
            //Compara se a data atual é maior que a data de cadastro
            if (dat1.compareTo(dat2) &gt 0 ){
                return false;
            }
        }catch(IllegalArgumentException e){
            return false;
        }catch(NullPointerException e){
            return false;
        }
        return true;
    }
Zeed01

sodrope:

Inicialmente obrigado pela colaboração.

Mas é que o meu problema é conseguir gerar um formato para entrada de numeros do tipo 99999,99.

Se puder me ajudar agradeço.

Um abraço.

diego2005

Você tem um número máximo de digitos antes da vírgula???

Zeed01

Em alguns casos sim em outros não.

diego2005

Por que se for fixo acho que você pode fazer assim:

JFormattedTextField txt = new JFormattedTextField(getMascara("#########.##"));


public static MaskFormatter getMascara(String mascara) {
    try {
        return new MaskFormatter(mascara);
    } catch(ParseException e) {
        return null;
    }
}

T+

Juliano_Pedroso_da_S

Bom nos casos limitados:

public DefaultFormatterFactory setFormatoNumber() {
         MaskFormatter comFoco = null;
         
         try {
             comFoco = new MaskFormatter("###,##");
         } catch (ParseException pe) { }
         DefaultFormatterFactory factory = new DefaultFormatterFactory(comFoco, comFoco);
         return factory;
     }
Zeed01

Pessoal,

Funcionou mais ou menos…

Porque na hora de digitar nesse campo acontece algumas coisas que eu não queria:
-ele ficou com 3 casas antes da virgula e 2 depois, se eu digito só um número depois da virgula e dou o TAB, o valor some, como se fosse inválido.
-se eu quero digitar só 1 ou 2 números antes da virgula tenho que começar com 0 (Zero), porque não adianta digitar um número e tentar digitar virgula ou ponto para passar para a parte decimal.

Alguém sabe como resolver isso ?

Abraços.

king_of_gods

Cria um metodo que insere no campo 0 antes e depois.

Eu no seu caso trabalharia mesmo com um TextField e um metodo, se o metodo me disse falso, faria o cara digita denovo.
Bem é só uma sugestão.

fabim

Zeed,

vai por mim bro… esquece essa joça ai e faz as validações de entrada com InputVerifier.

A medida que ele for digitando, vc vai completando com a máscara, “/” ou “-” ou “.” sei lá. c faz uma vez e nunca mais esquenta a cabeça com isso.

Zeed01

fabiocsi:

La vai pergunda de calça-branca…

InputVerifier é uma classe da api java ou uma sugestão sua ?

Tem algum exemplo de como implementar isso ?

Veja se eu entendi:

Eu teria uma classe que faria a validação e inserção da máscara de data, telefone, numero, conforme for o caso.

Então em um listener de teclado (não sei qual ainda) eu usaria essa classe para validar e colocar a mascara.

É isso ?

Valeu…

fabim

e por aí mano…

vc vai desenvolver um componente, que vai extender de InputVerifier… e depois só vai colar ele no teu JTextField…

JFormattedTextField é uma disgraça mano to te avisando… se o cara clica no meio do campo e começa a digitar da zica ( é só 1 dos exemplos do probelma de se trabalhar com JFTF )

O inputVerifier vai testar se o conteudo do campo é aceitavel qdo vc trocar de campo… com FocusLost isso nao funfa tb, tu tenta exibir uma JOptionPane com erro no focus lost, ela aparece 4 x DASHduashdASDAUASU

resumindo… usa InputVerifier =D vc vai gastar um tempim a mais, pensar pra fazer direitim, adapatar ele pra receber varios tipos de mascara diferente… c pode declarar dentro dele umas variaveis staticas pra poder passar o tipo exemplo:

seuTextField.setInputVerifier( new SeuInputVerifier( SeuInputVerifier.CPF ) );

http://www.guj.com.br/posts/list/58898.java

fabim

Zeed01:
fabiocsi:

Eu teria uma classe que faria a validação e inserção da máscara de data, telefone, numero, conforme for o caso.

Exato. Mas vc nao precisa “inserir” a mascara, vc “completa” ela no InputVerifier. Ex: se o cara digitar 16/06/2006, ok. se digitar 16062006, vc poe as 2 barras… já um 16/062006 não vale né =D

Zeed01:
fabiocsi:

Então em um listener de teclado (não sei qual ainda) eu usaria essa classe para validar e colocar a mascara.

nao precisa de listener. basta usar o setInputVerifier( InputVerifier )

Zeed01

fabiocsi :

Desculpe o abuso… mas então eu não teria mascara no campo, por exemplo, se for um campo para entrada de data, ele vai aparecer em branco, se o usuário colocar, por exemplo, 25072007, é uma data valida e eu transformo em 25/07/2007, antes de sair do componente, é isso ?

Um abraço !

Zeed01

Fabio:

Esse pacote adm.util.Util é um pacote seu ?

[]s

fabim

sim, é isso mesmo… a nao ser que “nao eu quero de qqer jeito que as barrinhas e os pontinhos e tracinhos aparecam la mesmo qdo o cara noa digitou nada” é bro ai nao tem jeito ai usa JFTF mas com InputVerifier te digo que fica muito mais funcional

sim, é pacote meu mesmo… sry =( tira essa instrução package dai =D

Criado 24 de julho de 2007
Ultima resposta 26 de jul. de 2007
Respostas 15
Participantes 5