Uso de la clase Box para diseñar Ventana con campos

Es muy comun tener que diseñar una ventana que contenga varios campos donde el usuario tiene que introducir informacion de diferente tipo, el aspecto de estos campos es similar a los de la imagen que sigue a continuacion:

Este ejemplo muestra como crear una ventana con varios campos ordenados mas o menos con la apariencia anterior. Para hacer esto nos auxiliamos de la clase Box que se encuentra en el paquete javax.swing. El codigo es el siguiente:


/*
 * Crea una ventana de formulario con varios campos  y dos botones abajo
 * Archivo: VentanaFormulario.java
 * Fecha: 9/12/2009
 */

import javax.swing.*;
import java.awt.FlowLayout;

/**
 *
 * @author gonzasilve@gmail.com
 */
public class VentanaFormulario extends JFrame
{
    JLabel jlbMatricula;    JTextField  jtfMatricula;
    JLabel jlbNombre;       JTextField  jtfNombre;
    JLabel jlbApellidos;    JTextField  jtfApellidos;
    JLabel jlbEdad;         JTextField  jtfEdad;
    JLabel jlbSexo;         JComboBox   jcbSexo;
    JButton btnGuardar;
    JButton btnCancelar;
    Box boxVCamposVentana;   //Contiene todo los campos de texto (con su respectiva etiqueta)
    JPanel panBotones;      //Contiene los botones Guardary Cancelar

    VentanaFormulario(String strTitulo, int intAncho, int intAlto)
    {
        super(strTitulo);
        setSize(intAncho, intAlto);
        this.setLocationRelativeTo(null);       //Centrar ventana en pantalla

        //Box vertical por que los botones van a estar abajo
        Box boxVContenidoVerticalVentana = Box.createVerticalBox();
        crearCamposVentana();
        crearBotones();
        //Espacio del borde superior de la ventana al primer Campo
        boxVContenidoVerticalVentana.add(Box.createVerticalStrut(30));
        boxVContenidoVerticalVentana.add(boxVCamposVentana);
        //Espacio entre el ultimo campo (sexo) y los botones Guardar y Cancelar
        boxVContenidoVerticalVentana.add(Box.createVerticalStrut(20));
        boxVContenidoVerticalVentana.add(panBotones);

        add(boxVContenidoVerticalVentana);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void crearCamposVentana()
    {
        Box boxHMatricula =  Box.createHorizontalBox();
        jlbMatricula = new JLabel("Matricula ");   jtfMatricula = new JTextField(15);
        boxHMatricula.add(Box.createHorizontalStrut(10));
        boxHMatricula.add(jlbMatricula);
        boxHMatricula.add(Box.createHorizontalStrut(14));
        boxHMatricula.add(jtfMatricula);
        JPanel panMatricula =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panMatricula.add(boxHMatricula);

        Box boxHNombre =  Box.createHorizontalBox();
        jlbNombre = new JLabel("Nombre ");   jtfNombre = new JTextField(15);
        boxHNombre.add(Box.createHorizontalStrut(10));
        boxHNombre.add(jlbNombre);
        boxHNombre.add(Box.createHorizontalStrut(20));
        boxHNombre.add(jtfNombre);
        JPanel panNombre =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panNombre.add(boxHNombre);

        Box boxHApellidos =  Box.createHorizontalBox();
        jlbApellidos = new JLabel("Apellidos ");   jtfApellidos = new JTextField(15);
        boxHApellidos.add(Box.createHorizontalStrut(10));
        boxHApellidos.add(jlbApellidos);
        boxHApellidos.add(Box.createHorizontalStrut(11));
        boxHApellidos.add(jtfApellidos);
        JPanel panApellidos =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panApellidos.add(boxHApellidos);

        Box boxHEdad =  Box.createHorizontalBox();
        jlbEdad = new JLabel("Edad ");   jtfEdad = new JTextField(15);
        boxHEdad.add(Box.createHorizontalStrut(10));
        boxHEdad.add(jlbEdad);
        boxHEdad.add(Box.createHorizontalStrut(40));
        boxHEdad.add(jtfEdad);
        JPanel panEdad =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panEdad.add(boxHEdad);

        Box boxHSexo =  Box.createHorizontalBox();
        jlbSexo = new JLabel("Sexo ");   jcbSexo = new JComboBox();
        jcbSexo.addItem("Masculino");
        jcbSexo.addItem("Femenino");
        boxHSexo.add(Box.createHorizontalStrut(10));
        boxHSexo.add(jlbSexo);
        boxHSexo.add(Box.createHorizontalStrut(40));
        boxHSexo.add(jcbSexo);
        JPanel panSexo =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panSexo.add(boxHSexo);

        boxVCamposVentana = Box.createVerticalBox();
        boxVCamposVentana.add(panMatricula);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panNombre);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panApellidos);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panEdad);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panSexo);
    }

    private void crearBotones()
    {
        Box boxHBotones = Box.createHorizontalBox();

        btnGuardar = new JButton("Guardar");
        btnCancelar = new JButton("Cancelar");
        boxHBotones.add(btnGuardar);
        boxHBotones.add(Box.createHorizontalStrut(20));
        boxHBotones.add(btnCancelar);
        boxHBotones.add(Box.createHorizontalStrut(40));

        panBotones =  new JPanel(new FlowLayout(FlowLayout.RIGHT) );
        panBotones.add(boxHBotones);
    }

    private void mostrar()
    {
        this.setVisible(true);
    }

    public static void main(String args[])
    {
        VentanaFormulario formulario1 = new VentanaFormulario("Ventana de formulario",400,400);
        formulario1.mostrar();
    }
}

