Como enviar un email en Java con la API JavaMail

Como enviar un correo electronico con Java usando la API JavaMail. Desde hace tiempo estaba pensado en exponer algo respecto a este tema y por fin me decidi a hacerlo. El ejemplo en si es muy sencillo pero util si lo necesitas usar inmediatamente.

Herramientas que necesitas

Necesitas principalmente dos cosas:

  • Libreria JavaMail.
  • libreria JAF ( JavaBeans Activation Framework ).

Como observas, te e puesto un link a la pagina de descarga de cada libreria, esa es la que he utilizado y que a la fecha me ha funcionado. Lo que debes hacer es bajarte los .zip, poner todos los archivos .jar juntos y agregarlos a la variable de entorno CLASSPATH de tu sistema operativo. Si no te quieres molestar en entrar a la pagina a continuacion yo ya los he bajado y a continuacion te dejo el link de descarga directa de la libreria JavaMail que contiene los JAR: dns.jar, imap.jar, mail.jar, mailapi.jar, pop3.jar, smtp.jar, la libreria JAF contiene un unico jar activation.jar.

Sigamos con lo interesante…

El codigo fuente

A continuacion pego el codigo fuente para el envio de el correo electronico que por cierto es muy corto. Sino fuera por la sencilla GUI que e creado….

/*
	Descripcion: Sencillo ejemplo de como enviar un Email con la libreria JavaMail
			a travez de una interfaz grafica.
	Author: Gonzalo Silverio    gonzasilve@gmail.com
	Archivo:  FrmVentanaMail.java
	Fuente:		https://gonzasilve.wordpress.com/
 **/
 
import javax.swing.*;
import java.awt.*;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import java.util.Properties;

//Para manejo de JavaMail
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class FrmVentanaMail extends JFrame {

	//Para el cuadro de dialogo de Opciones
	JPanel pnlServidor;
	JPanel pnlBotones;
	JPanel pnlRemitente;
	JPanel pnlPasswordRemitente;
	JPanel pnlDestino;
	JPanel pnlAsunto;
	JPanel pnlMensaje;
	
	JLabel lblServidor; 	JTextField jtfServidor;
	
	JLabel lblRemitente; 	JTextField jtfRemitente;	JPasswordField jpfPasswordRemitente;
	JLabel lblDestino; 	JTextField jtfDestino;
	JLabel lblAsunto; 	JTextField jtfAsunto;
	JLabel lblMensaje; 	JTextArea jtaMensaje;
	
	JButton btnEnviar;
	JButton btnCancelar;
	
	public FrmVentanaMail(String strTitulo, int i_ancho, int i_alto ) {
		this.setTitle(strTitulo);
    this.setSize(i_ancho,i_alto);    
    this.setLocationRelativeTo(null);

		this.setResizable(false);
		
		Box boxPrincipal = Box.createVerticalBox();
		crearCamposVentana();
		crearBotones();
		boxPrincipal.add(Box.createVerticalStrut(15));
		boxPrincipal.add(pnlServidor);
		boxPrincipal.add(Box.createVerticalStrut(15));
		boxPrincipal.add(pnlRemitente);
		boxPrincipal.add(Box.createVerticalStrut(15));
		boxPrincipal.add(pnlDestino);
		boxPrincipal.add(Box.createVerticalStrut(15));
		boxPrincipal.add(pnlAsunto);
		boxPrincipal.add(Box.createVerticalStrut(15));
		boxPrincipal.add(pnlMensaje);
		boxPrincipal.add(Box.createVerticalStrut(15));
		boxPrincipal.add(pnlBotones);
		
		add(boxPrincipal);
		
		btnCancelar.addActionListener( new ActionListener() {			
				public void actionPerformed(ActionEvent evt) {
					//dispose();
					System.exit(0);
				}
			}
		);
		
		btnEnviar.addActionListener( new ActionListener() {			
				public void actionPerformed(ActionEvent e) {
					if(enviarEmail() ) {
						JOptionPane.showMessageDialog(null,"Mensaje enviado!");
						jtaMensaje.requestFocus(true);
					} else {
						JOptionPane.showMessageDialog(null,"Por el momento NO SE PUDO ENVIAR el mensaje.");
					}
					
				}			
			}			
		);
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
	}
	
	private void crearCamposVentana() {
		Box boxServidor =  Box.createHorizontalBox();
		lblServidor = new JLabel("Servidor");
		jtfServidor = new JTextField("smtp.gmail.com",15);		
		boxServidor.add(Box.createHorizontalStrut(15));
		boxServidor.add(lblServidor);
		boxServidor.add(Box.createHorizontalStrut(20));
		boxServidor.add(jtfServidor);
		pnlServidor = new JPanel(new FlowLayout(FlowLayout.LEFT));
		pnlServidor.add(boxServidor);
		
		//Remitente
		Box boxRemitente =  Box.createHorizontalBox();
		lblRemitente = new JLabel("<html><font color='#0000FF'>Remitente</font></html>");
		jtfRemitente = new JTextField("gonzasilve@gmail.com",15);
		jpfPasswordRemitente =  new JPasswordField(15);
		jpfPasswordRemitente.setToolTipText("Escriba el password de este remitente");
		boxRemitente.add(Box.createHorizontalStrut(15));
		boxRemitente.add(lblRemitente);
		boxRemitente.add(Box.createHorizontalStrut(20));
		boxRemitente.add(jtfRemitente);
		boxRemitente.add(Box.createHorizontalStrut(5));
		boxRemitente.add(jpfPasswordRemitente);
		pnlRemitente = new JPanel(new FlowLayout(FlowLayout.LEFT));
		pnlRemitente.add(boxRemitente);
	
		//Destino
		Box boxDestino =  Box.createHorizontalBox();
		lblDestino = new JLabel("<html><font color='#0000FF'>Destino</font></html>");
		jtfDestino = new JTextField("gonzasilve@hotmail.com",15);
		jtfDestino.setToolTipText("Puede escribir varios destinatarios separados con coma");
		boxDestino.add(Box.createHorizontalStrut(15));
		boxDestino.add(lblDestino);
		boxDestino.add(Box.createHorizontalStrut(20));
		boxDestino.add(jtfDestino);
		pnlDestino = new JPanel(new FlowLayout(FlowLayout.LEFT));
		pnlDestino.add(boxDestino);			
			
		//Asunto
		Box boxAsunto =  Box.createHorizontalBox();
		lblAsunto = new JLabel("<html><font color='#0000FF'>Asunto</font></html>");
		jtfAsunto = new JTextField("Test JavaMail",15);		
		boxAsunto.add(Box.createHorizontalStrut(15));
		boxAsunto.add(lblAsunto);
		boxAsunto.add(Box.createHorizontalStrut(20));
		boxAsunto.add(jtfAsunto);
		pnlAsunto = new JPanel(new FlowLayout(FlowLayout.LEFT));
		pnlAsunto.add(boxAsunto);		
			
		//Mensaje
		Box boxMensaje =  Box.createHorizontalBox();
		lblMensaje = new JLabel("<html><font color='#0000FF'>Mensaje</font></html>");
		jtaMensaje = new JTextArea("Mensaje desde JavaMail",5,30);
		jtaMensaje.setLineWrap(true);
		JScrollPane jspScrollMsg = new JScrollPane(jtaMensaje);

		jtaMensaje.setAutoscrolls(true);
		boxMensaje.add(Box.createHorizontalStrut(15));
		boxMensaje.add(lblMensaje);
		boxMensaje.add(Box.createHorizontalStrut(20));
		boxMensaje.add(jspScrollMsg);
		pnlMensaje = new JPanel(new FlowLayout(FlowLayout.LEFT));
		pnlMensaje.add(boxMensaje);
	}
	
	private void crearBotones() {
		btnEnviar = new JButton("Enviar email");
		btnCancelar = new JButton("Cancelar");
		Box boxBotones = Box.createHorizontalBox();
		boxBotones.add(btnEnviar);
		boxBotones.add(Box.createHorizontalStrut(25));
		boxBotones.add(btnCancelar);
		boxBotones.add(Box.createHorizontalStrut(25));
		pnlBotones = new JPanel(new FlowLayout(FlowLayout.RIGHT));
		pnlBotones.add(boxBotones);
				
	}
	
	private void mostrar() {
		setVisible(true);
	}
	
	//Devuelve true en caso de que se envie el email de manera correcta, o
	//devuelve false si no se pudo enviar el email
	private boolean enviarEmail() {
    try
    {
        // Propiedades de la conexión
        Properties props = new Properties();
        props.setProperty("mail.smtp.host",  "smtp.gmail.com");
        props.setProperty("mail.smtp.starttls.enable", "true");
        props.setProperty("mail.smtp.port", "587");
        props.setProperty("mail.smtp.auth", "true");

        // Preparamos la sesion
        Session session = Session.getDefaultInstance(props);
				
	//Recoger los datos
	String str_De 		= jtfRemitente.getText();
	String str_PwRemitente 		= jpfPasswordRemitente.getText();				
	String str_Para 	= jtfDestino.getText();
	String str_Asunto = jtfAsunto.getText();
	String str_Mensaje = jtaMensaje.getText();
	//Obtenemos los destinatarios
	String destinos[] = str_Para.split(",");
				
        // Construimos el mensaje
        MimeMessage message = new MimeMessage(session);
        
        message.setFrom(new InternetAddress( str_De ));

	//Otra forma de especificar las direcciones de email 
	//a quienes se enviar el correo electronico
	//Forma 1
        //Address [] receptores = new Address []{
	//      new InternetAddress ("fuerenio@gmail.com"),
	//      new InternetAddress ("gonzasilve@gmail.com")
	//  };
	//Forma 2
	//  Address [] receptores = new Address []{
	//      new InternetAddress ( str_De )
	// };
	//Forma 3
        Address [] receptores = new Address [ destinos.length ];
        int j = 0;
	while(j<destinos.length){					
		receptores[j] = new InternetAddress ( destinos[j] ) ;					
		j++;				
	}

        
        //receptores.
        message.addRecipients(Message.RecipientType.TO, receptores);        
        message.setSubject( str_Asunto );        
        message.setText( str_Mensaje );
            
        // Lo enviamos.
        Transport t = session.getTransport("smtp");
        t.connect(str_De, str_PwRemitente);
        t.sendMessage(message, message.getRecipients(Message.RecipientType.TO));
				
        // Cierre de la conexion.
        t.close();
        return true;
    }
    catch (Exception e)
    {
        e.printStackTrace();
        return false;
    }		
	}
	
	public static void main(String gonzi[]) {
		FrmVentanaMail prueba1 = new FrmVentanaMail("Envio de email con JavaMail", 500, 400);
		prueba1.mostrar();
	}
	
}

