Pessoal
Eu estou tentando fazer uma máscara para o meu JTextField para ser um campo onde vai ser entrado um valor monetário.
Criei uma classe que extende PlainDocument. Segue a classe:
class MoedaDocument extends PlainDocument{
private static final long serialVersionUID = 5091878348512314283L;
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
String texto = getText(0,getLength());
if(texto.length()<10){
remove(0,getLength());
StringBuffer strBuf = new StringBuffer(texto.replaceAll(",","")+str);
for (int i = 0; i < strBuf.length(); i++){
if (!isDigit(strBuf.charAt(i))){
strBuf.deleteCharAt(i);
}
}
//novo
if (strBuf.charAt(0) == '0'){
strBuf.deleteCharAt(0);
}
if(strBuf.length() == 1){
strBuf.insert(0,"0");
strBuf.insert(0,",");
strBuf.insert(0,"0");
}
else if(strBuf.length() == 2){
strBuf.insert(0,",");
strBuf.insert(0,"0");
}
else if(strBuf.length() == 0){
strBuf.insert(0,"0");
strBuf.insert(0,"0");
strBuf.insert(0,",");
strBuf.insert(0,"0");
}
else
strBuf.insert(strBuf.length()-2,",");
super.insertString(0, strBuf.toString(), a);
}
}
}
O método isDigit(char a) devolve true caso o char for numérico.
A máscara ta funcionando perfeitamente. Toda vez que mais um caractere é entrado minha classe varre e atualiza a String para deixar duas casas decimais.
O problema é quando o usuário apaga o último dígito, ou outro qualquer, que faz perder a formatação correta.
Quando um caractere é entrado, minha classe chama o método insertString(…). Qual método é chamado quando o usuário aperta o backspace? Qual método deve fazer o override para tratar esse evento?
Desde já agradeço a ajuda de vocês.