Mascara Campos Decimais

Tenho um JFormattedTextField.

Como posso fazer com que ao digitar no campo ele mesmo faça todo o controle de no máximo 2 casas decimais…

Dei uma pesquisada e vi que preciso usar uma classe estendendo de PlainDocument.

E depois fazer assim:

jFormattedTextField.setDocument(new MeuDocument());

Mas minha dúvida é implementar a classe MeuDocument para ter este comportamento:

Por padrão ser preenchido com “0,00” e conforme o usuário digitar, ir eliminando os zeros a direita para inserir o número digitado

Rodrigo, nesse post o amigo conseguiu resolver o problema dele que é bem parecido com o seu… da uma olhada ai

Abs.

Olá pessoal, sou novo no desevolvimento java se, e sobre esse assunto, casas decimais para um campo JTextfield, gostaria de entender como aplicar.
Peguei o código aqui e joguei numa classe nova. A funcionalidade é perfeita, exatamente o que preciso.
Mas não consegui aplicar no meu programa, para esse recurso aparecer dentro de um JTextfield.
Isso porque não quero usar o JFormattedTextField, porque está dando muito problema, como depois de digitar o valor, não consigo apagar o conteúdo digitado.
Por isso, preciso usar o JTextField.

Que problemas?

Se realmente quer insistir em usar o JTextField, você vai precisar criar um DocumentFilter para formatar números decimais.

Exemplo:

public class DecimalFilter extends DocumentFilter {
	private DecimalFormat decimalFormat;
	
	public DecimalFilter() {
		DecimalFormatSymbols symbols = new DecimalFormatSymbols();
		symbols.setDecimalSeparator(',');
		symbols.setGroupingSeparator('.');
		decimalFormat = new DecimalFormat("#,##0.00", symbols);
	}
	
	@Override
	public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
		StringBuilder sb = new StringBuilder();
		sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
		sb.insert(offset, string);
		if (isValid(sb.toString())) {
			super.insertString(fb, offset, string, attr);
		}
	}

	@Override
	public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
		StringBuilder sb = new StringBuilder();
		sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
		sb.replace(offset, offset + length, text);
		if (isValid(sb.toString())) {
			super.replace(fb, offset, length, text, attrs);
		}
	}

	// Método auxiliar para verificar se a string é um número decimal válido
	private boolean isValid(String text) {
		if (text.isEmpty()) return true;
		try {
			decimalFormat.parse(text);
			return true;
		} catch (Exception e) {
			return false;
		}
	}
}

Aplicando o filtro:

 ((AbstractDocument) meuJTextField.getDocument()).setDocumentFilter(new DecimalFilter());
2 curtidas

Você pode implementar a classe MeuDocument estendendo PlainDocument e sobrescrever o método insertString para controlar a entrada de texto. Inicialize o campo com “0,00” e remova os zeros à direita conforme o usuário digitar:

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class MeuDocument extends PlainDocument {
    @Override
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
        // Verifica se o texto contém apenas números e até duas casas decimais
        if (str != null && str.matches("\\d*\\.?\\d{0,2}")) {
            // Remove os zeros à direita
            str = removeZerosDireita(str);
            // Insere o texto
            super.insertString(offs, str, a);
        }
    }

    private String removeZerosDireita(String str) {
        // Remove os zeros à direita
        while (str.endsWith("0")) {
            str = str.substring(0, str.length() - 1);
        }
        // Remove o ponto decimal se for o último caractere
        if (str.endsWith(".")) {
            str = str.substring(0, str.length() - 1);
        }
        return str;
    }
}