En si no hay mucho que explicar, el metodo mas importante de la clase anterior es enviarEmail() pues es el que toma los datos de las cajas de texto y los configura como parametros para JavaMail y envia el mensaje escrito, usando el email remitente a los emails destino. Si observas éste devuelve un valor booleano para poder determinar el mensaje que se le muestra al usuario despues de que pulsa el boton Enviar email.

Pantallas del ejemplo

A continuación la pantalla que se dibuja al ejecutar el código anterior (e rellenado algunos campos):
GUI para enviar email con JavaMail

Si el email se envió correctamente aparece el siguiente mensaje:
Envio exitoso con JavaMail

El email que le llega al email destino es el siguiente:
Email recibido, fue enviado desde JavaMail

En caso de dudas, ó si te gusto el ejemplo te invito a que me dejes un comentario (me motivas a escribir mas). Si gustas tener el codigo por fa, dejame un comentario y te lo envio a la brevedad.

Hasta pronto.

Clase java para recorrer y buscar registros de tabla (de Sql Server, Mysql o Postgres) con botones primero, anterior, siguiente y ultimo.

Clase java para recorrer y buscar registros de tabla de base de datos con botones primero, anterior, siguiente y ultimo. El objetivo de esta entrada de blog es mostrar una clase diseñada por mi para facilitar la navegacion por los registros de una tabla. Se me ocurrio esto debido a que en muchas ocasiones en los programas necesitamos recorrer los registros de una tabla con los tipicos botones:
Primero Permite ir al primer registro de la tabla.
Anterior Permite ir al anterior registro.
Siguiente Permite ir al siguiente registro.
Ultimo Permite ir al ultimo registro.

La siguiente imagen muestra un ejemplo clasico donde se requieren estos botones (los botones con flechas verdes):

Ventana con botones de navegacion de registros.
Ventana con botones de navegacion de registros.

Como se puede imaginar con ayuda de estos botones nos podemos colocar en cualquier registro de la tabla y una vez posicionados en el registro deseado se pueden usar otros botones para modificar o eliminar el registro. Bueno sin mas preambulos muestro el codigo de la clase:

GonzaBD.java
El truco de esta clase es almacenar en un array todos los campos llave de la tabla que se desee manipular (por cada tabla se debe crear un nuevo objeto de esta clase). Al llamar al metodo primero() con ayuda de una variable se accede al primer elemento del arreglo de llaves primarias. Al llamar al metodo ultimo() con ayuda de una variable se accede al ultimo elemento del arreglo de llaves primarias. Al llamar al metodo siguiente() con ayuda de una variable; si por ejemplo estamos en la fila 5, se accede al elemento 5 +1, del arreglo de llaves primarias. Despues se realiza un Select hacia la tabla y los datos quedan en un Objeto Resultset (llamado rs) que es local a esta clase, bueno a continuacion muestro el codigo:

/*
 *   Instituto Tecnologico de Zacatepec
 * Descripcion:  Clase que contiene metodos para recorrer los registros de una tabla 
 *						hacia el primer, anterior, siguiente o ultimo registro
 * Archivo: GonzaBD.java
 * author Gonzalo Silverio       gonzasilve@hotmail.com
 * fuente:  https://gonzasilve.wordpress.com
 */
import java.sql.*;


public class GonzaBD 
{
	String strSentenciaSQL = "";
	String strCadenaConexion = "";
	String strOrdenarPor = "";
	String strCampoLLave = "";
	String strTabla = "";
	String strArrayCamposLlave[];
	int intArrayCamposLlave[];
	
	//Los posibles tipos del campo llave son cadena y entero
	//Por defecto el campo llave es de tipo cadena
	String strTipoCampoLlave = "cadena";
	
	int intTotalRegistros = 0,intFilaActual = 0;	
	
	String strDriverMySQL 		="com.mysql.jdbc.Driver";
	String strDriverPostgres 	="org.postgresql.Driver";
	String strDriverSqlServer 	="net.sourceforge.jtds.jdbc.Driver";	
	
	String strManejador 		= "mysql";
	String strBaseDatos 		= "BD";
	String strServidor 		= "localhost";
	String strUsuario 		= "usuario";
	String strPassword		= "password";
	String strControlador 	= strDriverMySQL;
	String strPuerto			= "3306";
	
	private static Connection con = null;
	Statement st;
	ResultSet rs;
	
    public GonzaBD()
    {
    	
    }
    
    //se mueve a la primera fila y devuelve true si se pudo, false sino se pudo ir a la primera fila
    public  boolean  primero()
    {
      try
		{
			intFilaActual = 0;
			if( strTipoCampoLlave.equals("cadena") )
				rs = ejecutarConsulta("SELECT * FROM " + strTabla + " WHERE "+strCampoLLave+"='"+strArrayCamposLlave[intFilaActual]+"'");
			else
				rs = ejecutarConsulta("SELECT * FROM " + strTabla + " WHERE "+strCampoLLave+"="+intArrayCamposLlave[intFilaActual]);
				
			if( rs.next() )
				return true;
			
			return false;
		}
		catch ( SQLException e )
		{
			e.printStackTrace();
			return false;
		}
    }
    
    //se mueve a la anterior fila y devuelve true si se pudo, false sino se pudo ir a la anterior fila
    public  boolean  anterior()
    {
      try
		{
			intFilaActual--;
			if(intFilaActual<0)
				intFilaActual=0;
				
			if( strTipoCampoLlave.equals("cadena") )
				rs = ejecutarConsulta("SELECT * FROM " + strTabla + " WHERE "+strCampoLLave+"='"+strArrayCamposLlave[intFilaActual]+"'");
			else
				rs = ejecutarConsulta("SELECT * FROM " + strTabla + " WHERE "+strCampoLLave+"="+intArrayCamposLlave[intFilaActual]);
				
			if( rs.next() )
				return true;
			
			return false;
		}
		catch ( SQLException e )
		{
			e.printStackTrace();
			return false;
		}
    }
    
    //se mueve a la siguiente fila y devuelve true si se pudo, false sino se pudo ir a la siguiente fila
    public  boolean  siguiente()
    {
      try
		{
			intFilaActual++;
			if(intFilaActual>intTotalRegistros-1)
				intFilaActual=intTotalRegistros-1;

			if( strTipoCampoLlave.equals("cadena") )
				rs = ejecutarConsulta("SELECT * FROM " + strTabla + " WHERE "+strCampoLLave+"='"+strArrayCamposLlave[intFilaActual]+"'");
			else
				rs = ejecutarConsulta("SELECT * FROM " + strTabla + " WHERE "+strCampoLLave+"="+intArrayCamposLlave[intFilaActual]);
				
			if( rs.next() )
				return true;
			
			return false;
		}
		catch ( SQLException e )
		{
			e.printStackTrace();
			return false;
		}
    }
    
    //se mueve a la ultima fila y devuelve true si se pudo, false sino se pudo ir a la ultima fila
    public  boolean  ultimo()
    {
      try
		{
			intFilaActual = intTotalRegistros-1;

			if( strTipoCampoLlave.equals("cadena") )
				rs = ejecutarConsulta("SELECT * FROM " + strTabla + " WHERE "+strCampoLLave+"='"+strArrayCamposLlave[intFilaActual]+"'");
			else
				rs = ejecutarConsulta("SELECT * FROM " + strTabla + " WHERE "+strCampoLLave+"="+intArrayCamposLlave[intFilaActual]);
				
			if( rs.next() )
				return true;
			
			return false;
		}
		catch ( SQLException e )
		{
			e.printStackTrace();
			return false;
		}
    }
	 
	//Obtiene el controlador del manejador mysql o postgres
    public  String obtenerDriverManejador(String manejador)
    {
		if(manejador.equals("sqlserver"))							//Si el manejador es sql server
			return strDriverSqlServer;
		else if(manejador.equals("mysql"))							//Si el manejador es mysql
			return strDriverMySQL;
		else if(manejador.equals("postgres"))							//Si el manejador es postgres
			return strDriverPostgres;

			//en caso d k no sea ninguno devuelve el de MySQL			
			return strDriverMySQL;
    }
  	
	//Conecta a la BD con los datos por default
    public boolean conectarBD() throws SQLException
    {    
      try
		{
			return conectarServidor(strManejador,strServidor,strUsuario,strPassword,strBaseDatos,strControlador);
		}
		catch ( SQLException e )
		{
			e.printStackTrace();
			return false;
		}
    }
    

	//Conecta a la BD con los datos del usuario, bd y password especificados, para los demas toma los k estan por default
    public boolean conectarBD(String usuario, String password, String BD )// throws SQLException
    {
    	boolean ress;
      try
		{
			strUsuario 		= usuario;
			strPassword 	= password;
			strBaseDatos 	= BD;
			ress = conectarServidor(strManejador,strServidor,usuario,password,BD,strControlador);
			return ress;
		}
		catch ( SQLException e )
		{
			e.printStackTrace();
			return false;
		}
    }
    
