Campo numérico, Dinheiro, Money, etc... [O RETORNO 2!]
21 respostas
dyorgio
Oi pessoal,
com base no sucesso do meu outro tópico (JMoneyField) decidi
colocar um novo campo que pode ser usado como monetario…
esse código é mais maduro e muito mais personalizavel
aproveitem, comentem, e melhorem!!!
// Pacote aoqual a classe pertencepackageneocode.lib.graphic.field;// Importa as bibilotecas Java necessáriasimportjava.awt.event.KeyAdapter;importjava.awt.event.KeyEvent;importjava.math.BigDecimal;importjava.math.BigInteger;importjava.text.DecimalFormat;importjava.text.NumberFormat;importjavax.swing.JFrame;importjavax.swing.JTextField;importjavax.swing.event.CaretEvent;importjavax.swing.event.CaretListener;importjavax.swing.text.AttributeSet;importjavax.swing.text.BadLocationException;importjavax.swing.text.PlainDocument;/** * Campo para a inserção de números com base em um formato. * * @author Dyorgio da Silva Nascimento */publicclassJNumberFormatFieldextendsJTextField{privatestaticfinallongserialVersionUID=-7506506392528621022L;privatestaticfinalNumberFormatMONETARY_FORMAT=newDecimalFormat("#,##0.00");privateNumberFormatnumberFormat;privateintlimit=-1;publicJNumberFormatField(intcasasDecimais){this(newDecimalFormat((casasDecimais==0?"#,##0":"#,##0.")+makeZeros(casasDecimais)));}publicJNumberFormatField(){this(MONETARY_FORMAT);}publicJNumberFormatField(NumberFormatformat){// define o formato do númeronumberFormat=format;// alinhamento horizontal para o textosetHorizontalAlignment(RIGHT);// documento responsável pela formatação do camposetDocument(newPlainDocument(){privatestaticfinallongserialVersionUID=1L;@OverridepublicvoidinsertString(intoffs,Stringstr,AttributeSeta)throwsBadLocationException{Stringtext=newStringBuilder(JNumberFormatField.this.getText().replaceAll("[^0-9]","")).append(str.replaceAll("[^0-9]","")).toString();super.remove(0,getLength());if(text.isEmpty()){text="0";}else{text=newBigInteger(text).toString();}super.insertString(0,numberFormat.format(newBigDecimal(getLimit()>0&&text.length()>getLimit()?text.substring(0,getLimit()):text).divide(newBigDecimal(Math.pow(10,numberFormat.getMaximumFractionDigits())))),a);}@Overridepublicvoidremove(intoffs,intlen)throwsBadLocationException{super.remove(offs,len);if(len!=getLength()){insertString(0,"",null);}}});// mantem o cursor no final do campoaddCaretListener(newCaretListener(){booleanupdate=false;@OverridepublicvoidcaretUpdate(CaretEvente){if(!update){update=true;setCaretPosition(getText().length());update=false;}}});// limpa o campo se apertar DELETEaddKeyListener(newKeyAdapter(){@OverridepublicvoidkeyPressed(KeyEvente){if(e.getKeyCode()==KeyEvent.VK_DELETE){setText("");}}});// formato inicialsetText("0");setCaretPosition(getText().length());}/** * Define um valor BigDecimal ao campo * * @param value */publicvoidsetValue(BigDecimalvalue){super.setText(numberFormat.format(value));}/** * Recupera um valor BigDecimal do campo * * @return */publicfinalBigDecimalgetValue(){returnnewBigDecimal(getText().replaceAll("[^0-9]","")).divide(newBigDecimal(Math.pow(10,numberFormat.getMaximumFractionDigits())));}/** * Recupera o formatador atual do campo * * @return */publicNumberFormatgetNumberFormat(){returnnumberFormat;}/** * Define o formatador do campo * * @param numberFormat */publicvoidsetNumberFormat(NumberFormatnumberFormat){this.numberFormat=numberFormat;}/** * Preenche um StringBuilder com zeros * * @param zeros * @return */privatestaticfinalStringmakeZeros(intzeros){if(zeros>=0){StringBuilderbuilder=newStringBuilder();for(inti=0;i<zeros;i++){builder.append('0');}returnbuilder.toString();}else{thrownewRuntimeException("Número de casas decimais inválida ("+zeros+")");}}/** * Recupera o limite do campo. * * @return */publicintgetLimit(){returnlimit;}/** * Define o limite do campo, limit < 0 para deixar livre (default) Ignora os pontos e virgulas do formato, conta * somente com os números * * @param limit */publicvoidsetLimit(intlimit){this.limit=limit;}// testes, pode ser removidopublicstaticvoidmain(String[]args){JFrameframe=newJFrame("Teste do campo");frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);frame.setResizable(false);frame.add(newJNumberFormatField(newDecimalFormat("0.000")){{// limita a 4 caracteressetLimit(4);}});frame.pack();frame.setLocationRelativeTo(null);frame.setVisible(true);}}
Quando eu jogo ele no netbeans e tento usar este metodo ao inves do getText ele reclama que não existe
Tem como limitar o tamanho do campo também? tipo quero um campo para CFOP 5.102, teria que ter 3 decimais e caber apenas um inteiro
Dario
dyorgio
O problema é do NetBeans…
remove o componente da paleta, fecha, abre e adiciona denovo
Quanto ao seu problema mudei um pouco o código
para suportar limitações no campo.
Abs,
cardosodario
Quanto ao netbeans ta tranquilo, nem joguei pra paleta
Eu to criando direto como custom code mas eu acho que to fazendo errado na hora de querer pegar o valor
To fazendo
valor.getValue() ele diz que não existe este metodo
Criei o objeto no custom code do TextField assim
new JNumberFormatField(new DecimalFormat("0.00")) {
{
setLimit(6);
}
}
Dario
dyorgio
Esse é o seu problema então,
o NetBeans declarou o TextField como
JtextField…
não importa que vc fez um custom com JNumberFormatField,
pro Java o que interessa é o tipo na declaração, e não na instancialização (new).
Adicione o JNumberformatField na paleta ou mude o tipo da variavel
para JNumberformatField, ou em ultimo caso faça um cast
// desse jeito o java enchergará((JNumberFormatField)seuCampoDeTexto).getValue();
e vê se estuda mais o Java, que tal o eclipse?
o NetBeans ta te deixando “por fora” da linguagem creio eu…
Abs,
cardosodario
Entendi,
Quero tentar alterar o codigo para que ele se inicialize assim:
new JNumberFormatField(14,2)
onde 14 eh a quantidade de caracteres que ele pode aceitar incluindo o ponto
e 2 eh o numero de decimais que ele vai ter ja incluso no numero 14
por exemplo (6,2) seria 999.99
Obrigado
Dario
cardosodario
Dyorgio
Parabens,
Consegui implementar o código para meu proposito, alterei apenas as linhas do código abaixo:
new JNumberFormatField() -> ele pega um padrão default
new JNumberFormatField(11) -> ele pega um inteiro com 11 posições
new JNumberFormatField(6,2) -> ele pega um campo fracionario com 6 posições incluindo a virgula e com duas decimais
Obrigadão,
Dario
ps. você já fez um código deste tipo para formatar DATAS onde ele permita que se digite 13/10/77 e ele já complemente ao sair do campo para 13/10/1977 e ainda não deixe sair do campo se a data for invalida?
Dario.
P
parcon
Ola vc tem ai um codigo para resolver este problema:
Como fazer auto-incremento no PostGreSql usando String no campo codigo e preencher com zeros a esquerda
Quanto ao autoincrement o proprio postgreSQL faz isto, é só você criar uma tabela com um campo AUTOINCREMENT
Dario
P
parcon
vc criou uma string e como aplicar nos campos?
Outra coisa é como usar um codigo de um tabela para formar o codigo de outra.
ex.
cad-bairro… tem o campo codigo da cidade, o codigo da cidade for 0000002
o codigo do primeiro bairro sera gerado no momento que eu clicar em gravar como 0000021.
pode me ajudar com isso tambem.
obrigado
dyorgio
Dario, esse seu auto complete é meio arriscado,
no exemplo qeu vc colocou esta certo, pois 77 na nossa época esta mais para a década de 90,
mais se o cara digitar 55?
o correto seria colocar para 2055…já que esta mais para o século 21,
ai o cara preenche a data de nascimento dele e vai pro século 21 haehahehaheahe
o ideal, e que é o mais encontrado por ai, é a digitação da data completa,
ou algo com combos…
Pessoalmente eu prefiro combos, assim vc nem precisa se preocupar com datas inválidas,
da pra colocar o mês em string tb :P, Janeiro, fevereiro
ainda da pra fazer com JSpinner tb…
Abs,
adsadilson
dyorgio:
Oi pessoal,
com base no sucesso do meu outro tópico (JMoneyField) decidi
colocar um novo campo que pode ser usado como monetario...
esse código é mais maduro e muito mais personalizavel :P
aproveitem, comentem, e melhorem!!!
// Pacote aoqual a classe pertencepackageneocode.lib.graphic.field;// Importa as bibilotecas Java necessáriasimportjava.awt.event.KeyAdapter;importjava.awt.event.KeyEvent;importjava.math.BigDecimal;importjava.math.BigInteger;importjava.text.DecimalFormat;importjava.text.NumberFormat;importjavax.swing.JFrame;importjavax.swing.JTextField;importjavax.swing.event.CaretEvent;importjavax.swing.event.CaretListener;importjavax.swing.text.AttributeSet;importjavax.swing.text.BadLocationException;importjavax.swing.text.PlainDocument;/** * Campo para a inserção de números com base em um formato. * * @author Dyorgio da Silva Nascimento */publicclassJNumberFormatFieldextendsJTextField{privatestaticfinallongserialVersionUID=-7506506392528621022L;privatestaticfinalNumberFormatMONETARY_FORMAT=newDecimalFormat("#,##0.00");privateNumberFormatnumberFormat;privateintlimit=-1;publicJNumberFormatField(intcasasDecimais){this(newDecimalFormat((casasDecimais==0?"#,##0":"#,##0.")+makeZeros(casasDecimais)));}publicJNumberFormatField(){this(MONETARY_FORMAT);}publicJNumberFormatField(NumberFormatformat){// define o formato do númeronumberFormat=format;// alinhamento horizontal para o textosetHorizontalAlignment(RIGHT);// documento responsável pela formatação do camposetDocument(newPlainDocument(){privatestaticfinallongserialVersionUID=1L;@OverridepublicvoidinsertString(intoffs,Stringstr,AttributeSeta)throwsBadLocationException{Stringtext=newStringBuilder(JNumberFormatField.this.getText().replaceAll("[^0-9]","")).append(str.replaceAll("[^0-9]","")).toString();super.remove(0,getLength());if(text.isEmpty()){text="0";}else{text=newBigInteger(text).toString();}super.insertString(0,numberFormat.format(newBigDecimal(getLimit()>0&&text.length()>getLimit()?text.substring(0,getLimit()):text).divide(newBigDecimal(Math.pow(10,numberFormat.getMaximumFractionDigits())))),a);}@Overridepublicvoidremove(intoffs,intlen)throwsBadLocationException{super.remove(offs,len);if(len!=getLength()){insertString(0,"",null);}}});// mantem o cursor no final do campoaddCaretListener(newCaretListener(){booleanupdate=false;@OverridepublicvoidcaretUpdate(CaretEvente){if(!update){update=true;setCaretPosition(getText().length());update=false;}}});// limpa o campo se apertar DELETEaddKeyListener(newKeyAdapter(){@OverridepublicvoidkeyPressed(KeyEvente){if(e.getKeyCode()==KeyEvent.VK_DELETE){setText("");}}});// formato inicialsetText("0");setCaretPosition(getText().length());}/** * Define um valor BigDecimal ao campo * * @param value */publicvoidsetValue(BigDecimalvalue){super.setText(numberFormat.format(value));}/** * Recupera um valor BigDecimal do campo * * @return */publicfinalBigDecimalgetValue(){returnnewBigDecimal(getText().replaceAll("[^0-9]","")).divide(newBigDecimal(Math.pow(10,numberFormat.getMaximumFractionDigits())));}/** * Recupera o formatador atual do campo * * @return */publicNumberFormatgetNumberFormat(){returnnumberFormat;}/** * Define o formatador do campo * * @param numberFormat */publicvoidsetNumberFormat(NumberFormatnumberFormat){this.numberFormat=numberFormat;}/** * Preenche um StringBuilder com zeros * * @param zeros * @return */privatestaticfinalStringmakeZeros(intzeros){if(zeros>=0){StringBuilderbuilder=newStringBuilder();for(inti=0;i<zeros;i++){builder.append('0');}returnbuilder.toString();}else{thrownewRuntimeException("Númerodecasasdecimaisinválida("+zeros+")");}}/** * Recupera o limite do campo. * * @return */publicintgetLimit(){returnlimit;}/** * Define o limite do campo, limit < 0 para deixar livre (default) Ignora os pontos e virgulas do formato, conta * somente com os números * * @param limit */publicvoidsetLimit(intlimit){this.limit=limit;}// testes, pode ser removidopublicstaticvoidmain(String[]args){JFrameframe=newJFrame("Testedocampo");frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);frame.setResizable(false);frame.add(newJNumberFormatField(newDecimalFormat("0.000")){{// limita a 4 caracteressetLimit(4);}});frame.pack();frame.setLocationRelativeTo(null);frame.setVisible(true);}}
Boa noite Caro amigo, estou precisando de uma focinha estive olhando essa class sua e achei muito interessante então pensei em usar, mais ai é q ta o problema não estou sabendo usa a sua class será q vc pode me da uma ajuda.
adsadilson
no momento estou usando essa daqui ate q esta atendendo a minha necessidade, mas tem um problema não consigo seta o valor q vem do banco para o campo q recebe essa implementação e infelizmente não sei implementa essa funcionalidade nesse código.
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packageUtil;importjava.text.DecimalFormat;importjava.text.NumberFormat;importjavax.swing.text.AttributeSet;importjavax.swing.text.BadLocationException;importjavax.swing.text.PlainDocument;/** * * @author kelow */publicclassMonetarioDocumentextendsPlainDocument{privatestaticfinalNumberFormatMONETARY_FORMAT=newDecimalFormat("R$ #,##0.00");publicstaticfinalintNUMERO_DIGITOS_MAXIMO=12;@OverridepublicvoidinsertString(intoffs,Stringstr,AttributeSeta)throwsBadLocationException{Stringtexto=getText(0,getLength());for(inti=0;i<str.length();i++){charc=str.charAt(i);if(!Character.isDigit(c)){return;}}if(texto.length()<MonetarioDocument.NUMERO_DIGITOS_MAXIMO){super.remove(0,getLength());texto=texto.replace(".","").replace(",","");StringBuilders=newStringBuilder(texto+str);if(s.length()>0&&s.charAt(0)=='0'){s.deleteCharAt(0);}if(s.length()<3){if(s.length()<1){s.insert(0,"000");}elseif(s.length()<2){s.insert(0,"00");}else{s.insert(0,"0");}}s.insert(s.length()-2,",");if(s.length()>6){s.insert(s.length()-6,".");}if(s.length()>10){s.insert(s.length()-10,".");}super.insertString(0,s.toString(),a);}}@Overridepublicvoidremove(intoffset,intlength)throwsBadLocationException{super.remove(offset,length);Stringtexto=getText(0,getLength());texto=texto.replace(",","");texto=texto.replace(".","");super.remove(0,getLength());insertString(0,texto,null);}}
então para o momento só queria q ele fizer o retorno do banco de dado para o campo. Deste já agradeço a colaboração dos colegas do guj. Um forte abraço a tds.
dyorgio
Opa,
Cara, verifica se quando você esta setando o valor que vem do banco, o mesmo não esta com algum ponto ou virgula,
pois o seguin te trecho do código invalida esse tipo de input:
if(!Character.isDigit(c)){return; }
adsadilson
Bom dia dyorgio, realmente ele vem como Double do banco e percebi q ele invalida agora como eu devo fazer para consegui representa esse valor no JFormattedTextField.
dyorgio
Você tem trescaminhos,
Antes de setar o valor no campo, converte para string porem multiplica antes para não perder casas decimais, por exemplo 1.23 = String.valueOf((int)(1.23*100)) = “123”
Ajustar seu codigo para aceitar os pontos…porem você esta no lugar errado caso esteja buscando ajuste no seu código, aqui é um tópico sobre o codigo postado acima.
Usar o código que esta nesse topico, o mesmo já trabalha com BigDecimal (que possui construtor que aceita double).
GahFlorencio
Galera eu to fazendo um função usando essa classe só que ai acontece o seguinte
A função ta lisa eu vou postar a linha mais ou menos como eu fiz.
public void PegaValor (JNumberFormatField valor)
{
int numero = Integer.valueOf(valor.getValue().toString());
}
na hora de declarar ficaria assim
só que na hora que eu declaro a função da erro como se eu tivesse pondo um outro objeto la alguem me ajuda por favor
W
WagnerH
Boa tarde. Mais de uma ano e esse tópico ainda é muito útil.
Minha duvida é, como alterar este código para que no lugar da vírgula como separador decimal eu coloque um ponto?
Tentei simplesmente alterar o código colocando ponto no lugar de virgula e/ou virgula no lugar de ponto, mas nada da certo.
Preciso do ponto como separador decimal, pois o valor digitado irá para o banco de dados que só aceita ponto e não vírgula.
dyorgio:
Oi pessoal,
com base no sucesso do meu outro tópico (JMoneyField) decidi
colocar um novo campo que pode ser usado como monetario...
esse código é mais maduro e muito mais personalizavel :P
aproveitem, comentem, e melhorem!!!
// Pacote aoqual a classe pertencepackageneocode.lib.graphic.field;// Importa as bibilotecas Java necessáriasimportjava.awt.event.KeyAdapter;importjava.awt.event.KeyEvent;importjava.math.BigDecimal;importjava.math.BigInteger;importjava.text.DecimalFormat;importjava.text.NumberFormat;importjavax.swing.JFrame;importjavax.swing.JTextField;importjavax.swing.event.CaretEvent;importjavax.swing.event.CaretListener;importjavax.swing.text.AttributeSet;importjavax.swing.text.BadLocationException;importjavax.swing.text.PlainDocument;/** * Campo para a inserção de números com base em um formato. * * @author Dyorgio da Silva Nascimento */publicclassJNumberFormatFieldextendsJTextField{privatestaticfinallongserialVersionUID=-7506506392528621022L;privatestaticfinalNumberFormatMONETARY_FORMAT=newDecimalFormat("#,##0.00");privateNumberFormatnumberFormat;privateintlimit=-1;publicJNumberFormatField(intcasasDecimais){this(newDecimalFormat((casasDecimais==0?"#,##0":"#,##0.")+makeZeros(casasDecimais)));}publicJNumberFormatField(){this(MONETARY_FORMAT);}publicJNumberFormatField(NumberFormatformat){// define o formato do númeronumberFormat=format;// alinhamento horizontal para o textosetHorizontalAlignment(RIGHT);// documento responsável pela formatação do camposetDocument(newPlainDocument(){privatestaticfinallongserialVersionUID=1L;@OverridepublicvoidinsertString(intoffs,Stringstr,AttributeSeta)throwsBadLocationException{Stringtext=newStringBuilder(JNumberFormatField.this.getText().replaceAll("[^0-9]","")).append(str.replaceAll("[^0-9]","")).toString();super.remove(0,getLength());if(text.isEmpty()){text="0";}else{text=newBigInteger(text).toString();}super.insertString(0,numberFormat.format(newBigDecimal(getLimit()>0&&text.length()>getLimit()?text.substring(0,getLimit()):text).divide(newBigDecimal(Math.pow(10,numberFormat.getMaximumFractionDigits())))),a);}@Overridepublicvoidremove(intoffs,intlen)throwsBadLocationException{super.remove(offs,len);if(len!=getLength()){insertString(0,"",null);}}});// mantem o cursor no final do campoaddCaretListener(newCaretListener(){booleanupdate=false;@OverridepublicvoidcaretUpdate(CaretEvente){if(!update){update=true;setCaretPosition(getText().length());update=false;}}});// limpa o campo se apertar DELETEaddKeyListener(newKeyAdapter(){@OverridepublicvoidkeyPressed(KeyEvente){if(e.getKeyCode()==KeyEvent.VK_DELETE){setText("");}}});// formato inicialsetText("0");setCaretPosition(getText().length());}/** * Define um valor BigDecimal ao campo * * @param value */publicvoidsetValue(BigDecimalvalue){super.setText(numberFormat.format(value));}/** * Recupera um valor BigDecimal do campo * * @return */publicfinalBigDecimalgetValue(){returnnewBigDecimal(getText().replaceAll("[^0-9]","")).divide(newBigDecimal(Math.pow(10,numberFormat.getMaximumFractionDigits())));}/** * Recupera o formatador atual do campo * * @return */publicNumberFormatgetNumberFormat(){returnnumberFormat;}/** * Define o formatador do campo * * @param numberFormat */publicvoidsetNumberFormat(NumberFormatnumberFormat){this.numberFormat=numberFormat;}/** * Preenche um StringBuilder com zeros * * @param zeros * @return */privatestaticfinalStringmakeZeros(intzeros){if(zeros>=0){StringBuilderbuilder=newStringBuilder();for(inti=0;i<zeros;i++){builder.append('0');}returnbuilder.toString();}else{thrownewRuntimeException("Númerodecasasdecimaisinválida("+zeros+")");}}/** * Recupera o limite do campo. * * @return */publicintgetLimit(){returnlimit;}/** * Define o limite do campo, limit < 0 para deixar livre (default) Ignora os pontos e virgulas do formato, conta * somente com os números * * @param limit */publicvoidsetLimit(intlimit){this.limit=limit;}// testes, pode ser removidopublicstaticvoidmain(String[]args){JFrameframe=newJFrame("Testedocampo");frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);frame.setResizable(false);frame.add(newJNumberFormatField(newDecimalFormat("0.000")){{// limita a 4 caracteressetLimit(4);}});frame.pack();frame.setLocationRelativeTo(null);frame.setVisible(true);}}
S
sidnei.favoreto
Muito bom seu componente, já uso ele há algum tempo, porém estou tendo uma única dificuldade, valor negativos, pelo o que eu testei ele não aceita valores negativos, você tem algum tratamento para esses casos?
Obrigado.
rzenatti
Aceitar números negativos
importjava.awt.event.KeyAdapter;importjava.awt.event.KeyEvent;importjava.math.BigDecimal;importjava.math.BigInteger;importjava.text.DecimalFormat;importjava.text.NumberFormat;importjavax.swing.JFrame;importjavax.swing.JTextField;importjavax.swing.event.CaretEvent;importjavax.swing.event.CaretListener;importjavax.swing.text.AttributeSet;importjavax.swing.text.BadLocationException;importjavax.swing.text.PlainDocument;/** * Campo para a inserção de números com base em um formato. * * @author Dyorgio da Silva Nascimento */publicclassJNumberFormatFieldextendsJTextField{privatestaticfinallongserialVersionUID=-7506506392528621022L;privatestaticfinalNumberFormatMONETARY_FORMAT=newDecimalFormat("R$ #,##0.00");privateNumberFormatnumberFormat;privateintlimit=-1;publicJNumberFormatField(intcasasDecimais){this(newDecimalFormat((casasDecimais==0?"#,##0":"#,##0.")+makeZeros(casasDecimais)));}publicJNumberFormatField(){this(MONETARY_FORMAT);}publicJNumberFormatField(NumberFormatformat){// define o formato do// númeronumberFormat=format;// alinhamento horizontal para o textosetHorizontalAlignment(RIGHT);// documento responsável pela formatação// do camposetDocument(newPlainDocument(){privatestaticfinallongserialVersionUID=1L;@OverridepublicvoidinsertString(intoffs,Stringstr,AttributeSeta)throwsBadLocationException{Stringfirst=(!JNumberFormatField.this.getText().isEmpty())?String.valueOf(JNumberFormatField.this.getText().charAt(0)):"";StringfStr=(!str.isEmpty())?String.valueOf(str.charAt(0)):"";Stringtext=newStringBuilder(JNumberFormatField.this.getText().replaceAll("[^0-9]","")).append(str.replaceAll("[^0-9]","")).toString();super.remove(0,getLength());if(text.isEmpty()){text="0";}else{text=newBigInteger(text).toString();}BigDecimaln=newBigDecimal(getLimit()>0==text.length()>getLimit()?text.substring(0,getLimit()):text).divide(newBigDecimal(Math.pow(10,numberFormat.getMaximumFractionDigits())));if(str.equals("-")||first.equals("-")||fStr.equals("-")){n=n.multiply(newBigDecimal(-1));}super.insertString(0,numberFormat.format(n),a);}@Overridepublicvoidremove(intoffs,intlen)throwsBadLocationException{super.remove(offs,len);if(len!=getLength()){insertString(0,"",null);}}});// mantem o cursor no final// do campoaddCaretListener(newCaretListener(){booleanupdate=false;@OverridepublicvoidcaretUpdate(CaretEvente){if(!update){update=true;setCaretPosition(getText().length());update=false;}}});// limpa o campo se// apertar DELETEaddKeyListener(newKeyAdapter(){@OverridepublicvoidkeyPressed(KeyEvente){if(e.getKeyCode()==KeyEvent.VK_DELETE){setText("");}}});// formato// inicialsetText("0");setCaretPosition(getText().length());}/** * * * Define um valor BigDecimal ao campo** * * @param value */publicvoidsetValue(BigDecimalvalue){super.setText(numberFormat.format(value));}/** * * * Recupera um valor BigDecimal do campo** * * @return */publicfinalBigDecimalgetValue(){Stringfirst=(!getText().isEmpty())?String.valueOf(getText().charAt(0)):"0";BigDecimalvalor=newBigDecimal(getText().replaceAll("[^0-9]","")).divide(newBigDecimal(Math.pow(10,numberFormat.getMaximumFractionDigits())));if(first.equals("-")){valor=valor.multiply(newBigDecimal(-1));}returnvalor;}/** * * * Recupera o formatador atual do campo** * * @return */publicNumberFormatgetNumberFormat(){returnnumberFormat;}/** * * * Define o formatador do campo** @param numberFormat */publicvoidsetNumberFormat(NumberFormatnumberFormat){this.numberFormat=numberFormat;}/** * * * Preenche um StringBuilder com zeros** @param zeros* * * @return */privatestaticfinalStringmakeZeros(intzeros){if(zeros>=0){StringBuilderbuilder=newStringBuilder();for(inti=0;i<zeros;i++){builder.append('0');}returnbuilder.toString();}else{thrownewRuntimeException("Número de casas decimais inválida ("+zeros+")");}}/** * * * Recupera o limite do campo.** @return */publicintgetLimit(){returnlimit;}/** * * * Define o limite do campo, limit < 0 para deixar livre (default) Ignora os * pontos e virgulas do formato, conta* somente com os números** @param * limit */publicvoidsetLimit(intlimit){this.limit=limit;}// testes, pode ser removidopublicstaticvoidmain(String[]args){JFrameframe=newJFrame("Teste do campo");frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);frame.setResizable(false);frame.add(newJNumberFormatField(){{// limita a 4// caracteressetLimit(4);}});frame.pack();frame.setLocationRelativeTo(null);frame.setVisible(true);}}
marcovyski
Pessoal… uma dúvida. Como configuraria um campo que vem do DB para aparecer formatado no JNumberFormatField… tipo…: txtSalarioBase.setText(rs.getString(“cal_salario_base”));