Un componente en Java con Validaciones incluidas

validatorRobe

Actualmente me he encontrado desarrollando simplemente para la parte de la vista de las aplicaciones hechas en java, por lo cual me es necesario llevar a cabo diferentes validaciones, especialmente en las cajas de texto, tales como son: si el campo es requerido, si un email es correcto, una fecha, un campo de tipo moneda, y hasta un RFC para personas físicas y morales, por lo cual me he dado a la tarea de realizar un componente que extienda de un JTextField pero que ya tenga incluida cierta funcionalidad que me permita realizar las validaciones mediante propiedades de dicho componente.

En esta primera versión solo pondré las validaciones más sencillas, a algunos tal vez les baste con eso pero otros más van a encontrarle más utilidad si se le agrega alguna validación extra o bien si en su trabajo requieren que dicho componente haga algo especial, por lo cual si este es el caso, y varios necesitan lo mismo, basta con comentarlo y en cuanto tenga un poco de tiempo le agregaría la nueva funcionalidad.

Veamos un ejemplo de uso:

/**
 * @(#)PruebaValidator.java
 *
 *
 * @author Roberto León
 * @version 1.00 2010/6/22
 */

import javax.swing.*;
import java.awt.*;
import java.awt.Container;
import java.awt.Dimension;

public class PruebaValidator extends JFrame{

        //para el campo nombre
        private JLabel lblAlertNombre;
        private JLabel lblNombre;
        private JTextFieldValidator txtNombre;

        //para validar la fecha

    private JLabel lblAlertFecha;
    private JLabel lblFecha;
    private JTextFieldValidator txtFecha;

    //para validar correo
    private JLabel lblAlertCorreo;
    private JLabel lblCorreo;
    private JTextFieldValidator txtCorreo;

    //para validar formato moneda
    private JLabel lblAlertMoneda;
    private JLabel lblMoneda;
    private JTextFieldValidator txtMoneda;

    //el boton que se encarga de las validaciones
    private JButtonValidator btnAceptar;
    //el area donde se mostraran los mensjaes
    private JTextArea areaError;

    public PruebaValidator() {
        super("Uso Validador by Robert");
        this.setPreferredSize(new Dimension(250,300));
        this.setVisible(true);
                this.setLayout(null);

                btnAceptar = new JButtonValidator();
                btnAceptar.setBounds(100,240,100,20);
                btnAceptar.setText("Aceptar");
                //indicamos que este boton validara
                //4 campos..
                btnAceptar.setITotalValidaciones(4);

        areaError = new JTextArea();
                areaError.setBounds(0,0,300,100);
        this.add(areaError,null);
        this.add(btnAceptar,null);

                //agregando elemenotos al frame

                lblAlertNombre = new JLabel();
                lblAlertNombre.setBounds(10,120,20,20);
                this.add(lblAlertNombre);

                lblNombre = new JLabel("Nombre:");
                lblNombre.setBounds(30,120,60,20);
                this.add(lblNombre);

                txtNombre = new JTextFieldValidator();
                txtNombre.setBounds(100,120,100,20);
                //Estableciando las propiedades necesarias
                //para validar el campo nombre
                //le decimos que este campo es requerido
                txtNombre.setEsRequerido(true);
                //decimos donde aparecera el mensaje
                //de error en caso de ser invalido este campo
                txtNombre.setTxtErrorArea(areaError);
                //le decimos donde pondremos su iconito de error
        txtNombre.setLblError(lblAlertNombre);
        //le decimos como nombrará a este campo
        txtNombre.setEtiquetaCampo("nombre");
                this.add(txtNombre);

                lblAlertFecha = new JLabel();
                lblAlertFecha.setBounds(10,150,20,20);
                this.add(lblAlertFecha);

                lblFecha = new JLabel("Fecha:");
                lblFecha.setBounds(30,150,60,20);
                this.add(lblFecha);

                txtFecha = new JTextFieldValidator();
                txtFecha.setBounds(100,150,100,20);
                //Le indicamos que queremos que valida
                //una fecha
                txtFecha.setFormatoRequerido(txtFecha.IFECHA);
                //decimos donde aparecera el mensaje
                //de error en caso de ser invalido este campo
                txtFecha.setTxtErrorArea(areaError);
                //le decimos donde pondremos su iconito de error
        txtFecha.setLblError(lblAlertFecha);
        //le decimos como nombrará a este campo
        txtFecha.setEtiquetaCampo("fecha");
                this.add(txtFecha);

                lblAlertCorreo = new JLabel();
                lblAlertCorreo.setBounds(10,180,20,20);
                this.add(lblAlertCorreo);

                lblCorreo = new JLabel("Correo:");
                lblCorreo.setBounds(30,180,60,20);
                this.add(lblCorreo);

                txtCorreo = new JTextFieldValidator();
                txtCorreo.setBounds(100,180,100,20);
                //Le indicamos que queremos que valida
                //en este caso un correo
                txtCorreo.setFormatoRequerido(txtFecha.IEMAIL);
                //decimos donde aparecera el mensaje
                //de error en caso de ser invalido este campo
                txtCorreo.setTxtErrorArea(areaError);
                //le decimos donde pondremos su iconito de error
        txtCorreo.setLblError(lblAlertCorreo);
        //le decimos como nombrará a este campo
        txtCorreo.setEtiquetaCampo("correo");
                this.add(txtCorreo);

                lblAlertMoneda = new JLabel();
                lblAlertMoneda.setBounds(10,210,20,20);
                this.add(lblAlertMoneda);

                lblMoneda = new JLabel("Moneda:");
                lblMoneda.setBounds(30,210,60,20);
                this.add(lblMoneda);

                txtMoneda = new JTextFieldValidator();
                txtMoneda.setBounds(100,210,100,20);
                //Le indicamos que queremos que valida
                //en este caso valide pesos $000.00
                txtMoneda.setFormatoRequerido(txtFecha.IMONEDA);
                //decimos donde aparecera el mensaje
                //de error en caso de ser invalido este campo
                txtMoneda.setTxtErrorArea(areaError);
                //le decimos donde pondremos su iconito de error
        txtMoneda.setLblError(lblAlertMoneda);
        //le decimos como nombrará a este campo
        txtMoneda.setEtiquetaCampo("moneda");
                this.add(txtMoneda);

        //le indicamos el boton que validara los campos
        txtNombre.setBtnTriggerComponent(btnAceptar);
        txtFecha.setBtnTriggerComponent(btnAceptar);
        txtCorreo.setBtnTriggerComponent(btnAceptar);
        txtMoneda.setBtnTriggerComponent(btnAceptar);

        this.pack();
    }

