Mascara para formato Real em JTextField
Formatando um JTextField para formato Moeda(R$ 0,00)
Formatando em tempo real
Somente crie uma classe com o código abaixo, para inserir esse novo campo, é preciso adicionar a classe na paleta Swing e depois arrastar o componente que esta na paleta para seu JFrame.
;]
- import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.math.BigDecimal;import java.math.BigInteger;import java.text.DecimalFormat;import java.text.NumberFormat;import javax.swing.JFrame;import javax.swing.JTextField;import javax.swing.event.CaretEvent;import javax.swing.event.CaretListener;import javax.swing.text.AttributeSet;import javax.swing.text.BadLocationException;import javax.swing.text.PlainDocument;/*** Campo para a inserção de números com base em um formato.** @author Dyorgio da Silva Nascimento*/public class JNumberFormatField extends JTextField {private static final long serialVersionUID = -7506506392528621022L;private static final NumberFormat MONETARY_FORMAT = new DecimalFormat("R$ #,##0.00");private NumberFormat numberFormat;private int limit = -1;public JNumberFormatField(int casasDecimais) {this(new DecimalFormat((casasDecimais == 0 ? "#,##0" : "#,##0.") + makeZeros(casasDecimais)));}public JNumberFormatField() {this(MONETARY_FORMAT);}public JNumberFormatField(NumberFormat format) {// define o formato do// númeronumberFormat = format;// alinhamento horizontal para o textosetHorizontalAlignment(RIGHT);// documento responsável pela formatação// do camposetDocument(new PlainDocument() {private static final long serialVersionUID = 1L;@Overridepublic void insertString(int offs, String str, AttributeSet a) throws BadLocationException {String text = new StringBuilder(JNumberFormatField.this.getText().replaceAll("[^0-9]", "")).append(str.replaceAll("[^0-9]", "")).toString();super.remove(0, getLength());if (text.isEmpty()) {text = "0";} else {text = new BigInteger(text).toString();}super.insertString(0, numberFormat.format(new BigDecimal(getLimit() > 0 == text.length() > getLimit() ? text.substring(0, getLimit()) : text).divide(new BigDecimal(Math.pow(10, numberFormat.getMaximumFractionDigits())))), a);}@Overridepublic void remove(int offs, int len) throws BadLocationException {super.remove(offs, len);if (len != getLength()) {insertString(0, "", null);}}});// mantem o cursor no final// do campoaddCaretListener(new CaretListener() {boolean update = false;@Overridepublic void caretUpdate(CaretEvent e) {if (!update) {update = true;setCaretPosition(getText().length());update = false;}}});// limpa o campo se// apertar DELETEaddKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {if (e.getKeyCode() == KeyEvent.VK_DELETE) {setText("");}}});// formato// inicialsetText("0");setCaretPosition(getText().length());}/**** Define um valor BigDecimal ao campo**** @param value*/public void setValue(BigDecimal value) {super.setText(numberFormat.format(value));}/**** Recupera um valor BigDecimal do campo**** @return*/public final BigDecimal getValue() {return new BigDecimal(getText().replaceAll("[^0-9]", "")).divide(new BigDecimal(Math.pow(10, numberFormat.getMaximumFractionDigits())));}/**** Recupera o formatador atual do campo**** @return*/public NumberFormat getNumberFormat() {return numberFormat;}/**** Define o formatador do campo** @param numberFormat*/public void setNumberFormat(NumberFormat numberFormat) {this.numberFormat = numberFormat;}/**** Preenche um StringBuilder com zeros** @param zeros*** @return*/private static final String makeZeros(int zeros) {if (zeros >= 0) {StringBuilder builder = new StringBuilder();for (int i = 0; i < zeros; i++) {builder.append('0');}return builder.toString();} else {throw new RuntimeException("Número de casas decimais inválida (" + zeros + ")");}}/**** Recupera o limite do campo.** @return*/public int getLimit() {return limit;}/**** 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*/public void setLimit(int limit) {this.limit = limit;}// testes, pode ser removidopublic static void main(String[] args) {JFrame frame = new JFrame("Teste do campo");frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);frame.setResizable(false);frame.add(new JNumberFormatField(new DecimalFormat("R$ 0.00")) {{// limita a 4// caracteressetLimit(6);}});frame.pack();frame.setLocationRelativeTo(null);frame.setVisible(true);}}
Bom dia.
Muito legal esse campo que criou, mas infelizmente ele não trata quando o valor é negativo né?!
Ótimo desenvolvimento. Sobre o valor negativo dependendo da situação pode ser necessário digitar um valor negativo.
Obrigado por compartilhar o código.
vlw era o que esta precisando
muito obrigdo