    //permite especificar el campo por el que se van a ordenar los registros
    public  void ordenarPor(String campo)
    {
    	strOrdenarPor = campo;
    }
    
	//Conecta a la BD con los datos especificados, para los demas toma los k estan por default
    public boolean conectarBD(String usuario, String password, String BD, String manejador) //throws SQLException
    {
    	boolean ress;
      try
		{
			strControlador = obtenerDriverManejador(manejador);			
			strUsuario 		= usuario;
			strPassword 	= password;
			strBaseDatos 	= BD;
			strManejador 	= manejador;
			ress = conectarServidor(manejador,strServidor,usuario,password,BD,strControlador);
			return ress;
		}
		catch ( SQLException e )
		{
			e.printStackTrace();
			return false;
		}
    }
    
	//Realiza una conexion a sqlserver, mysql o postgres con los datos especificados
    public boolean conectarServidor(String manejador,String servidor,String usuario,String pw,String bd, String driver) throws SQLException
    {
		if(manejador.equals("sqlserver"))							//Si el manejador es sql server
		{
		    try
		    {
		        Class.forName(driver);
		        strCadenaConexion = "jdbc:jtds:sqlserver://"+servidor+"/"+bd+";instance=SQLSERVEREXPRESS;";
		        con = DriverManager.getConnection(strCadenaConexion,usuario,pw);
		        if (con == null )
		    			return false;
		        return true;
		    }
		    catch(SQLException sqlex)
		    {
		    		sqlex.printStackTrace();
		        	return false;
		    }
		    catch(Exception e)
		    {
		    		e.printStackTrace();
		        	return false;
		    }
		}            
    	else if(manejador.equals("mysql"))									//Si el manejador es mysql
    	{
           try
           {
		          Class.forName(driver);
		          strCadenaConexion = "jdbc:mysql://"+servidor+"/"+bd;
		          con = DriverManager.getConnection(strCadenaConexion,usuario,pw);
		          if (con == null )		          	
		          	return false;
		          
		          return true;
            }
            catch(SQLException sqlex)
            {
            	sqlex.printStackTrace();
                return false;
            }
            catch(Exception e)
            {
            	e.printStackTrace();
            	return false;
            }
    	}
    	else if(manejador.equals("postgres"))							//Si el manejador es postgress
      {
          try
          {
              Class.forName(driver);
              strCadenaConexion = "jdbc:postgresql://"+servidor+":5432/"+bd;
              con = DriverManager.getConnection(strCadenaConexion,usuario,pw);
              if (con == null )
          			return false;

              return true;
          }
          catch(SQLException sqlex)
          {

          		sqlex.printStackTrace();
              	return false;
          }
          catch(Exception e)
          {
          	e.printStackTrace();
              return false;
          }
      }

	    	return false;
    }
    
	//Ejecuta un SELECT y devuelve el Resultset con los resultados
	public ResultSet ejecutarConsulta(String cadSQ) throws SQLException
	{
		rs = null;
		if( ! strOrdenarPor.equals("") )
			cadSQ += " ORDER BY " +strOrdenarPor;
			
		try
		{
			rs = st.executeQuery(cadSQ);
			return rs;
       }
       catch(SQLException sqlex)
       {
       		sqlex.printStackTrace();
       		return rs;
       }

	}

	public  void obtenerCamposLlave()
	{
		obtenerCamposLlave(strTabla);
	}
	