La ejecucion de este codigo crea la siguiente ventana:

Bueno voi a explicar a grandes rasgos como funciona el codigo, las primeras dos lineas:


import javax.swing.*;
import java.awt.FlowLayout;

Permiten importar todas las clases del paquete swing, no es recomendable usar el asterisco por que importa todas las clases de ese paquete, pero por cuestiones de brevedad en el codigo lo he hecho. La clase FlowLayout esta en el paquete awt, por eso se importa a nuestra prueba aparte.

Como se puede ver en la linea:


public class VentanaFormulario extends JFrame

Nuestra clase extiende de la clase JFrame que se encuentra en el paquete swing. Despues de la declaracion de clase se declaran algunas variables :


    JLabel jlbMatricula;    JTextField  jtfMatricula;
    JLabel jlbNombre;       JTextField  jtfNombre;
    JLabel jlbApellidos;    JTextField  jtfApellidos;
    JLabel jlbEdad;         JTextField  jtfEdad;
    JLabel jlbSexo;         JComboBox   jcbSexo;
    JButton btnGuardar;
    JButton btnCancelar;
    Box boxVCamposVentana;   //Contiene todo los campos de texto (con su respectiva etiqueta)
    JPanel panBotones;      //Contiene los botones Guardary Cancelar

Como se puede por cada declaracion de JLabel hay un JTextField (Antes de cada caja de texto hay un texto descriptivo de que es lo que debe escribir ahi el usuario). En estas lineas tambien se declaran las variables para crear dos botones (Aceptar y Cancelar). La variable boxVCamposVentana va a contener todos los campos de texto JTextField, es decir, va a quedar como encerrados en un Box. Las clase Box es como una especie de contenedor (Container) que organiza los elementos que contiene en forma Vertical o forma Horizontal. Los componentes se ven algo asi, si el box es vertical:

y si el Box es horizontal se ve algo asi:

Los elementos cuando se van agregando a un box se alinean al centro. En el codigo anterio tambien se declaro un JPanel para contener a los botones Guardar y Cancelar. En esta prueba hacemos uso de varios Box para organizar todos los componentes adecuadamente en la ventana del JFrame. La forma en general como se van a organizar los componentescon contenedores Box, es la siguiente:

