Foros del Web » Programación para mayores de 30 ;) » Java »

Modificando el formatterFactory del JFormattedTextField en NetBeans

Estas en el tema de Modificando el formatterFactory del JFormattedTextField en NetBeans en el foro de Java en Foros del Web. Hola, amigos ! Soy nuevo en el foro y nuevo en NetBeans y Java. Les comento mi problema: estoy intentando validar el contenido en un ...
  #1 (permalink)  
Antiguo 15/11/2010, 10:38
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 13 años, 5 meses
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 !!!
  #2 (permalink)  
Antiguo 18/11/2010, 11:42
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 13 años, 5 meses
Puntos: 3
Respuesta: Modificando el formatterFactory del JFormattedTextField en NetBeans

Hola de nuevo amigos !
Al final, luego de largos ratos de depuración, descubrí por qué me ignora el método insertString que redefiní. Esto pasa porque cuando se cambia el FormatterFactory, la clase PlainDocument (que es de la cual estoy redefiniendo insertString), no llama a insertString, sino que en su lugar llama a otros dos métodos: insertUpdate y removeUpdate. Por eso me deja ingresar cualquier dato.
De todos modos gracias a todos los que de una forma u otra se preocuparon por esto.
Saludos.

Última edición por tronco020; 18/11/2010 a las 16:06 Razón: Error gramatical

Etiquetas: formatterfactory, jformattedtextfield, netbeans, validar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:02.