	//Si el campo llave es de tipo entero guarda las llaves primarias en un arreglo de enteros
	//Si el campo llave es de tipo cadena guarda las llaves primarias en un arreglo de Strings
	public  void obtenerCamposLlave(String tabla)
	{
		int c=0;
		try
		{
			rs = ejecutarConsulta("SELECT * FROM " + tabla);
			while(rs.next())
				c++;
			intTotalRegistros = c;
			strArrayCamposLlave = new String[intTotalRegistros];
			intArrayCamposLlave = new int[intTotalRegistros];
			
			cerrar(rs);		//Cerrar consulta anterior
			//Ejecutar nuevamente la consulta
			rs = ejecutarConsulta("SELECT * FROM " + tabla);
			rs.next();		//Moverse al primer registro
			
			c=0;
			do
			{			//determina el tipo del campo llave y en base a eso guarda en el array correspondiente
				if( strTipoCampoLlave.equals("cadena") )				
					strArrayCamposLlave[c] = rs.getString(strCampoLLave);
				else
					intArrayCamposLlave[c] = rs.getInt(strCampoLLave);
					
				c++;
			}while( rs.next() );
			
		}
		catch(SQLException sqlex)
		{
       	sqlex.printStackTrace();
		}
		
	}

	
	// Cierra un objeto Resultset
	public static void cerrar(ResultSet rs)
	{	
		try
		{
			rs.close();
		} 
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
	
	// cierra un objeto Statemet
	public static void cerrar(Statement st)
	{
		try
		{
			st.close();
		} 
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}

	// Cierra un objeto Connection
	public static void cerrar(Connection con)
	{	
		try
		{
			con.close();
		} 
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
	
	//Permite especificar cual es el campo llave de la tabla
	public  void setCampoLlave(String campo)
	{
		strCampoLLave = campo;
	}
	
	//Permite especificar cual es el campo llave y su tipo, de la tabla
	public  void setCampoLlave(String campo, String tipo)
	{
		strCampoLLave = campo;
		strTipoCampoLlave = tipo;
	}
	
	public void setTipoCampoLlave(String tipo)
	{
		strTipoCampoLlave = tipo;
	}
	
	//Especifica la tabla sobre la k se va a trabajar
	public  void setTabla(String tabla)
	{
		try
		{
			strTabla = tabla;
			st=con.createStatement();
		}
		catch(SQLException ex)
		{
			ex.printStackTrace();
		}

	}	
}	//Fin de la clase

Lo interesante de esta clase es que esta preparada para recorrrer los registros de tablas que esten creadas en cualquera de los manejadores SQL Server, MySQL o de Postgres, obviamente que los .jar de los JConnector de dichos DBMS deben estar copiados en C:\Program Files\Java\jdk1.6.0_23\jre\lib\ext, Lo que esta en negrita lo e resaltado debido a que la version del JVM puede cambiar segun la que tengas instalada. Los JConnector que e usado para probar esta clase son los siguientes (puedes dar click en el enlace para descargarlo sino lo tienes).
JConnector de SQL Server: jtds-1.2.5.jar
JConnector de Postgres: postgresql-9.1-901.jdbc4.jar
JConnector de MySQL: mysql-connector-java-5.1.18-bin.jar

Para ejemplificar el uso de la clase anterior e usado una tabla que esta en SQL Server. Los parametros de conexion son:
Manejador de Base de datos (DBMS): SQL Server 2005 Express
Base de datos: prueba
Tabla: tbl_alumnos
Usuario: sa
Password: 123456
El Script para crear la tabla alumnos en SQL Server es el siguiente (generado con el Microsoft SQL Server Management Studio):

USE [prueba]
GO
/****** Object:  Table [dbo].[tbl_alumnos]    Script Date: 12/28/2011 17:59:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tbl_alumnos](
	[matricula] [int] NOT NULL,
	[nombre] [varchar](50) NULL,
	[apellidos] [varchar](100) NULL,
	[edad] [int] NULL,
	[peso] [decimal](10, 2) NULL,
	[sexo] [char](1) NULL,
 CONSTRAINT [PK__tbl_alumnos__6FBF826D] PRIMARY KEY CLUSTERED
(
	[matricula] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

La imagen de la tabla ya creada en SQL Server se ve asi:

Tabla Alumnos en SQL Server

DIAGRAMA UML DE LA CLASE gonzaBD

Diagrama UML de la clase gonzaBD

Diagrama UML de la clase gonzaBD

BREVE EXPLICACION DE LOS ATRIBUTOS DE LA CLASE gonzaBD:

Atributo Descripcion
intfilaActual Contiene un número que se usa como índice para acceder a una llave primaria dentro del arreglo strArrayCamposLlave o el arreglo strArrayCamposLlave (dependiendo de si la llave primaria es de tipo cadena o tipo entero, respectivamente). Este atributo contiene el número actual de fila-1.
strArrayCamposLlave[] Arreglo que contiene las llaves primarias de la tabla en caso de que el tipo de dato del campo llave sea Cadena.
intArrayCamposLlave[] Arreglo que contiene las llaves primarias de la tabla en caso de que el tipo de dato del campo llave sea Entero.
rs Contiene los datos de la fila actual mostrandose. Cada vez que se manda a llamar al método primero(), anterior(), siguiente() o ultimo() se realiza una consulta y este atributo (tipo Resultset) se actualiza con los campos de la nueva fila.

COMO SE USA LA CLASE gonzaBD
A continuacion voi a poner un fragmento de codigo con la intencion mostrar los pasos a realizar para usar correctamente la clase.

//Crear un objeto de esta clase
GonzaBD a = new GonzaBD();
//AHORA SE DEBE REALIZAR LO SIGUIENTE EN EL MISMO ORDEN…
//Primeramente se debe indicar especificar cual es la llave primaria de la tabla y su tipo
a.setCampoLlave("matricula","entero");
//Se de desea se puede indicar que si se desean ordenar los registros de la tabla por un campo, //este paso es opcional en todo caso sino se realiza, no se ordenan por ningún campo
a.ordenarPor("nombre");
//A continuación usamos un metodo sobrecargado para conectarse al DBMS, aquí es donde //indicamos a que manejador se debe accesar
a.conectarBD("sa","12345","pruebas","sqlserver");
//Una vez que ya estamos conectados se debe especificar la tabla que se va a manipular
a.setTabla("tbl_alumnos");
//Ahora se manda a llamar al método que rellena el arreglo de llaves primarias dentro de la clase; //dependiendo del tipo de dato del campo llave se rellena el arreglo de Strings o el arreglo de //enteros.
a.obtenerCamposLlave();
//Ahora ya se puede llamar a cualquiera de los métodos primero(), anterior(), siguiente() o ultimo()...

Despues de realizar lo anterior, para que el objeto rs se rellene con los datos de la primera fila se invoca al metodo:
a.primero();
Después de que se invoco ese metodo, el atributo rs de la clase gonzaBD se quedara con los datos de la fila 1. Supongamos que la tabla “alumnos”contiene las siguientes filas, rs apuntara a la fila:

El atributo rs esta en la posicion de la primera fila.

El atributo rs esta en la posicion de la primera fila.

Si inmediatamente despues se llama al método siguiente()
a.siguiente();
El atributo rs apuntara al siguiente registro despues del primero, es decir rs apuntara a la fila:

El atributo rs apunta a los datos de la segunda fila

El atributo rs apunta a los datos de la segunda fila

Y asi sucesivamente, una observación: si te fijas en el codigo de los metodos (siguiente() y anterior()) cuando se ha llegado a la ultima fila, es decir, si rs apunta al registro 4 y se ejecuta una llamada al método siguiente() (se intenta accesar una fila después de la ultima); dicho método contiene un ‘candado’ para detectar eso y siempre dejara a rs apuntando al ultimo registro. El método anterior() igualmente tiene esa precaucion y siempre que se intente accesar a un registro antes del primero automáticamente moverá a rs para que apunte a la primera fila. De esta manera no es posible sobrepasar los limites (inferior ni superior) de filas de la tabla que se este manipulando.

Finalmente Para ilustrar el uso de la clase gonzaBD anterior he creado una ventana muy basica.

JfrPrincipal.java
Esta clase crea una ventana de formulario con 6 campos y los 4 botones; primero, anterior, siguiente y ultimo en la parte inferior de dicha ventana. Es la misma clase que utilice para ilustrar como usar ventanas de formulario en Java, pero la he modificado con algunos campos mas. Bueno ahora muestro el codigo:

/*
 *   Instituto Tecnologico de Zacatepec
 * Descripcion:  Clase que crea una GUI para ilustrar el uso de la clase GonzaBD
 * Archivo: JfrPrincipal.java
 * author: Gonzalo Silverio       gonzasilve@hotmail.com
 * fuente:  https://gonzasilve.wordpress.com
 */

import javax.swing.*;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

//Se usara para cambiar los Margenes de los botones
import java.awt.Insets;

//Para Manejo de BD
import java.sql.*;

public class JfrPrincipal extends JFrame
{
	//Campos de texto y sus etiquetas 
	JLabel jlbMatricula;    JTextField  jtfMatricula;
	JLabel jlbNombre;       JTextField  jtfNombre;
	JLabel jlbApellidos;    JTextField  jtfApellidos;
	JLabel jlbEdad;         JTextField  jtfEdad;
	JLabel jlbPeso;         JTextField  jtfPeso;
	JLabel jlbSexo;         JComboBox   jcbSexo;
	
	//Botones de navegacion de los registros
	JButton btnPrimero;
	JButton btnAnterior;
	JButton btnSiguiente;
	JButton btnUltimo;
	
	Box boxVCamposVentana;   //Contiene todo los campos de texto (con su respectiva etiqueta)
	JPanel panBotones;      //Contiene los botones Guardar y Cancelar
	
	//Objeto de la clase que nos ayuda a navegar por los registros de la tabla
	GonzaBD bd = new GonzaBD();
	
	JfrPrincipal(String strTitulo, int intAncho, int intAlto)
	{
		super(strTitulo);
		this.setSize(intAncho, intAlto);
		this.setResizable(false);		//Ventana no redimensionable
		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);
	  
	  //Conecta la Base de datos
		conectarBD();
		bd.primero();		//Posicionarse en el primer registro
		rellenarCampos();		//Rellenar los campos con los datos del primer registro
		
		//ASIGNAR UN ESCUCHADOR PARA CADA BOTON DE NAVEGACION
		//Boton Primero
		btnPrimero.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent evt) 
			{
				bd.primero();
				rellenarCampos();
			}
		});
		//Boton Anterior
		btnAnterior.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent evt) 
			{
				bd.anterior();
				rellenarCampos();
			}
		});
		//Boton Siguiente
		btnSiguiente.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent evt) 
			{
				bd.siguiente();
				rellenarCampos();
			}
		});
		//Boton Ultimo
		btnUltimo.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent evt) 
			{
				bd.ultimo();
				rellenarCampos();
			}
		});
		  	
        	
	}		//Fin del constructor

	//Crea los campos de la ventana (cada caja tiene su correspondiente etiqueta)
    private void crearCamposVentana()
    {
        Box boxHMatricula =  Box.createHorizontalBox();        
        jlbMatricula = new JLabel("Matricula ");   jtfMatricula = new JTextField(15);
        boxHMatricula.add(Box.createHorizontalStrut(20));
        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(20));
        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(20));
        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(20));
        boxHEdad.add(jlbEdad);
        boxHEdad.add(Box.createHorizontalStrut(40));
        boxHEdad.add(jtfEdad);
        JPanel panEdad =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panEdad.add(boxHEdad);
        
        Box boxHPeso =  Box.createHorizontalBox();
        jlbPeso = new JLabel("Peso ");   jtfPeso = new JTextField(15);
        boxHPeso.add(Box.createHorizontalStrut(20));
        boxHPeso.add(jlbPeso);
        boxHPeso.add(Box.createHorizontalStrut(40));
        boxHPeso.add(jtfPeso);
        JPanel panPeso =  new JPanel(new FlowLayout(FlowLayout.LEFT) );
        panPeso.add(boxHPeso);

        Box boxHSexo =  Box.createHorizontalBox();
        jlbSexo = new JLabel("Sexo ");   jcbSexo = new JComboBox();
        jcbSexo.addItem("Masculino");
        jcbSexo.addItem("Femenino");
        boxHSexo.add(Box.createHorizontalStrut(20));
        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(panPeso);
        boxVCamposVentana.add(Box.createVerticalStrut(10));
        boxVCamposVentana.add(panSexo);
    }

    private void crearBotones()
    {
        Box boxHBotones = Box.createHorizontalBox();
        
        btnPrimero = new JButton("|< Primero");
        btnAnterior = new JButton("< Anterior");
        btnSiguiente = new JButton("Siguiente >");
        btnUltimo = new JButton("Ultimo >|");
        //Cambiar los margenes de los botones
        			//Insets(margen_sup, margen_izq, margen_inf, margen_der)
        btnPrimero.setMargin(new Insets(0, 2, 0, 2));
        btnAnterior.setMargin(new Insets(0, 2, 0, 2));
        btnSiguiente.setMargin(new Insets(0, 2, 0, 2));
        btnUltimo.setMargin(new Insets(0, 2, 0, 2));
        
        boxHBotones.add(btnPrimero);
        boxHBotones.add(Box.createHorizontalStrut(20));
        boxHBotones.add(btnAnterior);
        boxHBotones.add(Box.createHorizontalStrut(20));
        boxHBotones.add(btnSiguiente);
        boxHBotones.add(Box.createHorizontalStrut(20));
        boxHBotones.add(btnUltimo);
        
        panBotones =  new JPanel(new FlowLayout(FlowLayout.CENTER) );
        panBotones.add(boxHBotones);
    }
	//Conecta con la BD y devuelve true si se conecto correctamente
	//false en cualquiero otro caso
	public boolean conectarBD()
	{
		// Especificar cual es la llave primaria de la tabla y su tipo
		bd.setCampoLlave("matricula","entero");
    	bd.ordenarPor("nombre");	//Ordena los registros de la tabla por este campo
		
		//Conecta con el usuario, pass, BD y dbms (manejador) especificados
		bd.conectarBD("sa","12345","pruebas","sqlserver");
		
    	//especifica la tabla sobre la que se va a manipular
    	bd.setTabla("tbl_alumnos");
    	//Dentro del objeto bd rellena un arreglo con las llaves 
    	//primarias de la tabla que se esta manipulando
		bd.obtenerCamposLlave();
		
		return true;
	}
	
	//Rellena los campos de texto con los datos del registro actual
    public void rellenarCampos()
    {
		try
		{
    		jtfMatricula.setText(aCadena(bd.rs.getInt("matricula")));
    		jtfNombre.setText(bd.rs.getString("nombre").trim ());
    		jtfApellidos.setText(bd.rs.getString("apellidos").trim ());
    		jtfEdad.setText(aCadena(bd.rs.getInt("edad")));
    		jtfPeso.setText(aCadena(bd.rs.getFloat("peso")));
    		jcbSexo.setSelectedItem( bd.rs.getString("sexo").equals("f") ? "Femenino" : "Masculino" );
    		
    		this.setTitle("Alumno "+(bd.intFilaActual+1)+" de "+bd.intTotalRegistros);
		}
		catch( SQLException ex )
		{
			ex.printStackTrace();
		}
    }
    
    //Recibe un numero entero y lo devuelve como Cadena (String)
    private String aCadena(int num)
    {
    	return String.valueOf(num);
    }
    
    //Recibe un numero decimal y lo devuelve como Cadena (String)
    private String aCadena(float num)
    {
    	return String.valueOf(num);
    }
    
    private void mostrar()
    {
        this.setVisible(true);
    }

    public static void main(String args[])
    {
        JfrPrincipal prueba1 = new JfrPrincipal("Recorrer registros de SQL Server en Java",400,400);
        prueba1.mostrar();
    }
}

