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
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
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;
/**
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
/**Aceita valor em centavos.
}
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