Código:
Estoy "extendiendo" mi clase JImporte2 desde JFormattedTextField. El método setMascara setea las variables con las que voy a trabajar dentro. Luego redefino (Override) el método focusLost para que haga los que yo quiero cuando el componente pierde el foco. El método posComa() me devuelve la posición en la que se encuentra el separador decimal, si es que lo hay. Si no lo hay, devuelve -1. Luego redefino (Override) el método insertString de PlainDocument, donde acepto solamente lo que yo quiero.public class JImporte2 extends JFormattedTextField { private boolean negativo; private int largo; //Variable se setea en el focusLost con el largo de la cadena ingresada private int enteros = 0; //Variable que recibe por parámetro la cantidad máxima de enteros a permitir private int decimales; //Variable que recibe por parámetro la cantidad máxima de decimales a permitir private int cantEnteros; //Variable que va contando la cantidad de enteros ingresados private int cantDecimales; //Variable que va contando la cantidad de decimales ingresados public void setMascara(boolean aceptaNegativo, int cantEnteros, int cantDecimales){ negativo = aceptaNegativo; enteros = cantEnteros; decimales = cantDecimales; } public JImporte2() { this.setHorizontalAlignment(JTextField.RIGHT); this.setDocument(new ImporteDocument()); this.addFocusListener(new ImporteFocusListener()); this.addCaretListener(new CaretListener(){ public void caretUpdate(CaretEvent e) { if (e.getDot() != getText().length() ) { getCaret().setDot(getText().length()); } } }); } private final class ImporteFocusListener extends FocusAdapter{ @Override public void focusLost(FocusEvent e) { if (decimales > 0){ int coma = 0; largo = getText().length(); boolean encuentra = false; while (coma < largo && !encuentra){ if (getText().charAt(coma) == ',') encuentra = true; coma++; } int cont = 0; if (!encuentra) setText(getText() + ","); else while (coma < largo){ coma++; cont++; } while (cont < decimales){ setText(getText() + "0"); cont++; } } } } private final class ImporteDocument extends PlainDocument { private int posComa() throws BadLocationException{ int pos = 0; cantEnteros = 0; cantDecimales = 0; boolean encuentra = false; while (pos < getLength() && !encuentra){ if (this.getText(0, getLength()).charAt(pos) == ',') encuentra = true; cantEnteros++; pos++; } if (encuentra){ int pos2 = pos; while (pos2 < getLength()){ pos2++; cantDecimales++; } return pos; } else return -1; } @Override public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { if (enteros == 0) funcionesPersonalizadas.mostrarError(null, "La máscara aún no ha sido seteada."); else if (str.length() > 1) super.insertString(offs, str, a); else{ String campo = getText(0,getLength()); char tecla = str.charAt(0); if (tecla == '.'){ if (!campo.contains(",") && !campo.equals("") && decimales > 0) super.insertString(offs, ",", a); } else if (tecla == '-'){ if (negativo && !campo.startsWith("-") && !campo.equals("")) super.insertString(0, "-", a); } else if (tecla == '+'){ if (campo.startsWith("-")) super.remove(0, 1); } else if (tecla >= '0' && tecla <= '9'){ int coma = posComa(); if (coma != -1){ if (cantDecimales < decimales) super.insertString(offs, String.valueOf(tecla), a); } else{ if (cantEnteros < enteros) super.insertString(offs, String.valueOf(tecla), a); } } } } } }
Ahora bien, para no hacerla más larga, les comento mi problema. Cuando modifico el formatterFactory en las propiedades del campo, ignora este método insertString que estoy redefiniendo y me permite ingresar cualquier dato. ¿¿¿Por qué pasa esto??? Tengo entendido que el formatterFactory solamente afecta la máscara o formato de salida. Si esto es así, ¿por qué me ignora un método de ingreso de datos?
Por favor, necesito urgante un poco de claridad en el tema. Hace un par de días que me estoy dando la cabeza contra la pared, sin respuesta. Muchas gracias !!!