Mascara para Dinheiro

Ola pessoal estou com o seguinte problema
Vejam meu codigo

public static DefaultFormatterFactory setCampoValor() {
MaskFormatter moeda= null;
try{
moeda=new MaskFormatter("###.###,##");
moeda.setValidCharacters(“0123456789”);
moeda.setPlaceholder(" ");
}catch (ParseException el){
el.printStackTrace();

 }
 
 DefaultFormatterFactory fac = new DefaultFormatterFactory(moeda,moeda);
                return fac;
    }

no campo na hora de digitar eu queria que os número começassem da direita para esquerda oq não esta acontencendo agora… eu sei que tem um método setComponetOrietatio más só funciona no JFormattedTextField eu ja uso esse campo o problema que criei este método pq estou usando o NETBEANS… e tb gostaria de ex: digitar o número 12 seguido da virgual 00 só que neste caso ai só consigo digitar o numero inteiro 120.000,00 …alguém pode me ajudar.

Olá araujovirtual

Eu ja passei por esse problema pra trabalhar com moeda no java, e eu nao consegui achar nenhuma solucao que agradace a mim e a meu cliente, entao resolvi pegar um JTextField e fazer ele funcionar do jeito que eu queria, eu nao tenho ele agora, pois estou no meu trabalho, mas assim que chegar em casa, provavelmente depois das 6:30 posso postar ele aqui pra download. eu acho q aqui da pra postar arquivos pra download neh, qq coisa a gnt troca e-mail e eu posso te enviar se vc quizer.

Bom, o componente q eu criei funciona assim, ele tem uma mascara “R$ ___.___.___.___._,”, entao vc consegue trabalhar com valores na casa dos trilhoes sem problema, mais q isso o componente nao suporta devido a limitacao de caracteres, mas vc pode alterar o codigo para aumentar a mascara caso queira a entrada de dados é feita da direita pra esquerda, como vc quer, porem, é necessário digitar os centavos, e o cursor sempre estara posicionado na direita, se vc digitou um numero errado lah no meio do valor, terá q apagar td até chegar no numero errado, nao adianta querer ir com o mouse lah no meio e alterar…
ele possui um método setValor(BigDecimal valor) e getValor() que tbem retorna um BigDecimal, e tbem retorna o valor digitado por extenso, através do método getPorExtenso()…

Se for do seu interesse, posso postar ele pra download…

Até mais…

Simples…

seuFormatTextField.setHorizontalAlignment(JFormattedTextField.RIGHT);

Agora a vírgula, não ficaria estranho esta idéia? E se o usuário quer digitar 0,12? Vai ter que apagar o campo só porque está 12,00? Ou entendi errado…

Ola…então estou usando o NETBEANS,ele é muito chato pq os código fontes são travados… más me manda sim…já estou a 3 dias procurando e não achei nada tb…putz…as vezes fico com vontade de voltar pro DOt net viu…muito mais simples…valeu

Infelizmente, essa é a melhor forma de resolver esse tipo de problema.
Seria muito bom se a API do swing já tivesse essas máscaras/validações específicas(datas, valores monetários) já implementadas… :roll:

blz, tah ai o link pra download do componente
Dicas pra utilizar:
1- quando vc quizer limpar o campo, não faça setText(""), faça setText(“R$ ___.___.___.___._,”).
2 - Para obter o valor digitado pelo usuario, use o método getValor(), que irá te retornar um BigDecimal.
3 - Caso vc esteje buscando um valor em um BD e quer setar esse valor no campo, use o método setValor(BigDecimal valor);
4- Ainda tem o método getPorExtenso(), que retorna uma string com o numero por extenso do valor digitado no componente.

Segue anexo o fonte do componente, vlw pessoal, t+ !

1 curtida

gostei desse seu component que vc criou , estou usando ele… mas assim na minha aplicacao nao preciso do campo tao grande quanto esta o seu…
como posso proceder pra colocar a mascara num tamanho como R$ .,

??

Então pessoal, estive dando uma olhada nesse componente postado.

Também construi um há algum tempo atrás, seu funcionamento é bem diferente deste… não tem essa parte de trancrever o número e o retorno não é BigDecimal e sim double(algo que pretendo ajustar), além do fato de usar document e não uma mascara. O que me permite nao ter a necessidade de colocar as casas decimais caso nao queira (visualmente posso digitar um número inteiro).