Box1 se agrega al JFrame con el metodo add, Box2 contendra los campos de texto y Box3 contendra los botones que estaran abajo en forma Horizontal, como se ve Box1 contiene a Box2 y Box3. Un Box puede contener cualquier numero de Box.
El siguiente codigo que sigue es el constructor de la clase:


 VentanaFormulario(String strTitulo, int intAncho, int intAlto)
    {
        super(strTitulo);
        this.setSize(intAncho, intAlto);
        this.setLocationRelativeTo(null);       //Centrar ventana en pantalla

        //Box vertical por que los botones van a estar abajo
        Box boxVContenidoVerticalVentana = Box.createVerticalBox();
        crearCamposVentana();
        crearBotones();
        //Espacio del borde superior de la ventana al primer Campo
        boxVContenidoVerticalVentana.add(Box.createVerticalStrut(30));
        boxVContenidoVerticalVentana.add(boxVCamposVentana);
        //Espacio entre el ultimo campo (sexo) y los botones Guardar y Cancelar
        boxVContenidoVerticalVentana.add(Box.createVerticalStrut(20));
        boxVContenidoVerticalVentana.add(panBotones);

        this.add(boxVContenidoVerticalVentana);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

La linea 3 establece el titulo de la ventana padre (esta clase extiende de JFrame, por lo tanto establece el titulo del JFrame), la linea 4 establece el tamaño, y la linea 5 posiciona la ventana en el centro de la ventana. El metodo setLocationRelativeTo() permite posicionar este JFrame respecto a otro JFrame, pero si le pasamos null, lo posiciona en el centro de la pantalla. La linea 8 crea el Box1 (boxVContenidoVerticalVentana) , que permite distribuir todo el contenido del JFrame en forma vertical.

En la linea 9 se manda a llamar a un metodo que esta implementado abajo y que se encarga de crear los campos de la ventana y agregarlos al vertical Box2 (boxVCamposVentana). En la linea 10 se manda a llamar a otro metodo que esta implementado abajo y que se encarga de crear los Botones Guardar y cancelar, y los mete en un  Box3 (boxHBotones), en este caso este Box es horizontal, ademas, este Box solo es visible en el metodo crearBotones().

La linea 12 me parece interesante por que permite insertar espacios entre los componentes de un Box; para agregar espacios verticales, se usa el metodo Box.createVerticalStrut(num) , donde num es el numero de espacios que deseamos insertar (realmente son como componentes invisibles, que presisamente sirven para ayudar a distribuir los componentes que si se ven). En nuestro caso insertamos 30 espacios en nuestro primer Box (boxVContenidoVerticalVentana) para que los campos de texto no esten muy pegado al borde de la ventana, despues de los espacios es agregar al Box1 los campos de la ventana que estan en el Box2 (boxVCamposVentana), esto se hace en la linea 13.

A continuacion en la linea 15 agregamos otro pocos espacios para que las cajas de texto no queden muy pegadas con los botones que esta en el Box3. Despues agregamos el Box3 (boxHBotones), el cual a su vez esta metido dentro de un JPanel (panBotones), entonces si agregamos el JPanel,. estaremos metiendo el Box3 en el Box1. Esto se hace en la linea 16.

el metodo crearCamposVentana() crea los campos con su respectiva etiqueta y los agrega al Box2:

    private void crearCamposVentana()
    {
        Box boxHMatricula =  Box.createHorizontalBox();
        jlbMatricula = new JLabel("Matricula ");   jtfMatricula = new JTextField(15);
        boxHMatricula.add(Box.createHorizontalStrut(10));
        boxHMatricula.add(jlbMatricula);
        boxHMatricula.add(Box.createHorizontalStrut(14));
        boxHMatricula.add(jtfMatricula);
        JPanel panMatricula =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panMatricula.add(boxHMatricula);

        Box boxHNombre =  Box.createHorizontalBox();
        jlbNombre = new JLabel("Nombre ");   jtfNombre = new JTextField(15);
        boxHNombre.add(Box.createHorizontalStrut(10));
        boxHNombre.add(jlbNombre);
        boxHNombre.add(Box.createHorizontalStrut(20));
        boxHNombre.add(jtfNombre);
        JPanel panNombre =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panNombre.add(boxHNombre);

        Box boxHApellidos =  Box.createHorizontalBox();
        jlbApellidos = new JLabel("Apellidos ");   jtfApellidos = new JTextField(15);
        boxHApellidos.add(Box.createHorizontalStrut(10));
        boxHApellidos.add(jlbApellidos);
        boxHApellidos.add(Box.createHorizontalStrut(11));
        boxHApellidos.add(jtfApellidos);
        JPanel panApellidos =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panApellidos.add(boxHApellidos);

        Box boxHEdad =  Box.createHorizontalBox();
        jlbEdad = new JLabel("Edad ");   jtfEdad = new JTextField(15);
        boxHEdad.add(Box.createHorizontalStrut(10));
        boxHEdad.add(jlbEdad);
        boxHEdad.add(Box.createHorizontalStrut(40));
        boxHEdad.add(jtfEdad);
        JPanel panEdad =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panEdad.add(boxHEdad);

        Box boxHSexo =  Box.createHorizontalBox();
        jlbSexo = new JLabel("Sexo ");   jcbSexo = new JComboBox();
        jcbSexo.addItem("Masculino");
        jcbSexo.addItem("Femenino");
        boxHSexo.add(Box.createHorizontalStrut(10));
        boxHSexo.add(jlbSexo);
        boxHSexo.add(Box.createHorizontalStrut(40));
        boxHSexo.add(jcbSexo);
        JPanel panSexo =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panSexo.add(boxHSexo);

        boxVCamposVentana = Box.createVerticalBox();
        boxVCamposVentana.add(panMatricula);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panNombre);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panApellidos);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panEdad);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panSexo);
    }