Y aqui una imagen de la ejecucion:

Ejecucion del ejemplo: Mostrando la tabla alumnos

Ejecucion del ejemplo: Mostrando la tabla alumnos

A diferencia de la otra entrada de blog anterior a esta, ahora se pueden realizar busquedas e igualmente se pueden recorrer los resultados con ayuda de la misma clase. La busqueda se puede realizar por matricula, nombre o por genero (sexo). Por ejemplo en caso de que decidamos buscar en los nombres de los alumnos la cadena ‘ar’, debemos marcar el radio nombre, escribir en la cajita ‘ar’ y dar clic en el boton Buscar en este caso se encontraron 4 resultados, como se muestra en la siguiente imagen:

Buscando por nombre a un alumno

Buscando por nombre a un alumno

Observa como automaticamente se desactivan los controles de busqueda y se muestran los resultados; los cuales tambien se pueden recorrer con los mismos botones de Primero, Anterior, Siguiente y Ultimo. Ademas el texto del boton Buscar cambia y ahora ese boton permite terminar la Busqueda. Al dar click en el boton Fin Busqueda se muestran nuevamente todos los alumnos de la tabla y se despliega el que estaba mostrandose antes de hacer la busqueda. Por ultimo muestro otro pantallazo de una busqueda por Sexo:

Buscando alumnos por sexo

Buscando alumnos por sexo

Como decia anteriormente lo interesante es que si ahora deseamos que la tabla alumnos este creada en MySQL o Postgres, entonces la creamos en dicho manejador (con ayuda del script que puse mas arriba; estan los nombres de los campos y su tipo) y en la linea 402 de la clase JfrPrincipal.java, cambiamos los parametros de Conexion (usuario,pass,bd, manejador) de dicho manejador, la clase automaticamente usara el Driver adecuado y se conectara a dicho DBMS sin problemas.

Sin querer se hizo un poco largo este ejemplo, pero no era para mas, espero haber sido lo suficiente explicito y no haber dejado muchas dudas, los ya avanzados en Java supongo que mi codigo lo habran digerido sin problemas y los que empiezan de todas maneras pregunten sin compromiso, les aseguro que yo tambien soy un novato y seguro hay alguna manera mas fina y elegante de hacer esto del recorrido de registros, solo es una idea. . Y es que a la clase GonzaBD.java la simplifique y le quite mucho codigo para que quedara simple y sencilla de entender ya que mi version original tiene muchos mas metodos para realizar las cuatro Operaciones SQL de manera mas simple (INSERT, DELETE, UPDATE, SELECT), pero me reservo el codigo y posiblemente mas adelante lo libere en este mismo blog, por ahora creo que seria demasiado y requeria mas tiempo para explicarlo y estoy muy ocupado estod dias.

Bueno no me queda mas que decir hasta pronto y si a alguien le interesan los fuentes basta con pedirlos y se los envio, hasta pronto y gracias x visitar.

Uso de la clase JTabbedPane

En esta ocasion mostrare como se utiliza la clase JTabbedPane para insertar varias fichas dentro de un JFrame, 3 en este caso. El codigo es el siguiente:

/*
 * Descripcion:  Clase que muestra el uso de la clase JTabbedPane para insertar fichas
 *               dentro de un JFrame.
 * Archivo:      PruebaJTabbedPane.java
 * Fecha:        29/12/2009
 *
 * @author gonzasilve@gmail.com
 */

/*       metodo JTabbedPane.add()
            Primer  argumento:  Titulo de la ficha.
            Segundo argumento:  Icon, icono de la ficha de la ficha.
            Tercer  argumento:  Un objeto Component que representa la GUI a mostrar cuanda se da clic en la ficha.
            Cuarto  argumento:  Una cadena de texto que especifica el ToolTp de la ficha (texto que se muestra al colocar mouse sobre la ficha). */

import javax.swing.*;       // Para poder usar JTabbedPane 
import java.awt.*;          // Para poder usar FlowLayout y  componentes varios

public class PruebaJTabbedPane extends JFrame
{
    JTabbedPane panelFichas = new JTabbedPane();
    Box contAntesDeFicha;
    Box boxContenidoFrame;

    PruebaJTabbedPane(String titulo, int ancho, int alto)
    {
        super(titulo);
        setSize(ancho, alto);

        JPanel panFicha1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panFicha1.add(new JLabel("Contenido de la ficha1"));
        ImageIcon iconoFicha1 = new ImageIcon(getClass().getResource("iconoFicha1.gif"));
        panelFichas.addTab("Trabajo", iconoFicha1,panFicha1,"ficha1");

        JPanel panFicha2 = new JPanel(new FlowLayout(FlowLayout.CENTER));
        panFicha2.add(new JLabel("Contenido de la ficha2"));
        ImageIcon iconoFicha2 = new ImageIcon(getClass().getResource("iconoFicha2.gif"));
        panelFichas.addTab("Datos personales", iconoFicha2,panFicha2,"tooltip ficha2");

        JPanel panFicha3 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JPanel panCampoNombre = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblNombre = new JLabel("Nombre");
            JTextField jtfNombre = new JTextField(10);
        panCampoNombre.add(lblNombre);
        panCampoNombre.add(jtfNombre);
        panFicha3.add(panCampoNombre);
        ImageIcon iconoFicha3 = new ImageIcon(getClass().getResource("iconoFicha3.gif"));
        panelFichas.addTab("Otros", iconoFicha3,panFicha3,"tooltip ficha3");

        // Contenido que se insertara antes de agregar las fichas al JFrame
        contAntesDeFicha = Box.createVerticalBox();
        JTextField jtfCajaBusqueda = new JTextField(30);
        JButton btnBuscar = new JButton("Buscar");
        JPanel panBusqueda = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panBusqueda.add(jtfCajaBusqueda);
        panBusqueda.add(btnBuscar);

        // Separamos la caja de busqueda de el borde superior de la ventana
        contAntesDeFicha.add(Box.createVerticalStrut(20));
        contAntesDeFicha.add(panBusqueda);

        JPanel panAntes = new JPanel(new BorderLayout());
        panAntes.add(contAntesDeFicha);
        JPanel panFichas = new JPanel(new BorderLayout());
        panFichas.add(panelFichas);

        boxContenidoFrame = Box.createVerticalBox();
        boxContenidoFrame.add(panAntes);
        boxContenidoFrame.add(panFichas);
        add(boxContenidoFrame);

        this.setLocationRelativeTo(this);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

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

    public static void main(String args[])
    {
        PruebaJTabbedPane prueba1 = new PruebaJTabbedPane("Prueba de JTabbedPane",800,500);
        prueba1.mostrar();
    }
}

y aca una imagen de la ventana que genera este codigo:

Espero le sirva a alguien, hasta pronto
}

Diseño de Ventana empleados usando la clase Box

En esta ocasion dejo una ejemplo de como disear una ventana usando la Clase Box. Los iconos que utilice estan en mi pagina web, en este link. El diseño de la ventana es sobre una tabla llamada empleados, que obviamente guarda informacion sobre empleados de una empresa ficticia.

La ventana esta diseñada para mostrar los campos de esta tabla, creada en Mysql:

Como se puede observar a continuacion es bastante codigo, pero bueno pienso que vale la pena con tal de aprender como se diseña una ventana de estas desde 0 (sin ayuda de ningun IDE).

/**
 * @(#)JfrEmpleados.java
 * Descripcion: Interfaz grafica de Empleados, este JFrame permite al usuario
 * llevar el control de empleados.
 *
 * @author gonzasilve@gmail.com
 * @version 1.00 2009/11/17
 */

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

import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;
import java.util.*;

//Importar clases para manejo de BD (en este ejemplo no
//                                   se usa ninguna clase de este paquete)
import java.sql.*;

public class JfrEmpleados extends JFrame
{
		/*
	 *Prefijos:
	 *	jtx		JTextField
	 *	jpf		JPasswordField
	 *	jcb		jComboBox
	 *	btn		JButton
	 *	lbl		JLabel
	 *	pan		JPanel
	 *	fra		JFrame
	 *	box		Box
	 *  jrb		JRadioButton
	 *
	 **/

