Filtrar TextField

8 respostas
Y

Ola galera , então eu queria saber como filtrar um campo para só receber numeros ou so receber letras.Acho que não tem necessidade de postar um codigo aqui pois procurei e até agora não achei nada nada sobre isso. Estou usando o netbeans 7.1.1

Desde ja agradeço

8 Respostas

mateusviccari

existe os campos de texto formatados(JFormattedTextField).
Pesquise sobre eles e sobre suas máscaras.

Y

mateusviccari:
existe os campos de texto formatados(JFormattedTextField).
Pesquise sobre eles e sobre suas máscaras.

Agradeço cara :wink: vo da uma pesquisada aqui no guj mesmo . Eu ja utilizo 3 campos com JFormattedTextField mas 1 fica no formato de data ##/##/#### e outro pra preço #### mas para filtrar os caracteres eu não sabia que usava JFormattedTextField . obgrigado

viniciusalvess

http://www.guj.com.br/articles/29

Y

Neste campo preço abaixo preciso pegar somente os numeros da mask e ignorar o R$ alguem sabe como faço …

txtPreco.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("####")));

preciso dele assim

txtPreco.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("R$####")));

Desde ja agradeço .

mateusviccari

Não aconselho voce usar esse tipo de campo pra trabalhar com valores. Use um componente especifico pra isso.
Tenho um componente que eu fiz baseado em jTextField, voce trabalha direto com variaveis do tipo double através do metodo getValor e setValor. fica bem melhor pra trabalhar.
Segue o exemplo, voce pode editar de acordo com suas necessidades:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package _componentes;

import java.awt.Color;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import javax.swing.JTextField;

public class JPilaField extends JTextField{

    DecimalFormat formato;
    
    private BigDecimal valor;
    
    public JPilaField() {
        valor=new BigDecimal("0");
        aplicarListeners();
        formato=new DecimalFormat("###,##0.00########; -###,##0.00########");
        setValor(0.0);
    }

    public void setFormato(String formato) {
        this.formato=new DecimalFormat(formato);
    }

    public double getValor() {
        return valor.doubleValue();
    }

    public void setValor(double valor) {
        this.valor = new BigDecimal(valor+"");
        setText(formato.format(this.valor.doubleValue()));
    }
    
    private void focoSai(FocusEvent evt) {
        try {
            valor=new BigDecimal(getText().replace(".", "").replaceAll(",", "."));
            setText(formato.format(valor.doubleValue()));
        } catch (Exception ex) {
            setText("Valor inválido");
        }
    }
    
    private void focoEntra(FocusEvent evt) {
        selectAll();
    }
    
    private void aplicarListeners() {
        this.addFocusListener(new FocusListener() {  
  
            @Override  
            public void focusLost(FocusEvent evt) {  
                focoSai(evt);  
            }  
  
            @Override  
            public void focusGained(FocusEvent evt) {  
                focoEntra(evt);  
            }
        });  
  
    }
    
}
Y
mateusviccari:
Não aconselho voce usar esse tipo de campo pra trabalhar com valores. Use um componente especifico pra isso. Tenho um componente que eu fiz baseado em jTextField, voce trabalha direto com variaveis do tipo double através do metodo getValor e setValor. fica bem melhor pra trabalhar. Segue o exemplo:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package _componentes;

import java.awt.Color;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import javax.swing.JTextField;

public class JPilaField extends JTextField{

    DecimalFormat formato;
    
    private BigDecimal valor;
    
    public JPilaField() {
        valor=new BigDecimal("0");
        aplicarListeners();
        formato=new DecimalFormat("###,##0.00########; -###,##0.00########");
        setValor(0.0);
    }

    public void setFormato(String formato) {
        this.formato=new DecimalFormat(formato);
    }

    public double getValor() {
        return valor.doubleValue();
    }

    public void setValor(double valor) {
        this.valor = new BigDecimal(valor+"");
        setText(formato.format(this.valor.doubleValue()));
    }
    
