Duvidas sobre formatação do tipo moeda no jTextField

Pessoal, eu andei procurando nos posts, e em artigos, mais não encontrei uma solução, ou não soube como aplicá-la.
Preciso fazer uma máscara para valores em moeda pro usuário digitar em um jTextField.
Problemas, o MaskFormatter não aceitou valores que não preencham todas as casas, então se tenho 10 casas,
mask = new MaskFormatter("########.##");
e o usuário digitar 9 characteres por exemplo, ela desaparece.
o DecimalFormat, não estou sabendo como aplicar na forma de uma máscara (nem sei se é possível).
Alguém tem alguma sugestão por favor?
Obrigado desde já.

Cara, use um Document em um JTextField.É mais fácil e o controle é total.Exemplo:

[code]
import javax.swing.text.*;
public class MonetarioDocument extends PlainDocument {

public static final int NUMERO_DIGITOS_MAXIMO = 12;

public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {

String texto = getText(0, getLength());
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (!Character.isDigit©) {
return;
}
}

if(texto.length() < this.NUMERO_DIGITOS_MAXIMO){
super.remove(0, getLength());
texto = texto.replace(".", “”).replace(",", “”);
StringBuffer s = new StringBuffer(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”);
}else if (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);
}
}

public void remove(int offset, int length) throws BadLocationException {
super.remove(offset, length);
String texto = getText(0, getLength());
texto = texto.replace(",", “”);
texto = texto.replace(".", “”);
super.remove(0, getLength());
insertString(0, texto, null);
}

} [/code]
E no seu JTextfield é só fazer:

[code]seuJTextField.getDocument().addDocumentListener(new MonetarioDocument());

Cara não deu certo, ocorreu isso:

C:\Documents and Settings\fly\Meus documentos\netbeans\Gerenciamento_Empresarial\src\Forms\JFramePrincipal.java:43: addDocumentListener(javax.swing.event.DocumentListener) in javax.swing.text.Document cannot be applied to (Forms.MonetarioDocument)
jTextFieldCadastroSalario.getDocument().addDocumentListener(new MonetarioDocument());

Eu criei uma classe com o código que vc postou, e instancie no JFramePrincipal.

Pessoal, já encontrei o problema, eu estava tentando reinventar a roda.
Dei uma lida sobre o jFormattedTextFiel e usei o decimal format, pronto solucionado e simples de usar.
Obrigado a todos.

[quote=Ironlynx]Cara, use um Document em um JTextField.É mais fácil e o controle é total.Exemplo:

[code]
import javax.swing.text.*;
public class MonetarioDocument extends PlainDocument {

public static final int NUMERO_DIGITOS_MAXIMO = 12;

public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {

String texto = getText(0, getLength());
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (!Character.isDigit©) {
return;
}
}

if(texto.length() < this.NUMERO_DIGITOS_MAXIMO){
super.remove(0, getLength());
texto = texto.replace(".", “”).replace(",", “”);
StringBuffer s = new StringBuffer(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”);
}else if (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);
}
}

public void remove(int offset, int length) throws BadLocationException {
super.remove(offset, length);
String texto = getText(0, getLength());
texto = texto.replace(",", “”);
texto = texto.replace(".", “”);
super.remove(0, getLength());
insertString(0, texto, null);
}

} [/code]
E no seu JTextfield é só fazer:

[code]seuJTextField.getDocument().addDocumentListener(new MonetarioDocument());[/quote]

como eu instancio o JTextField com o máximo de casas?

brigado desde de já…

Luis, bem-vindo ao guj!
Não entendi direito, vc quer deixar os números fixo no máximo?(só mexer no insert string) Ou vc quer sempre começar com um valor inicial máximo no JTextField?(só criar um parâmetro no construtor ou dar direto um setText(seu num) no JTextField)

Hum… Entendi, vlw!

Seria bom se o colega que achou a solução a postasse aqui, pois estou com o mesmo problema e não consegui me entender com o JFormattedTextField:

preciso limitar o tamanho de um campo a 8 casas e somente com números e caso o usuário digite algo fora disto, mostrar uma mensagem.

Alguém sabe como fazer ?

Grato !

Amigos,

Implementei o codigo e usei da seguinte forma:

JTextBlabla.setDocument(new MonetarioDocument());
JTextBlabla.setText("0");

Rodou perfeito.

Dario.

Pessoal, funcionar funcionou certinho…
O que eu n entendi é como preparar o valor pra inserir no mysql, por exemplo:

123.456.789,23

precisa ser formatado para : 123456789.23

Obrigado desde já!

Cara utiliza isso que ele vai retornar o valor da String como double

String texto = jTextField1.getText();
texto = texto.replace(".", “”);
texto = texto.replace(",", “.”);

Formatando o valor passado no jTextField

boa noite cara esto tentando utilizar o metodo postado acima mais nao ta dando certo nao.

ele funciona ate aparte de preencher, envia o valor corretamente pro banco de dados mas na hora de recuperar esse valor ele nao volta
oke posso fazer para solucionar esse problema.

eu capturo o valor desse jeito para todos os meus conponentes

			CadAluno.txfValorMensal.setText(ConexaoMySql.resultSet.getString("ValorMensal"));

Boa tarde pessoal.

Sei que o topico é antigo mas estou com o mesmo problema do ultimo post.

utilizei a classe para tratar e enviar o dado para o banco de dados mas na hora de retornar esse valor para a tela ele não aparece

como que posso fazer para atribuir a um textfield o valor retornado do banco de dados usando este document???

Desde ja grato
Alan