En la linea 3 del codigo anterior se empieza a crear el primer campo con el siguiente codigo:

        Box boxHMatricula =  Box.createHorizontalBox();
        jlbMatricula = new JLabel("Matricula ");   jtfMatricula = new JTextField(15);
        boxHMatricula.add(Box.createHorizontalStrut(10));
        boxHMatricula.add(jlbMatricula);
        boxHMatricula.add(Box.createHorizontalStrut(14));
        boxHMatricula.add(jtfMatricula);
        JPanel panMatricula =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panMatricula.add(boxHMatricula);

Primero que nada (linea 1) creamos un Box Horizontal llamado boxHMatricula, a continuacion en la linea 2 creamos una etiqueta (jlbMatricula) y un campo de texto (jtfMatricula) . Enseguida insertamos 10 espacios en el box para que la etiqueta no este muy pegada al borde izquierdo del JFrame (finalmente ahi va a ir a dar), esto se hace en la linea 3. A continuacion en la linea 4 agregamos la etiqueta al Box, despues en la linea 5 se agregan mas espacios al Box para que la etiqueta no este muy pegada al campo de texto (jtfMatricula) que se agrega en la linea 7, este espacio va variando dependiendo de la etiqueta en los otros campos, lo que se trata es ir alineando los campos de texto en la misma columna dentro del JFrame.

