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 !!!