    public static void main(String args[]){
        new PruebaValidator();
    }
}

En la imagen del inicio de este post vimos como nos muestra un alert y un mensaje cuando los campos a validar estan incorrectos y una vez que dichos campos se han llenado correctamente el mismo borra tanto las etiquetas de alerta como los mensajes de error, veamos el mismo ejemplo con datos correctos:

validatorRobeok

En este ejemplo solo se ven 4 de 8 validaciones posibles que hace este Validador, comenta si te intereza y si te gustaria obtener las clases de dicho componente.

Si quieres obtenerlo comenta ya sea aqui o en mi blog personal... espero les intereze..

Fuente: http://robertoleon.com.mx/un-componente-en-java-con-validaciones-incluidas/

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

JSR303

JSR 303 define anotaciones para validaciones de datos en beans, pero es algo muy abstracto aún, pues solamente se definen las anotaciones. Hasta donde sé, solamente Hibernate está a punto (o parece que apenas liberaron la semana pasada) un mecanismo de validación utilizando estas anotaciones (antes usaban sus propias anotaciones). Tu proyecto podría ser el segundo y estaría muy interesante que validaras las mismas anotaciones, primero porque estás implementando un estándar de Java (que siempre son abstractos) y segundo porque se puede usar tu proyecto en conjunto con Hibernate; hago un objeto, le pongo anotaciones en las propiedades que quiero validar, y entonces si lo edito en la interfaz gráfica Swing con tu proyecto me salen ahi mismo las validaciones y además al momento de guardar también se procesan esas validaciones, lo cual es muy útil si después hago una parte de dicho proyecto en web o un batch en línea de comando, etc. porque Hibernate seguiría aplicando sus validaciones, pero siempre que se use Swing podría presentar errores de inmediato al usuario utilizando tu proyecto.

Está bastante buena tu idea, creo que valdría la pena que le eches un ojo a esto del JSR 303. Y si quieres ofrecer el código fuente de tus clases, te recomiendo que leas acerca de las licencias de software libre para que utilices alguna que te convenga (GPL, LGPL, ASL, etc), y puedes hospedar tu código en Google Code, SourceForge, Tigris, etc etc. Hay varios lugares donde puedes hospedar un proyecto de software libre sin costo para ti y te dan varias ventajas como tu propio web site, un sistema de control de versiones, puedes poner noticias, tienes un foro de soporte, etc.

Imagen de Marce

Genial..

Me parece muy muy bueno tu aporte, en realidad si es necesario tener un componente que te ayude a esas fastidiosas validaciones que muchas veces nos hacen perder algo de tiempo. Me agrada tu idea, muy creativa y si lo llegas a hospedar tu código como dice @ezamudio me encantaría verlo y usarlo :)

Buen aporte

Es muy funcional...para cualquier tipo de proyectos

Saludos!

Imagen de Shadonwk

Gracias

Gracias por los comentarios, la verdad pensaba redistribuirlo directamente desde mi página, sin embargo creo que no es mala idea subirlo a google code, de licencias no entiendo mucho asi que agradeceria sus recomendaciones, quiero algo que sea gratuito y libre de uso y modificacion claro siempre conservando los creditos del autor.

@Zamudio, en cuanto tenga tiempo reviso JRS 303 de momento, asi como esta ahorita es lo que me quito muchas lineas de codigo repetitivo, y como dije, si alguien quiere modificarlo adelante...

Espero que hoy por la noche pueda subir el codigo y lo tendre listo para compartirlo

Saludos.

Imagen de ezamudio

GPL / LGPL / ASL

Tu código lo puedes distribuir como una librería, porque no es un programa completo.

Si usas GPL, solamente se podrá usar en programas GPL, no se puede incluir en aplicaciones comerciales porque estarían violando la licencia.
Si usas LGPL, se puede incluir en aplicaciones comerciales, por ejemplo lo puedo usar yo en un programa que hago para vender empaquetado. Y únicamente estoy obligado a incluir el código de tu librería, junto con cualquier modificación que yo le haya hecho al mismo. Es decir la librería por sí misma sigue bajo los términos de GPL pero no se extiende al resto de mi programa.
Con ASL es algo muy similar a LGPL.

Imagen de Shadonwk

Hola que tal, al fin logre

Hola que tal, al fin logre subir el codigo de este componente a google code. la direccion es esta:

con subversion:
https://code.google.com/p/componentevalidaciones/

con mercurial:
https://code.google.com/p/validatorrobe/

nota: creo que con mercurial no se subio bien, ahi si alguien me echa la mano estaria encantado, con svn ya esta arriba espero les ayude.

Imagen de ezamudio

Control de versiones

Tengo entendido que en Google Code para cada proyecto escoges si quieres Subversion o Mercurial, no puedes usar ambos. Lo que veo aquí son dos proyectos distintos y el ValidatorRobe está vacío su repositorio. Vas a mantener ambos? Cómo vas a sincronizar entre ellos? La única finalidad de duplicar todo es que alguien pueda usar uno u otro sistema de control de versiones? Eso no tiene caso. Si vas a usar subversion, los que quieran el código tendrán que usar subversion. No puedes acomodar los caprichos de otras personas en tu proyecto. Si el segundo proyecto lo creaste solamente para tener lo mismo pero con Mercurial lo que yo te recomiendo es que mejor borres ese proyecto y te quedes solamente con el primero en subversion, que ahí sí veo que ya subiste código. Las discusiones de que si Mercurial es mejor o Subversion es mejor nunca van a terminar, cada uno tiene sus ventajas y si ya tomaste tu decisión, lo mejor es que te quedes usando SVN al menos por un tiempo, hasta que realmente te topes con una limitante que Mercurial te podria resolver y en ese momento ves si migras a Mercurial.

Imagen de Shadonwk

Gracias Zamudio, la verdad

Gracias Zamudio, la verdad si son dos proyectos diferentes.. y como tu dices la idea es borrar uno de los dos, sin embargo en una primera instanci quise subirlo en ambos para ver como funcionaban las dos tecnologias, pero como es evidente con mercurial no pude hacerlo bien, lo intentare despues, y para futuros cambios solo se haran me parece mas facil svn.

Espero tengas la oportunidad de probar y criticar mi codigo. Se que muchas cosas se podrian mejorar, y me gustaria conocer tu punto de vista, y el de todo aquel compañero desarrollador que asi desee darlo, de antemano muchas gracias.

Imagen de 043h68

Script kiddie ?

Bueno, la verdad es que este comment no lo quería hacer pero un twitt de la tarde me obliga.

En resumidas cuentas el código que aquí se publica: ES ROBADO.

Soy de las personas que están en contra de despreciar el trabajo de los todos, y peor robar el trabajo de otros.