	//Constructor que crea la interfaz grafic de la ventan principal
    public JfrEmpleados()
    {
    	setTitle("Hardware Solutions S.A. de C.V. -Empleados");
    	setSize(900,620);
    	this.setLocationRelativeTo(this);	//Centramos este JFrame en la pantalla
        this.setResizable(false);
        this.setIconImage(new ImageIcon(getClass().getResource("iconoEmpleados.png")).getImage());
        //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //Box que contendra todo el contenido del JFrame
        Box boxContenidoVertical = Box.createVerticalBox();

        //Disenio del rotulo principal superior del JFrame
        Box boxHRotuloPrincipal = Box.createHorizontalBox();
        JLabel lblRotuloSistema = new JLabel("Hardware Solutions S.A. de C.V.");
        lblRotuloSistema.setFont(new Font("Arial",Font.BOLD,20));
        lblRotuloSistema.setForeground(Color.BLUE);
        JLabel lblIconoEmpleados = new JLabel(new ImageIcon(this.getClass().getResource("icono_empleados.png")));
        JLabel lblRotuloEmpleados = new JLabel("Empleados");
        lblRotuloEmpleados.setFont(new Font("Arial",Font.BOLD,20));
        lblRotuloEmpleados.setForeground(Color.GREEN);
        JButton btnCerrarEmpleados = new JButton();
        btnCerrarEmpleados.setMargin(new Insets(0, 0, 0, 0));
        btnCerrarEmpleados.setIcon(new ImageIcon(this.getClass().getResource("icono_cerrar.png")));
        boxHRotuloPrincipal.add(Box.createHorizontalStrut(15));
        boxHRotuloPrincipal.add(lblRotuloSistema);
        boxHRotuloPrincipal.add(Box.createHorizontalStrut(80));
        boxHRotuloPrincipal.add(lblIconoEmpleados);
        boxHRotuloPrincipal.add(Box.createHorizontalStrut(8));
        boxHRotuloPrincipal.add(lblRotuloEmpleados);
        boxHRotuloPrincipal.add(Box.createHorizontalStrut(262));
        boxHRotuloPrincipal.add(btnCerrarEmpleados);
        JPanel panRotuloPrincipal = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panRotuloPrincipal.setBackground(Color.white);
        panRotuloPrincipal.add(boxHRotuloPrincipal);

        //Creacion de los botones Principales de la parte superior del JFrame
        JButton btnNuevo = new JButton();
        btnNuevo.setIcon(new ImageIcon(getClass().getResource("icono_nuevo.png")));
        btnNuevo.setMargin(new Insets(0, 3, 0, 0));
        btnNuevo.setToolTipText("Nuevo empleado");
        JButton btnModificar = new JButton();
        btnModificar.setIcon(new ImageIcon(getClass().getResource("icono_modificar.png")));
        btnModificar.setMargin(new Insets(0, 3, 0, 0));
        btnModificar.setToolTipText("Modificar datos del empleado actual");
        JButton btnEliminar = new JButton();
        btnEliminar.setIcon(new ImageIcon(getClass().getResource("icono_eliminar.png")));
        btnEliminar.setMargin(new Insets(0, 2, 0, 0));
        btnEliminar.setToolTipText("Dar de baja al empleado actual");
        JButton btnListar = new JButton();
        btnListar.setIcon(new ImageIcon(getClass().getResource("icono_listar.png")));
        btnListar.setMargin(new Insets(0, 3, 0, 2));
        btnListar.setToolTipText("Listar en una tabla a todos los empleados");
        JButton btnFinBusqueda = new JButton("Terminar busqueda");
        btnFinBusqueda.setIcon(new ImageIcon(getClass().getResource("icono_Finbuscar.gif")));
        btnFinBusqueda.setMargin(new Insets(0, 3, 0, 3));
        btnFinBusqueda.setToolTipText("Mostrar todos los empleados");

        Box boxHBotonesPrincipales = Box.createHorizontalBox();
        JPanel panBotonesPrincipales = new JPanel(new FlowLayout(FlowLayout.LEFT));
        boxHBotonesPrincipales.add(Box.createHorizontalStrut(40));
        boxHBotonesPrincipales.add(btnNuevo);
        boxHBotonesPrincipales.add(Box.createHorizontalStrut(25));
        boxHBotonesPrincipales.add(btnModificar);
        boxHBotonesPrincipales.add(Box.createHorizontalStrut(25));
        boxHBotonesPrincipales.add(btnEliminar);
        boxHBotonesPrincipales.add(Box.createHorizontalStrut(30));
        boxHBotonesPrincipales.add(btnListar);
        boxHBotonesPrincipales.add(Box.createHorizontalStrut(150));
        boxHBotonesPrincipales.add(btnFinBusqueda);
        panBotonesPrincipales.add(boxHBotonesPrincipales);

        //Creacion de la caja de busqueda y el rotulo del nombre del empleado
        //Creacion de caja de busqueda
        JTextField jtfCajaBusqueda = new JTextField(15);
        JButton btnBuscar = new JButton("Buscar", new ImageIcon(getClass().getResource("icono_buscar16.gif")));
        JButton btnOpcionesBusqueda = new JButton();
        btnOpcionesBusqueda.setMargin(new Insets(0, 0, 0, 0));
        btnOpcionesBusqueda.setIcon(new ImageIcon(getClass().getResource("icono_configurar16.png")));
        btnOpcionesBusqueda.setToolTipText("Opciones de busqueda");
        Box boxHBusqueda = Box.createHorizontalBox();
        boxHBusqueda.add(Box.createHorizontalStrut(10));
        boxHBusqueda.add(jtfCajaBusqueda);
        boxHBusqueda.add(Box.createHorizontalStrut(5));
        boxHBusqueda.add(btnBuscar);
        boxHBusqueda.add(Box.createHorizontalStrut(5));
        boxHBusqueda.add(btnOpcionesBusqueda);
        JPanel panBusqueda = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panBusqueda.add(boxHBusqueda);

        //Creacion de la etiqueta de nombre de empleado
        JLabel lblNombreEmpleado = new JLabel("> Xavier Franco Silva");
        lblNombreEmpleado.setFont(new Font("Arial",Font.BOLD,20));
        lblNombreEmpleado.setForeground(Color.BLUE);
        Box boxHNombreEmpleado = Box.createHorizontalBox();
        boxHNombreEmpleado.add(Box.createHorizontalStrut(10));
        boxHNombreEmpleado.add(lblNombreEmpleado);
        boxHNombreEmpleado.add(Box.createHorizontalStrut(285));         //tamanio del fondo del nombre del empleado
        JPanel panNombreEmpleado = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panNombreEmpleado.setBackground(new Color(174,156,244));
        panNombreEmpleado.add(boxHNombreEmpleado);

        Box boxHBusquedaYNombre = Box.createHorizontalBox();
        boxHBusquedaYNombre.add(panBusqueda);
        boxHBusquedaYNombre.add(Box.createHorizontalStrut(20));
        boxHBusquedaYNombre.add(panNombreEmpleado);
        JPanel panBusquedaYNombre = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panBusquedaYNombre.add(boxHBusquedaYNombre);

        //Creacion de la lista de nombre sy la ficha de datos del empleado
        //Creacion de la lista de nombres
        Box boxVListaNombres = Box.createVerticalBox();
        Box boxHEspaciosSuperiorNombres = Box.createHorizontalBox();
        boxHEspaciosSuperiorNombres.add(Box.createHorizontalStrut(170));    //Espacio arriba de la lista de nombres
        boxVListaNombres.add(boxHEspaciosSuperiorNombres);
        JList lstListaNombres = new JList();
        DefaultListModel modeloNombres = new DefaultListModel();
        modeloNombres.addElement("Juan carlos");
        modeloNombres.addElement("Samuel Arturo");
        modeloNombres.addElement("Armando");
        modeloNombres.addElement("Juan carlos");
        modeloNombres.addElement("Samuel Arturo");
        modeloNombres.addElement("Armando");
        lstListaNombres.setVisibleRowCount(16);          //Numero de elementos que se muestran al usuario
        lstListaNombres.setModel(modeloNombres);
        JScrollPane scrollListaNombres = new JScrollPane(lstListaNombres);
        boxVListaNombres.add(scrollListaNombres);
        JPanel panboxVListaNombres = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panboxVListaNombres.add(boxVListaNombres);

        //Creacion del contenido de las fichas
        Box boxVFichas = Box.createVerticalBox();
        Box boxHEspaciosSuperiorFichas = Box.createHorizontalBox();
        boxHEspaciosSuperiorFichas.add(Box.createHorizontalStrut(100));    //Espacio arriba de las fichas
        boxVFichas.add(boxHEspaciosSuperiorFichas);
        Color colorEtiquetas = Color.BLUE;
        Color colorInhabilitados = Color.BLACK;
        //Disenio del contenido de la               FICHA DE DATOS LABORALES
        //Columan 1
        JTabbedPane jtpDatosEmpleado = new JTabbedPane();
        JPanel panFicha1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JPanel panID= new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblIDEmpleado = new JLabel("ID                    ");
            lblIDEmpleado.setForeground(colorEtiquetas);
            JTextField jtfIDEmpleado = new JTextField(20);
            jtfIDEmpleado.setDisabledTextColor(colorInhabilitados);
        panID.add(lblIDEmpleado);
        panID.add(jtfIDEmpleado);
        JPanel panCargo= new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblCargo = new JLabel("Cargo              ");
            lblCargo.setForeground(colorEtiquetas);
            JTextField jtfCargo = new JTextField(20);
            jtfCargo.setDisabledTextColor(colorInhabilitados);
        panCargo.add(lblCargo);
        panCargo.add(jtfCargo);
        JPanel panDepartamento= new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblDepartamento = new JLabel("Departamento ");
            lblDepartamento.setForeground(colorEtiquetas);
            JTextField jtfDepartamento = new JTextField(20);
            jtfDepartamento.setDisabledTextColor(colorInhabilitados);
        panDepartamento.add(lblDepartamento);
        panDepartamento.add(jtfDepartamento);
        JPanel panJefeDirecto = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblJefeDirecto = new JLabel("Jefe directo      ");
            lblJefeDirecto.setForeground(colorEtiquetas);
            JTextField jtfJefeDirecto = new JTextField(20);
            jtfJefeDirecto.setDisabledTextColor(colorInhabilitados);
        panJefeDirecto.add(lblJefeDirecto);
        panJefeDirecto.add(jtfJefeDirecto);
        JPanel panFechaContratacion = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblFechaContratacion = new JLabel("<html>Fecha de <br>contratacion&nbsp&nbsp&nbsp&nbsp&nbsp</html>");
            lblFechaContratacion.setForeground(colorEtiquetas);
            JTextField jtfFechaContratacion = new JTextField(20);
            jtfFechaContratacion.setDisabledTextColor(colorInhabilitados);
        panFechaContratacion.add(lblFechaContratacion);
        panFechaContratacion.add(jtfFechaContratacion);
        JPanel panTratamiento = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblTratamiento = new JLabel("Tratamiento     ");
            lblTratamiento.setForeground(colorEtiquetas);
            JTextField jtfTratamiento = new JTextField(20);
            jtfTratamiento.setDisabledTextColor(colorInhabilitados);
        panTratamiento.add(lblTratamiento);
        panTratamiento.add(jtfTratamiento);
        //Columna 2
        JPanel panInfoSalario1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblInfoSalario1 = new JLabel("Salario en base a:                                   ");
            lblInfoSalario1.setForeground(colorEtiquetas);
            JComboBox jcbTiposSalario = new JComboBox();
            jcbTiposSalario.addItem("Salario base");
            jcbTiposSalario.addItem("Salario por comision");
            jcbTiposSalario.addItem("Salario base + comision");
            jcbTiposSalario.addItem("Salario por horas trabajadas");
            jcbTiposSalario.setMaximumRowCount(4);
        JPanel panCamposInfoSalario1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panCamposInfoSalario1.add(lblInfoSalario1);
        Box boxVInfoSalario = Box.createVerticalBox();
        boxVInfoSalario.add(panCamposInfoSalario1);
        boxVInfoSalario.add(jcbTiposSalario);
        panInfoSalario1.add(boxVInfoSalario);
        JPanel panInfoSalario2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblInfoSalario2 = new JLabel("Sueldo base (S)           ");
            lblInfoSalario2.setForeground(colorEtiquetas);
            JTextField jtfInfoSalario1 = new JTextField(10);
            jtfInfoSalario1.setDisabledTextColor(colorInhabilitados);
        panInfoSalario2.add(lblInfoSalario2);
        panInfoSalario2.add(jtfInfoSalario1);
        JPanel panInfoSalario3 = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblInfoSalario3 = new JLabel("Tasa de comision (%)  ");
            lblInfoSalario3.setForeground(colorEtiquetas);
            JTextField jtfInfoSalario2 = new JTextField(10);
            jtfInfoSalario2.setDisabledTextColor(colorInhabilitados);
        panInfoSalario3.add(lblInfoSalario3);
        panInfoSalario3.add(jtfInfoSalario2);

        Box boxHFichaLaborales = Box.createHorizontalBox();
        Box boxVColumna1Ficha1 = Box.createVerticalBox();
        Box boxVColumna2Ficha1 = Box.createVerticalBox();

        boxVColumna1Ficha1.add(Box.createVerticalStrut(10));
        boxVColumna1Ficha1.add(panID);
        boxVColumna1Ficha1.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha1.add(panCargo);
        boxVColumna1Ficha1.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha1.add(panDepartamento);
        boxVColumna1Ficha1.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha1.add(panJefeDirecto);
        boxVColumna1Ficha1.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha1.add(panFechaContratacion);
        boxVColumna1Ficha1.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha1.add(panTratamiento);

        boxVColumna2Ficha1.add(panInfoSalario1);
        boxVColumna2Ficha1.add(Box.createVerticalStrut(12));
        boxVColumna2Ficha1.add(panInfoSalario2);
        boxVColumna2Ficha1.add(Box.createVerticalStrut(8));
        boxVColumna2Ficha1.add(panInfoSalario3);
        JPanel panboxVColumna2Ficha1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panboxVColumna2Ficha1.add(boxVColumna2Ficha1);

        boxHFichaLaborales.add(Box.createHorizontalStrut(10));
        boxHFichaLaborales.add(boxVColumna1Ficha1);
        boxHFichaLaborales.add(Box.createHorizontalStrut(15));
        boxHFichaLaborales.add(panboxVColumna2Ficha1);
        panFicha1.add(boxHFichaLaborales);
        ImageIcon iconoFichaDatosLaborales = new ImageIcon(getClass().getResource("iconoFichaLaborales.gif"));
        jtpDatosEmpleado.addTab("Datos laborales",iconoFichaDatosLaborales, panFicha1,"Datos del trabajo");

        //Disenio del contenido de la               FICHA DE DATOS PERSONALES
        JPanel panFicha2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JPanel panNombre= new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblNombre = new JLabel("Nombre    ");
            lblNombre.setForeground(colorEtiquetas);
            JTextField jtfNombre = new JTextField(20);
            jtfNombre.setDisabledTextColor(colorInhabilitados);
        panNombre.add(lblNombre);
        panNombre.add(jtfNombre);
        JPanel panApellidos = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblApellidos = new JLabel("Apellidos ");
            lblApellidos.setForeground(colorEtiquetas);
            JTextField jtfApellidos = new JTextField(20);
            jtfApellidos.setDisabledTextColor(colorInhabilitados);
        panApellidos.add(lblApellidos);
        panApellidos.add(jtfApellidos);
        JPanel panSexo = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblSexo = new JLabel("Sexo         ");
            lblSexo.setForeground(colorEtiquetas);
            JComboBox jcbSexo = new JComboBox();
            jcbSexo.addItem("Masculino     ");
            jcbSexo.addItem("Femenino");
            jcbSexo.setMaximumRowCount(2);
        panSexo.add(lblSexo);
        panSexo.add(jcbSexo);
        JPanel panTelefono = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblTelefono = new JLabel("Telefono  ");
            lblTelefono.setForeground(colorEtiquetas);
            JTextField jtfTelefono = new JTextField(20);
            jtfTelefono.setDisabledTextColor(colorInhabilitados);
        panTelefono.add(lblTelefono);
        panTelefono.add(jtfTelefono);
        JPanel panEdad = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblEdad = new JLabel("Edad        ");
            lblEdad.setForeground(colorEtiquetas);
            JTextField jtfEdad = new JTextField(20);
            jtfTelefono.setDisabledTextColor(colorInhabilitados);
        panEdad.add(lblEdad);
        panEdad.add(jtfEdad);
        JPanel panCorreo = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblCorreo = new JLabel("Correo     ");
            lblCorreo.setForeground(colorEtiquetas);
            JTextField jtfCorreo = new JTextField(20);
            jtfCorreo.setDisabledTextColor(colorInhabilitados);
        panCorreo.add(lblCorreo);
        panCorreo.add(jtfCorreo);

        //Contenido de columna2 ficha 2
        JPanel panInfoFotografia = new JPanel(new FlowLayout(FlowLayout.CENTER));
            JLabel lblInfoFotografia = new JLabel("Fotografia");
        panInfoFotografia.add(lblInfoFotografia);
        JPanel panFotografia = new JPanel(new FlowLayout(FlowLayout.CENTER));
            JLabel lblFotografia = new JLabel();
            ImageIcon iconofotografia = new ImageIcon(getClass().getResource("sin_fotografia.gif"));
            lblFotografia.setIcon(iconofotografia);
        panFotografia.add(lblFotografia);
        JPanel panbtnCambiarFotografia = new JPanel(new FlowLayout(FlowLayout.LEFT));
            ImageIcon iconoModificarFotografia = new ImageIcon(getClass().getResource("iconoCambiar_fotografia.png"));
            JButton btnModificarFotografia = new JButton(iconoModificarFotografia);
            btnModificarFotografia.setMargin(new Insets(0, 0, 0, 0));
            btnModificarFotografia.setToolTipText("Cambiar fotografia");
        panbtnCambiarFotografia.add(btnModificarFotografia);
        JPanel panbtnQuitarFotografia = new JPanel(new FlowLayout(FlowLayout.LEFT));
            ImageIcon iconoQuitarFotografia = new ImageIcon(getClass().getResource("iconoQuitar_fotografia.png"));
            JButton btnQuitarFotografia = new JButton(iconoQuitarFotografia);
            btnQuitarFotografia.setMargin(new Insets(0, 0, 0, 0));
            btnQuitarFotografia.setToolTipText("Quitar fotografia");
        panbtnQuitarFotografia.add(btnQuitarFotografia);
        JPanel panbtnRevertirFotografia = new JPanel(new FlowLayout(FlowLayout.LEFT));
            ImageIcon iconoRevertirFotografia = new ImageIcon(getClass().getResource("iconoRevertir_fotografia.png"));
            JButton btnRevertirFotografia = new JButton(iconoRevertirFotografia);
            btnRevertirFotografia.setMargin(new Insets(0, 0, 0, 0));
            btnRevertirFotografia.setToolTipText("Revertir dejando la que estaba");
        panbtnRevertirFotografia.add(btnRevertirFotografia);

        Box boxHFichaPersonales = Box.createHorizontalBox();
        Box boxVColumna1Ficha2 = Box.createVerticalBox();
        Box boxHColumna2Ficha2 = Box.createHorizontalBox();
        Box boxVCol1Columna2Ficha2 = Box.createVerticalBox();
        Box boxVCol2Columna2Ficha2 = Box.createVerticalBox();

        boxVColumna1Ficha2.add(Box.createVerticalStrut(10));
        boxVColumna1Ficha2.add(panNombre);
        boxVColumna1Ficha2.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha2.add(panApellidos);
        boxVColumna1Ficha2.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha2.add(panSexo);
        boxVColumna1Ficha2.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha2.add(panTelefono);
        boxVColumna1Ficha2.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha2.add(panEdad);
        boxVColumna1Ficha2.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha2.add(panCorreo);

        boxVCol1Columna2Ficha2.add(panInfoFotografia);
        boxVCol1Columna2Ficha2.add(panFotografia);

        boxVCol2Columna2Ficha2.add(Box.createVerticalStrut(40));
        boxVCol2Columna2Ficha2.add(panbtnCambiarFotografia);
        boxVCol2Columna2Ficha2.add(panbtnQuitarFotografia);
        boxVCol2Columna2Ficha2.add(panbtnRevertirFotografia);
        JPanel panboxVCol2Columna2Ficha2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panboxVCol2Columna2Ficha2.add(boxVCol2Columna2Ficha2);

        boxHColumna2Ficha2.add(boxVCol1Columna2Ficha2);
        boxHColumna2Ficha2.add(panboxVCol2Columna2Ficha2);

        JPanel panboxVColumna2Ficha2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panboxVColumna2Ficha2.add(boxHColumna2Ficha2);

        boxHFichaPersonales.add(Box.createHorizontalStrut(10));
        boxHFichaPersonales.add(boxVColumna1Ficha2);
        boxHFichaPersonales.add(Box.createHorizontalStrut(50));
        boxHFichaPersonales.add(panboxVColumna2Ficha2);

        panFicha2.add(boxHFichaPersonales);
        ImageIcon iconoFicha2 = new ImageIcon(getClass().getResource("iconoFichaPersonales.gif"));
        jtpDatosEmpleado.addTab("Datos personales", iconoFicha2, panFicha2,"Datos personales");

		//Disenio del contenido de la               FICHA  DIRECCION
        JPanel panFicha3 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JPanel panNacionalidad = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblNacionalidad = new JLabel("Nacionalidad  ");
            lblNacionalidad.setForeground(colorEtiquetas);
            JTextField jtfNacionalidad = new JTextField(20);
            jtfNacionalidad.setDisabledTextColor(colorInhabilitados);
        panNacionalidad.add(lblNacionalidad);
        panNacionalidad.add(jtfNacionalidad);
        JPanel panEstado = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblEstado = new JLabel("Estado           ");
            lblEstado.setForeground(colorEtiquetas);
            JTextField jtfEstado = new JTextField(20);
            jtfEstado.setDisabledTextColor(colorInhabilitados);
        panEstado.add(lblEstado);
        panEstado.add(jtfEstado);
        JPanel panDireccion = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblDireccion = new JLabel("Direccion       ");
            lblDireccion.setForeground(colorEtiquetas);
            JTextField jtfDireccion = new JTextField(20);
            jtfDireccion.setDisabledTextColor(colorInhabilitados);
        panDireccion.add(lblDireccion);
        panDireccion.add(jtfDireccion);
        JPanel panCP = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblCP = new JLabel("C.P.                ");
            lblCP.setForeground(colorEtiquetas);
            JTextField jtfCP = new JTextField(20);
            jtfCP.setDisabledTextColor(colorInhabilitados);
        panCP.add(lblCP);
        panCP.add(jtfCP);
        JPanel panlblObservaciones = new JPanel(new FlowLayout(FlowLayout.CENTER));
            JLabel lblObservaciones = new JLabel("Observaciones");
            lblObservaciones.setForeground(colorEtiquetas);
        panlblObservaciones.add(lblObservaciones);
        JPanel panjtaObservaciones = new JPanel(new FlowLayout(FlowLayout.CENTER));
            JTextArea jtaObservaciones = new JTextArea(5,20);
            jtaObservaciones.setDisabledTextColor(colorInhabilitados);
            JScrollPane scrollObservaciones = new JScrollPane(jtaObservaciones);
            scrollObservaciones.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);         //Barra de desplamiento vertical siempre visible
            scrollObservaciones.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);      //Barra de desplamiento horizontal nunca visible
        panjtaObservaciones.add(scrollObservaciones);

        Box boxHFichaDireccion = Box.createHorizontalBox();
        Box boxVColumna1Ficha3 = Box.createVerticalBox();
        Box boxHColumna2Ficha3 = Box.createVerticalBox();

        boxVColumna1Ficha3.add(Box.createVerticalStrut(10));
        boxVColumna1Ficha3.add(panNacionalidad);
        boxVColumna1Ficha3.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha3.add(panEstado);
        boxVColumna1Ficha3.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha3.add(panDireccion);
        boxVColumna1Ficha3.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha3.add(panCP);

        boxHColumna2Ficha3.add(Box.createVerticalStrut(8));
        boxHColumna2Ficha3.add(panlblObservaciones);
        boxHColumna2Ficha3.add(panjtaObservaciones);
        JPanel panboxVColumna2Ficha3 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panboxVColumna2Ficha3.add(boxHColumna2Ficha3);

        boxHFichaDireccion.add(Box.createHorizontalStrut(10));
        boxHFichaDireccion.add(boxVColumna1Ficha3);
        boxHFichaDireccion.add(Box.createHorizontalStrut(20));
        boxHFichaDireccion.add(panboxVColumna2Ficha3);

        panFicha3.add(boxHFichaDireccion);
        ImageIcon iconoFicha3 = new ImageIcon(getClass().getResource("iconoFichaDireccion.gif"));
        jtpDatosEmpleado.addTab("Direccion", iconoFicha3, panFicha3,"Direccion del empleado");

        JPanel panFichas = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JPanel panFichass = new JPanel(new BorderLayout());
        panFichass.add(jtpDatosEmpleado,BorderLayout.CENTER);
        boxVFichas.add(panFichass);
        panFichas.add(boxVFichas);

        Box boxHNombresYFichas = Box.createHorizontalBox();
        boxHNombresYFichas.add(Box.createHorizontalStrut(15));
        boxHNombresYFichas.add(panboxVListaNombres);
        boxHNombresYFichas.add(boxVFichas);

        Box boxHNavegacion = Box.createHorizontalBox();
        JButton btnPrimero = new JButton();
        ImageIcon iconoPrimero = new ImageIcon(getClass().getResource("icono_primero.gif"));
        btnPrimero.setIcon(iconoPrimero);
        btnPrimero.setMargin(new Insets(0, 15, 0, 15));
        JButton btnAnterior = new JButton();
        ImageIcon iconoAnterior = new ImageIcon(getClass().getResource("icono_atras.png"));
        btnAnterior.setIcon(iconoAnterior);
        btnAnterior.setMargin(new Insets(0, 20, 0,20));
        JButton btnSiguiente = new JButton();
        ImageIcon iconoSiguiente = new ImageIcon(getClass().getResource("icono_siguiente.png"));
        btnSiguiente.setIcon(iconoSiguiente);
        btnSiguiente.setMargin(new Insets(0, 20, 0, 20));
        JButton btnUltimo = new JButton();
        ImageIcon iconoUltimo = new ImageIcon(getClass().getResource("icono_ultimo.gif"));
        btnUltimo.setIcon(iconoUltimo);
        btnUltimo.setMargin(new Insets(0, 15, 0,15));
        JLabel lblContadorEmpleados = new JLabel("Empleado 3 de 10");
        lblContadorEmpleados.setFont(new Font("Arial",Font.BOLD,16));
        lblContadorEmpleados.setForeground(Color.BLUE);
        JButton btnGuardar = new JButton();
        ImageIcon iconoGuardar = new ImageIcon(getClass().getResource("icono_guardar.png"));
        btnGuardar.setIcon(iconoGuardar);
        btnGuardar.setMargin(new Insets(0, 6, 0,6));
        btnGuardar.setToolTipText("Guardar modificaciones");
        JButton btnCancelar = new JButton();
        ImageIcon iconoCancelar = new ImageIcon(getClass().getResource("Icono_cancelar.gif"));
        btnCancelar.setIcon(iconoCancelar);
        btnCancelar.setMargin(new Insets(5, 5, 5,5));
        btnCancelar.setToolTipText("Cancelar modificar");

        boxHNavegacion.add(Box.createHorizontalStrut(30));
        boxHNavegacion.add(btnPrimero);
        boxHNavegacion.add(Box.createHorizontalStrut(30));
        boxHNavegacion.add(btnAnterior);
        boxHNavegacion.add(Box.createHorizontalStrut(30));
        boxHNavegacion.add(btnSiguiente);
        boxHNavegacion.add(Box.createHorizontalStrut(30));
        boxHNavegacion.add(btnUltimo);
        boxHNavegacion.add(Box.createHorizontalStrut(30));
        boxHNavegacion.add(lblContadorEmpleados);
        boxHNavegacion.add(Box.createHorizontalStrut(40));
        boxHNavegacion.add(btnGuardar);
        boxHNavegacion.add(Box.createHorizontalStrut(30));
        boxHNavegacion.add(btnCancelar);
        JPanel panNavegacion = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panNavegacion.add(boxHNavegacion);

        //Agregamos el rotulo y luego los botones
        boxContenidoVertical.add(panRotuloPrincipal);
        boxContenidoVertical.add(Box.createVerticalStrut(5));
        boxContenidoVertical.add(panBotonesPrincipales);
        boxContenidoVertical.add(Box.createVerticalStrut(5));
        boxContenidoVertical.add(panBusquedaYNombre);
        boxContenidoVertical.add(Box.createVerticalStrut(5));
        boxContenidoVertical.add(boxHNombresYFichas);
        boxContenidoVertical.add(Box.createVerticalStrut(20));
        boxContenidoVertical.add(panNavegacion);

        //Todo el contenido del JFrame esta en un JPanel
        JPanel panContenidoVertical = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panContenidoVertical.add(boxContenidoVertical);
        add(panContenidoVertical);

    	// ########### ESCUCHADOR BOTON REGRESAR   ##########
    	ActionListener escuchadorRegresar = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
				JfrPrincipal.mostrar();
				setVisible(false);
        	}
   		};
    	btnCerrarEmpleados.addActionListener(escuchadorRegresar);

// ##################### ESCUCHADOR DE VENTANA ####################################################################################
    //Para que al dar clic en la x de la esquina de este JFrame se muestre por default la ventana principal
	this.addWindowListener(new WindowAdapter() {

			public void windowClosing(WindowEvent e)
			{
				JfrPrincipal.mostrar();
				setVisible(false);
			}

			public void windowClosed(WindowEvent e)
			{
				JfrPrincipal.mostrar();
				setVisible(false);
			}
		});

    }

    public void mostrar()
    {
    	this.setLocationRelativeTo(this);	//Centramos este JFrame en la pantalla
    	setVisible(true);
    }
}

y aca los pantallazos de la ejecucion del codigo de esta clase:

Ficha Datos Laborales

Ficha Datos personales

Ficha Direccion

hasta pronto.
}

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.
}