Formatando CNPJ e moeda

5 respostas
rogeriosantos77

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

5 Respostas

F

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

renzonuccitelli

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.

F

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

renzonuccitelli

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

/**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(c))
				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;
	}
	
}

Depois vc deve implementar a interface ComponentWraper:

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;
	}
}
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:
//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");

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:

@Entity
public class Cliente implements Identifiable<Long> {
	
	...

	private BigDecimal valorDevido;
}

XML:

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

<beanDescriptor>
	<line>
		<property name='nome'  colspan='1' />
		<property name='sobrenome'  colspan='2'/>
	</line>
	<line>
	
		<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>
	

</beanDescriptor>

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

rogeriosantos77

Valeu, muito legal o código

Criado 1 de abril de 2009
Ultima resposta 2 de abr. de 2009
Respostas 5
Participantes 3