El twitt que menciono venia de la cuenta de la misma persona que publica aquí el código (roberto leon), en el twitt anunciaba que había subido el código de sus validaciones, etc., ya hacia tiempo que había leído este post, pero me pareció que no tendría tanta importancia si no se divulgaba el código.

Viendo esto en la tarde me dispuse a bajarlo, cual fue mi sorpresa al encontrar exactamente las clases que utilizo en mi proyecto, clases que desarrollo otro compañero como componentes comunes de validación para unas pantallas que estamos trabajando con swing y lo peor es que ni siquiera nos pertenece el código, lo cual implicaría recursos legales fuertes al comprometer la seguridad de un proyecto tan grande! digo! mínimo una mención para el pobre wei que si se desvelo estudiando y programando no ? :P

Mi horror fue al revisar el código y ver que lo unico que cambia es el nombre de la clase y el nombre del autor ! #EPICFAIL !

El propósito de esto? crear conciencia a la gente que gusta de hacer este tipo de cosas, no es solo un copy/paste lo que están haciendo.

La verdad no tengo nada en contra de roberto, solo que si tengo mucho en contra de gente que realiza este tipo de practicas, despreciando el trabajo de otros.

Saludos !

Imagen de Shadonwk

hola que tal 043h68, si bien

hola que tal 043h68, si bien es cierto este codigo lo utilizamos en el proyecto, realmente no es exactamente el mismo codigo.. te invitaria a que revises el codigo que utilizamos en el proyecto y trates de correrlo de forma unitaria, en algun otro proyecto diferente solo copiando dos clases JTextFieldValidator y JButtonValidator, y si funciona, adelante, borro el codigo que esta en el repo de google, borro esta entrada, y borro la entrada en mi blog. Pero creeme que anque visualmente son iguales(este con el que usamos en el proyecto), detras de todo esto hay mas trabajo de mi parte, saludos...

Ahora bien, esto no es nada nuevo, ni desvelarse haciendo codigo excepcional, creo que cientos de personas, ya han echo lo mismo, inclusive yo ya lo habia echo antes, son solo simplemente expresiones regulares, lo que hago aqui, es unificarlo y compartirlo para evitarle trabajo a las personas que realmente lo quieran usar...

Imagen de 043h68

Script kiddies que renegais de serlo !

Con esto me dices todo:  "si bien es cierto este codigo lo utilizamos en el proyecto".

Estoy muy de acuerdo contigo "realmente no es exactamente el mismo codigo.. ", solo cambian cosas que no afectan el funcionamiento, ejemplo? los comentarios del autor jejejeje, solo que por mas que yo le cambie el logo a windows y le ponga 043h68, lo siento pero no es mío ;).

"Pero creeme que anque visualmente son iguales(este con el que usamos en el proyecto), detras de todo esto hay mas trabajo de mi parte, saludos..." visualmente son iguales pero no son iguales pfff ...

"Ahora bien, esto no es nada nuevo, ni desvelarse haciendo codigo excepcional, creo que cientos de personas, ya han echo lo mismo, inclusive yo ya lo habia echo antes" Que raro que no hayas subido TUS clases ... y que las hayas liberado como codigo libre :S ... siendo que hay cientos de personas bla bla bla...

Mi intención no es que borres algo, la acción no cambiaria, lo que buscaba era que le dieras credito a la gente que SI trabajo en hacerlo y no solo en el copy/paste, es mas, te pido no lo borres...que este post quede en tu historial. :D

Doy por terminada mi participación en este post, en verdad que si insistes en querer creerte y engañar a los demas que es tuyo adelante, espero el autor del codigo comparta tu opinión ;)

Saludos !

Duda

Estoy en un proyecto donde empezamos a usar este tipo de validaciones, mi duda es acerca sobre si este tipo de validaciones soportan clases embedidas

desde mi clase taxPayer tengo una clase embedida direction, pero al parecer a esta clase direcction no le puedo aplicarle el JSR 303, no encontré nada en el manua.

@Embedded
private Direction direction;

Imagen de CuicaJavier

Alguien podría compartir el

Alguien podría compartir el repositorio o el proyecto, en el link que esta en code,google.com no esta vacio u.u

Imagen de Shadonwk

ya no existe, se perdió :(

ya no existe, se perdió :(

Imagen de CuicaJavier

Si se puede ver las clases en

Si se puede ver las clases en Source - Changes. Ahi esta todo el codigo :)
https://code.google.com/p/componentevalidaciones/source/detail?r=2

Validaciones

Me parece muy buen aporte.