Formatando CNPJ e moeda

Srs,
Esse é o meu primeiro contato com Swing.
Criei a partir do netbeans um formulario com campos que incluem CNPJ e Valores em moeda (R$).
Como eu faço para formatar estes campos durante a digitação ?

Obrigado

da uma olhada no Framework SwingBean
http://swingbean.sourceforge.net/

Infelizmente a usando a máscara do SwingBean ainda está apresentando alguns problemas. Eu mexi no código pra consertar, mas ainda não coloquei essa versão on-line. E se vc quer validação durante a digitação. veja esse post que ele vai te ajudar. Eu usei esse componente junto com o SwingBean. O Guerra ainda vai fazer um artigo pra MundaJava explicando como adicionar seus próprios componentes customizados, mas se vc decidir usar o framework e kiser saber como, responde esse post dizendo que tem interesse e eu coloco o código necessário aqui mais tarde, pq ele ta em casa.

Faz favor de colocar o código então, para mim…

Primeiramente vc constroi seu componente como kiser. No meu caso, eu fiz um validador para Real:

[code]/**Classe desenvolvida por Renzo Nuccitelli

  • para fazer validação de valores monetários

  • em Real
    */
    public class TextFieldMoedaReal extends JTextField implements KeyListener {
    private StringBuilder lastValidNumber;
    private int maxDigits=10;

    /**

    • Aceita um BigDecimal com escala 2.
    • Outras escalas não são serão aceitas
    • @param BigDecimal
      */

    public void setNumber(BigDecimal decimal){
    if(decimal.scale()==2&&decimal.unscaledValue().toString().length()<maxDigits){
    lastValidNumber=new StringBuilder(decimal.unscaledValue().toString());
    super.setText(getRealFormat());
    }
    }
    /**Retorna um BigDecimal com o valor encontrando no campo

    • e com escala igual a 2
    • @return BigDecimal
      */
      public BigDecimal getNumber(){
      BigDecimal number;
      if(lastValidNumber.length()==0)
      number=new BigDecimal(“0”);
      else
      number=new BigDecimal(lastValidNumber.toString());
      number.setScale(2);
      return number.divide(new BigDecimal(100));
      }

    /**Aceita valor em centavos.

    • O valor não deve possuir ponto ou vírgula
    • @param String
      */
      public void setText(String number){
      if(isNumber(number)&&number.length()<maxDigits)
      lastValidNumber=new StringBuilder(number);
      else if("".equals(number))
      lastValidNumber=new StringBuilder();
      super.setText(getRealFormat());

    }

    private boolean isNumber(String number){
    for(char c: number.toCharArray()){
    if(!Character.isDigit©)
    return false;
    }
    return true;
    }
    public TextFieldMoedaReal() {
    super();
    this.setCaretPosition(this.getText().length());
    this.addKeyListener(this);
    lastValidNumber=new StringBuilder();
    super.setText(getRealFormat());
    }

    @Override
    public void keyPressed(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {
    if(Character.isDigit(e.getKeyChar())&&lastValidNumber.length()<maxDigits){
    lastValidNumber.append(e.getKeyChar());
    }
    else if(e.getKeyCode()==KeyEvent.VK_BACK_SPACE||e.getKeyCode()==KeyEvent.VK_DELETE){
    if(lastValidNumber.length()>0){
    lastValidNumber.deleteCharAt(lastValidNumber.length()-1);
    }
    }

     super.setText(getRealFormat());
    

    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    private String getRealFormat(){
    if(lastValidNumber.length()==0)
    return “0,00”;
    else if(lastValidNumber.length()==1)
    return “0,0”+lastValidNumber;
    else if(lastValidNumber.length()==2)
    return “0,”+lastValidNumber;
    else
    return buildPrefixSeparatedWithDots()+lastValidNumber.substring(lastValidNumber.length()-2);
    }

    private String buildPrefixSeparatedWithDots(){
    StringBuilder builder=new StringBuilder();
    for(int index=0;index<lastValidNumber.length()-2;++index){
    builder.append(lastValidNumber.charAt(index));
    if((lastValidNumber.length()-index)%3==0&&lastValidNumber.length()-index>5)
    builder.append(".");
    }
    builder.append(’,’);
    return builder.toString();
    }
    public int getMaxDigits() {
    return maxDigits;
    }
    public void setMaxDigits(int maxDigits) {
    this.maxDigits = maxDigits;
    }

}[/code]

Depois vc deve implementar a interface ComponentWraper:

[code]public class TextFieldMoedaRealWrapper implements ComponentWrapper {
private TextFieldMoedaReal textFieldMoedaReal;
private Integer dlu;
private Boolean enable;
private Integer max;
private Boolean focusable;

@Override
public void cleanValue() {
	textFieldMoedaReal.setText("");

}

@Override
public Component getComponent() {
	return textFieldMoedaReal;
}

@Override
public Object getValue() {
	return textFieldMoedaReal.getNumber();
}

@Override
public void initComponent() throws Exception {
	textFieldMoedaReal=new TextFieldMoedaReal();
	if(dlu!=null)
		textFieldMoedaReal.setColumns(dlu);
	if(enable!=null)
		textFieldMoedaReal.setEnabled(enable);
	if(max!=null)
		textFieldMoedaReal.setMaxDigits(max);
	if(focusable!=null)
		textFieldMoedaReal.setFocusable(focusable);

}

@Override
public void setEnable(boolean arg0) {
	this.enable=arg0;

}


@Override
public void setValue(Object arg0) {
	textFieldMoedaReal.setNumber((BigDecimal)arg0);
}

public void setDlu(Integer dlu){
	this.dlu=dlu;
}

public void setMax(Integer max){
	System.out.println(max);
	this.max=max;
}

public void setFocusable(Boolean bool){
	this.focusable=bool;
}

}[/code]

Os métodos com a anotação Override são os que devem ser implementados. Através deles que o SwingBean vai setar e obter valores e tb limpar o formulario. Se vc já utiliza o framework, já tem idéia do que estou falando. Os outros método são as propriedades que vc deseja que sejam configuráveis. Tipo, eu coloquei um setMax para indicar qual o número máximo de digitos no campo. Assim, no XML basta que eu coloque o atributo max=“10” para limitar os digitos em 10. Assim vc pode criar qq atributo de configuraçao que kiser. O método initComponent será chamado quando a interface for construida, setando todos as configurações do XML no component. Nele vc entao seta todas as propriedades que vc criou.
Feito isso, basta então cadastrar a interface no WrapperFactory na inicializacao da sua aplicacao, ou em um bloco estático:

[code]
//registra a interface implementada para o tipo Real do XML
WrapperFactory.registerTypeMapping(“REAL”, TextFieldMoedaRealWrapper.class);

            //qdo encontrar um atributo do tipo BigDecimal, utilizara o tipo Real como Default
	WrapperFactory.registerDefaultType(BigDecimal.class, "REAL");[/code]

Feito isso, agora eu posso utilizar um BigDecimal como atributo de um bean que o programa vai usar meu componente personalizado como padrao, e ainda vai permitir sua configuraçao via XML:

Bean:

[code]@Entity
public class Cliente implements Identifiable {

...

private BigDecimal valorDevido;

}[/code]

XML:

[code]<?xml version="1.0" encoding="UTF-8"?>

	<property name='enderecoResidencial'  />
	<property name='cepResidencial'  label='CEP' mask='#####-###' dlu='40' />
</line>
<line>
	<property name='enderecoComercial'  />
</line>
<line>
	<property name='tel' label='Telefone' mask="(##) ####-####" dlu='66'/>
	<property name='tel2' label='Telefone - 2' mask="(##) ####-####" dlu='66'/>
	<property name='cel' label='Celular' mask="(##) ####-####" dlu='66'/>
</line>
	
<line>
	<property name='nextel' label='Nextel' dlu='66' />
	<property name='telComercial' label='Telefone Comercial' mask="(##) ####-####" dlu='66' />
	<property name='ramal' dlu='66'  />
</line>
<line>	
	<property name='mail'  dlu='110'/>
</line>
<line>
	<property name='anotacao' label='Anotações' type='LARGE_TEXT'  />
</line>

[/code]

A Tela exemplo coloquei de anexo. Se nao entendeu, ja deve estar saindo o artigo do Guerra na MundoJava explicando melhor as coisas.


Valeu, muito legal o código