    private void focoSai(FocusEvent evt) {
        try {
            valor=new BigDecimal(getText().replace(".", "").replaceAll(",", "."));
            setText(formato.format(valor.doubleValue()));
        } catch (Exception ex) {
            setText("Valor inválido");
        }
    }
    
    private void focoEntra(FocusEvent evt) {
        selectAll();
    }
    
    private void aplicarListeners() {
        this.addFocusListener(new FocusListener() {  
  
            @Override  
            public void focusLost(FocusEvent evt) {  
                focoSai(evt);  
            }  
  
            @Override  
            public void focusGained(FocusEvent evt) {  
                focoEntra(evt);  
            }
        });  
  
    }
    
}

Agradeço ai mas não entendi o que extamante essa varialvel valor vai fazer .no meu caso eu subistituiria o "formato " por "txtPreço"?esse valor seria só para validar o campo?
Abraços

mateusviccari

Esse código que eu postei é um componente Swing, se tu tentar criar uma classe la no seu netbeans e jogar esse código dentro, e depois criar um JFrame, voce pode arrastar essa classe pra dentro do seu jframe e vai ver que ele vai criar um campo de texto do mesmo jeito que voce arrasta da paleta do netbeans.
A vantagem desse componente é que voce trabalha direto com valores, sem precisar ficar fazendo parseDouble.
O comportamento do componente é o seguinte, voce digita um valor, tanto faz com virgula ou ponto, que quando o foco sair do componente ele vai formatar o valor do componente de acordo com o formato que voce definir no codigo do componente.
Esse valor que aparece ai no componente vai armazenar o valor que esta setado nas instancias de cada componente.
A variavel formato é uma variavel que só é usada pelo componente pra mostrar o preço na tela. mas o valor fica na variavel valor, que é do tipo BigDecimal.
Tu pode até fazer ficar com o R$ na frente, é so alterar esse trecho de codigo deixando assim:

public void setValor(double valor) {
        this.valor = new BigDecimal(valor+"");
        setText("R$ "+formato.format(this.valor.doubleValue()));
    }

private void focoEntra(FocusEvent evt) {
        setText(formato.format(this.valor.doubleValue()));
        selectAll();
    }

Aconselho a voce testar o componente, vai entender melhor o que eu to falando.
Qualquer duvida pede aí.

Y

mateusviccari:
Esse código que eu postei é um componente Swing, se tu tentar criar uma classe la no seu netbeans e jogar esse código dentro, e depois criar um JFrame, voce pode arrastar essa classe pra dentro do seu jframe e vai ver que ele vai criar um campo de texto do mesmo jeito que voce arrasta da paleta do netbeans.
A vantagem desse componente é que voce trabalha direto com valores, sem precisar ficar fazendo parseDouble.
O comportamento do componente é o seguinte, voce digita um valor, tanto faz com virgula ou ponto, que quando o foco sair do componente ele vai formatar o valor do componente de acordo com o formato que voce definir no codigo do componente.
Esse valor que aparece ai no componente vai armazenar o valor que esta setado nas instancias de cada componente.
A variavel formato é uma variavel que só é usada pelo componente pra mostrar o preço na tela. mas o valor fica na variavel valor, que é do tipo BigDecimal.
Tu pode até fazer ficar com o R$ na frente, é so alterar esse trecho de codigo deixando assim:

public void setValor(double valor) {
        this.valor = new BigDecimal(valor+"");
        setText("R$ "+formato.format(this.valor.doubleValue()));
    }

private void focoEntra(FocusEvent evt) {
        setText(formato.format(this.valor.doubleValue()));
        selectAll();
    }

Aconselho a voce testar o componente, vai entender melhor o que eu to falando.
Qualquer duvida pede aí.

Obrigado mesmo pela atenção !! entendi sim o que você disse . Estou no estagio e não posso testar agora pois não tenho o netbeans instalado . Hoje a noite tenho aula e vou verificar isso . obrigado , depois posto se consegui resolver !

Criado 2 de agosto de 2012
Ultima resposta 3 de ago. de 2012
Respostas 8
Participantes 3