Lo que sigue a continuacion es crear un panel que contendra a este Box, lo que pasa es que si no agregamos este Box dentro de un panel los componentes que contiene (un JLabel y un JTextField) trataran de ocupar todo el espacio dentro del Box, y asi se ven todos feos y mal distribuidos. En la linea 7 se crea este panel con alineacion a izquierda (como ves en la imagen, los campos estan alineados a la izquieda del JFrame. En la linea 8 se agrega el Box (que contiene al JLabel y JTextField) al JPanel y asi estos dos componentes quedan alineados a l izquierda.
Para que quede mas claro, la organizacion de los campos de texto es esta:

Como vemos hay un JLabel y un JTextField que a su vez estan contenidos dentro de un Box y a su vez ese Box esta dentro de un JPanel, y asi para los demas campos, cada uno dentro de un Box y asu vez dentros de un JPanel. A su vez todos los JPanel estan contenidos dentro de un Box Vertical (el Box2) y a su vez ese Box se inserta dentro de otro Box principal (el del contructor de la clase, Box1).
La organizacion del Box3 es la siguiente:

Como se ve, el Box3 esta contenido dentro de un panel que hasta ahora no hay habia mostrado. El codigo que genera el box3 (y los dos botones que contiene) es el siguiente:

    private void crearBotones()
    {
        Box boxHBotones = Box.createHorizontalBox();

        btnGuardar = new JButton("Guardar");
        btnCancelar = new JButton("Cancelar");
        boxHBotones.add(btnGuardar);
        boxHBotones.add(Box.createHorizontalStrut(20));
        boxHBotones.add(btnCancelar);
        boxHBotones.add(Box.createHorizontalStrut(40));

        panBotones =  new JPanel(new FlowLayout(FlowLayout.RIGHT) );
        panBotones.add(boxHBotones);
    }

Como se ve en la linea 3 se crea el Box Horizontal (boxHBotones, este es el Box3) y en la linea 5 y 6 se declaran los botones, en las lineas, en la linea 7 se agrega el boton Guardar al Box3. En la linea 8 insertamos 20 espacios al box (para que los botones esten algo separados entre si.) en la linea 9 se inserta el boton Cancelar al Box3. En la linea 10 se insertan 10 espacios mas al Box. En la linea 12 se crea el JPanel con ALINEACION DERECHA; pues los botones ahora los queremos alineados a la derecha del JFrame. En el Constructor se agrega este JPanel (panBotones) al Box1.

Si quisieramos colocar los botones a la derecha de los campos de texto, tendriamos que hacer algunos ligeros cambios. El codigo seria este:

/*
 * Crea una ventana de formulario con varios campos  y dos botones
 * a la derecha
 * Archivo: VentanaFormulario2.java
 * Fecha: 9/12/2009
 */

import javax.swing.*;
import java.awt.FlowLayout;

/**
 *
 * @author gonzasilve@gmail.com
 */
public class VentanaFormulario2 extends JFrame
{
    JLabel jlbMatricula;    JTextField  jtfMatricula;
    JLabel jlbNombre;       JTextField  jtfNombre;
    JLabel jlbApellidos;    JTextField  jtfApellidos;
    JLabel jlbEdad;         JTextField  jtfEdad;
    JLabel jlbSexo;         JComboBox   jcbSexo;
    JButton btnGuardar;
    JButton btnCancelar;
    Box boxVCamposVentana;   //Contiene todo los campos de texto (con su respectiva etiqueta)
    JPanel panBotones;      //Contiene los botones Guardar y Cancelar

    VentanaFormulario2(String strTitulo, int intAncho, int intAlto)
    {
        super(strTitulo);
        setSize(intAncho, intAlto);
        this.setLocationRelativeTo(null);       //Centrar ventana en pantalla

        //Box Horizontal por que los botones van a la derecha
        Box boxHContenidoHorizontalVentana = Box.createHorizontalBox();
        crearCamposVentana();
        crearBotones();
        boxHContenidoHorizontalVentana.add(boxVCamposVentana);
        //Espacio Horizontal entre los campos y los botones
        boxHContenidoHorizontalVentana.add(Box.createHorizontalStrut(20));
        boxHContenidoHorizontalVentana.add(panBotones);

        add(boxHContenidoHorizontalVentana);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void crearCamposVentana()
    {
        Box boxHMatricula =  Box.createHorizontalBox();
        jlbMatricula = new JLabel("Matricula ");   jtfMatricula = new JTextField(15);
        boxHMatricula.add(Box.createHorizontalStrut(10));
        boxHMatricula.add(jlbMatricula);
        boxHMatricula.add(Box.createHorizontalStrut(14));
        boxHMatricula.add(jtfMatricula);
        JPanel panMatricula =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panMatricula.add(boxHMatricula);

        Box boxHNombre =  Box.createHorizontalBox();
        jlbNombre = new JLabel("Nombre ");   jtfNombre = new JTextField(15);
        boxHNombre.add(Box.createHorizontalStrut(10));
        boxHNombre.add(jlbNombre);
        boxHNombre.add(Box.createHorizontalStrut(20));
        boxHNombre.add(jtfNombre);
        JPanel panNombre =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panNombre.add(boxHNombre);

        Box boxHApellidos =  Box.createHorizontalBox();
        jlbApellidos = new JLabel("Apellidos ");   jtfApellidos = new JTextField(15);
        boxHApellidos.add(Box.createHorizontalStrut(10));
        boxHApellidos.add(jlbApellidos);
        boxHApellidos.add(Box.createHorizontalStrut(11));
        boxHApellidos.add(jtfApellidos);
        JPanel panApellidos =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panApellidos.add(boxHApellidos);

        Box boxHEdad =  Box.createHorizontalBox();
        jlbEdad = new JLabel("Edad ");   jtfEdad = new JTextField(15);
        boxHEdad.add(Box.createHorizontalStrut(10));
        boxHEdad.add(jlbEdad);
        boxHEdad.add(Box.createHorizontalStrut(40));
        boxHEdad.add(jtfEdad);
        JPanel panEdad =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panEdad.add(boxHEdad);

        Box boxHSexo =  Box.createHorizontalBox();
        jlbSexo = new JLabel("Sexo ");   jcbSexo = new JComboBox();
        jcbSexo.addItem("Masculino");
        jcbSexo.addItem("Femenino");
        boxHSexo.add(Box.createHorizontalStrut(10));
        boxHSexo.add(jlbSexo);
        boxHSexo.add(Box.createHorizontalStrut(40));
        boxHSexo.add(jcbSexo);
        JPanel panSexo =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panSexo.add(boxHSexo);

        boxVCamposVentana = Box.createVerticalBox();
        //Espacio entre el borde superior de la ventana y el primer campo
        boxVCamposVentana.add(Box.createVerticalStrut(30));
        boxVCamposVentana.add(panMatricula);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panNombre);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panApellidos);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panEdad);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panSexo);
    }

    private void crearBotones()
    {
        Box boxVBotones = Box.createVerticalBox();

        btnGuardar = new JButton("Guardar ");
        btnCancelar = new JButton("Cancelar");
        //Espacio entre el borde superior de la ventana y el primer campo
        // (Un poco mas abajo que las cajas de texto, estas a estan 30 unidades del borde)
        boxVBotones.add(Box.createVerticalStrut(50));
        boxVBotones.add(btnGuardar);
        boxVBotones.add(Box.createVerticalStrut(10));
        boxVBotones.add(btnCancelar);

        panBotones =  new JPanel(new FlowLayout(FlowLayout.CENTER) );
        panBotones.add(boxVBotones);
    }

    private void mostrar()
    {
        this.setVisible(true);
    }

    public static void main(String args[])
    {
        VentanaFormulario2 formulario1 = new VentanaFormulario2("Ventana de formulario",400,400);
        formulario1.mostrar();
    }
}

