Ver Mensaje Individual
  #1 (permalink)  
Antiguo 15/11/2010, 10:38
tronco020
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Pregunta Modificando el formatterFactory del JFormattedTextField en NetBeans

Hola, amigos ! Soy nuevo en el foro y nuevo en NetBeans y Java. Les comento mi problema: estoy intentando validar el contenido en un JFormattedTextField. Tengo el siguiente código:

Código:
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);
                                    }
                                }
                }
        }
    }
}
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.
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 !!!