Gostaria que dessem uma olhada e caso queiram sugerir ou comentar algo sintam-se a vontade.
PS: foi criado no netbeans e tenho ele adicionado na minha paleta.

Att.
Alcides Liberali

Olá pessoal !!

ixi luzeras, vai dar um pouco de trabalho pra diminuir o tamanho da mascara, sendo que ele vai substituindo os underlines “" pelo numero digitado, e entao o que acontece é q se vc diminuir a mascara ele vai comecar a dar erro na hora de inserir os digitos, pois ele em determinados momentos faz uma varredura nessa mascara "__.___.___.___._,” para inserir o digito digitado, a melhor coisa q vc pode fazer é comecar um novo, e se basear no meu tirando cases do switch, sendo que a sua mascara será menor.

Bom, vamos tentar fazer uma analise intao, nesse meu componente existe o metodo inserirDigito, que verifica os caracteres do componente, e pega o primeiro “" depois do primeiro numero digitado. O seu componente, tera 11 caracteres com essa mascara "R$ .,_” o meu tem 25, entao vc terá que alterar o metodo inserirDigito, para nao verificar posicoes acima de 10, senão vai dar erro de Bad position, tbem existe um metodo apagarDigito, que terá q ser ajustado para a nova mascara, e assim sucessivamente, para todos os metodos da classe.

A minha intenção era fazer um componente pra trabalhar com moeda real, e q atendesse as minhas necessidades, nao pensei em facilitar esse trabalho de escolher uma mascara, por isso vai te dar um pouco de trabalho, mas nao será tao dificil, somente trabalhoso, visto que que quando vc digita um numero, o metodo inserirDigito pega esse numero e insere na ultima posicao do componente (25), e puxa tds os outros digitos uma posicao pra esquerda, e na hora de apagar, apaga o ultimo digito, o da posicao (25), e puxa tds os outros digitos uma posicao pra direita.

Vc só terá que adequar os metodos para varrer os caraceteres da posicao 3 até a 11 ao invés de 25 como faz o meu componete, eu acho que é só isso.

Qq coisa pergunte ai, estarei dando uma olhada no topico de vez enquando…

Vlw t+

Olá liberali, seu componente tbem é bastante util, quando nao ha necessidade de numeros grandes com casa decimal (dinheiro) como no meu caso. Eu tbem tinha feito um assim como o seu, só q ja parei de usar, quando eu preciso usar um componente que só pode entrar numeros eu verifico se o que o cara ta tentando digitar é um digito, e se for eu permito a entrada do dado, senão eu do um consume() no evento, e na hora de obter o valor, eu transformo pro tipo desejado, eu tinha feito um JIntegerField, que retornava um inteiro e um JDoubleField que retornava um double como o seu, mas como só tinha resolvido meu problema parcialmente, abandonei…

Bem lembrado liberali, eu esqueci de comentar sobre add o componente da pallete do netbeans, caso alguem nao saiba basta com esses dois componentes postados, criar um projeto no netbeans copiar essas duas classes pra dentro do projeto, fazer o build e entao ir em Tools -> Pallete manager -> Swing/AWT componentes e adicionar por projeto, entao o componente ira aparecer na paleta de componentes do netbeans, fica joia !!!

Vlw rapaziada t+

olá pessoal
há muito tempo estava atrás de uma classe que validasse a entrada de dados para valores monetários
com a JMoedaRealTextField.java consegui resolver meu problema
Mas ainda estou com um probleminha, como eu faço para “jogar” o valor monetário que retornou do postgres e “jogar” no meu JMoedaRealTextField.java ???
tentei as duas opções abaixo, mas ambas dão erro

JMoedaRealTextField.settext(double que retorna do postgres);
JMoedaRealTextField.setvalue(double que retorna do postgres);
JMoedaRealTextField.settext(string que retorna do postgres);
JMoedaRealTextField.setvalue(string que retorna do postgres);

o campo fica em branco, dai quando clico nele com o botão para poder digitar alguma coisa, aparece o erro :

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: bad position: 25
	at javax.swing.text.JTextComponent.setCaretPosition(Unknown Source)
	at JMoedaRealTextField$2.mouseReleased(JMoedaRealTextField.java:61)
	at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Muito Obrigado