Observar los pocos cambios que he realizado; la ejecucion de este codigo genera esta otra ventana:

me despido, hasta pronto.
}

Validar Numero entero en java

Ha veces es necesario comprobar si cierta cadena es un numero o no. Por ejemplo cuando deseamos guardar un dato numerico en una base de datos (campos edad, cantidad, etc), antes de enviarlos a la BD se deben validar para para que el DBMS no nos devuelva error.

El siguiente codigo muestra como validar si en una cadena que llega todos son numeros. Se supone de antemano que a la cadena se le han eliminado espacios al principio y al final.


/*
 Descripcion:
 Contiene un metodo que Valida si una cadena es un numero entero.
 author: gonzasilve@gmail.com
 fecha:  06/12/2009
 archivo CadenaEnteros.java
*/

public class CadenaEnteros
{
 //Devuelve true si en una cadena que llega todos son numeros, false en caso contrario
 public boolean esEntero(String cad)
 {
 for(int i = 0; i<cad.length(); i++)
 if( !Character.isDigit(cad.charAt(i)) )
 return false;

 return true;
 }

 public static void main(String args[])
 {
 CadenaEnteros cadena1 = new CadenaEnteros();
 //Probar con un numero entero valido:   Devuelve true
 System.out.println("\"3432465\" es entero: " + cadena1.esEntero("3432465"));
 //Probar con una cadena invalida:   Devuelve false
 System.out.println("\"34hola\" es entero: " + cadena1.esEntero("34hola"));
 //Probar con una cadena invalida:   Devuelve false
 System.out.println("\"23.5\" es entero: " + cadena1.esEntero("23.5"));
 }
}

Basicamente el metodo recorre la cadena caracter por caracter y comprueba si NO es un digito, si alguno no lo es, devuelve false. Si ninguno fue false llegara la instruccion return true y terminara el metodo.
Ojo, este metodo solo valida NUMERO ENTEROS, los numeros flotantes (con punto decimal) se deben validar con otro metodo. Si se intenta validar un numero flotante con este metodo siempre devolvera false (pues el caracter punto ( . ) no es un digito).

Enseguida se muestra una imagen de la compilacion y ejecucion de la prueba de este metodo en mi sistema Ubuntu.

Aunque la implementacion de esto se puede hacer de muchas formas aqui muestro la manera como se me ocurrio a mi. Es muy util por ejemplo para validar las cadenas introducidas en campos JTextField en una GUI que tenga campos en donde el usuario deba escribir un dato entero.

Espero que le sirva a alguien, hasta pronto.

}

A %d blogueros les gusta esto: