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.

Ventana basica para graficar en Java (Graphics)

En esta ocasion quiero mostrar una propuesta de una ventana para graficar en Java y un resumen de metodos de la Clase java.awt.Graphics. Esto se me ocurrio ya que llevo la materia de graficacion y tuve que hacer uso de estos metodos para crear un dibujo sencillo. Bueno, sin mas que decir, el codigo es este:

/*
 *		Instituto Tecnologico de Zacatepec, Mor.
 * Descripcion:
 *	 Crea una ventana muy basica para graficar, y da 
 *  un resumen de metodos para graficar.
 * @author: Gonzalo Silverio gonzasilve@gmail.com
 * Archivo: PrimitivasJava.java
 * 
 */
 
import java.io.*;
import java.lang.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

class PrimitivasJava extends Frame
{
	
   PrimitivasJava(String titulo,int ancho,int alto)
   {       
    	setTitle(titulo);
    	setBackground(new Color(0x00,0x00,0x00) );
    	setSize(ancho,alto);
		setLocationRelativeTo(null);	//Centrar
		setResizable(false);
		
		// ### ESCUCHADOR DE VENTANA ###
    	//Para que al dar clic en la x de la esquina de este Frame se cierre
		addWindowListener(new WindowAdapter() 
		{		
			public void windowClosing(WindowEvent e) 
			{
				System.exit(0);
			}

			public void windowClosed(WindowEvent e) 
			{
				System.exit(0);			
			}
		});
	}

	public void paint(Graphics g)
	{

//		AQUI VA TODO EL CODIGO PARA GRAFICAR
//		Aqui se pueden usar las primitivas de graficacion
//		de la clase Graphics

//		A continuacion pongo un resumen de metodos de esta clase 
//		y algunas clases relacionadas.
		
//		g.drawLine(x1, y1, x2, y2); 
//		g.drawRect(x, y, ancho, alto);
//		g.fillRect(x, y, ancho, alto); 
//		g.drawOval(x, y, ancho, alto); 
//		g.fillOval(x, y, ancho, alto);  
//		g.drawArc( x, y, ancho, alto, startAngle, arcAngle); 
//		g.fillArc( x, y, ancho, alto, startAngle, arcAngle);  
//		g.drawString(String s, Posx, Posy);
		 
//		g.setColor(Color c);		establece el color de 1er plano
//		g.setFont(Font f); 		establece la fuente
		 
//		g.drawPolyline(int xPuntos[], int yPuntos[], nPuntos);
//		g.drawPolygon( int xPuntos[], int yPuntos[], nPuntos);
//		g.drawPolygon( poly);
//		g.fillPolygon( int xPuntos[], int yPuntos[], nPuntos); Poligono relleno
		
//		Las constantes de color son las siguientes:
		
//		Color.BLACK, Color.WHITE, Color.DARK_GRAY, Color.GRAY, 
//		Color.LIGHT_GRAY, Color.BLUE, Color.CYAN, Color.GREEN, 
//		Color.RED, Color.MAGENTA, Color.PINK, Color.ORANGE, 
//		Color.YELLOW, Color.BLUE, Color.CYAN  
		
//		Para crear un color (los enteros r,g,b pueden ir de 0 a 255):
//		Color miColor = new Color(int r, int g, int b);
		
//		Otra clase mas avanzada que Graphics es la clase javax.swing.Graphics2D

	}
	
	public void mostrar()
	{
		setVisible(true);
	}
	
	//Punto de entrada del programa
	public static void main(String args[])
	{
		PrimitivasJava test=new PrimitivasJava("Ventana para graficar en Java",400,400);
		test.mostrar();
   }        
   			
}

Y la ventana que se genera cuando se ejecuta el codigo anterior es esta:

JFrame listo para graficar

JFrame listo para graficar

Como se observa es una ventana al cual le he establecido un fondo negro y esta lista para usar cualquiera de los metodos de la clase Graphics. A continuacion muestro un ejemplo de un dibujo muy basico donde se usan algunos de estos metodos, el codigo:

/*
    	Instituto Tecnologico de Zacatepec, Mor.
   Descripcion:
		Ejemplo graficacion muy basico acerca del uso de los 
		metodos de la clase Graphics
   author: Gonzalo Silverio gonzasilve@gmail.com
   Archivo: GraficacionEjemplo1.java
  */
 
import java.io.*;
import java.lang.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

class GraficacionEjemplo1 extends Frame
{
	
   GraficacionEjemplo1(String titulo,int ancho,int alto)
   {       
    	setTitle(titulo);
    	setBackground(new Color(0xff,0x67,0x65) );
    	setSize(ancho,alto);
		setLocationRelativeTo(null);	//Centrar
		setResizable(false);
		
		// ### ESCUCHADOR DE VENTANA ###
    	//Para que al dar clic en la x de la esquina de este Frame se cierre
		addWindowListener(new WindowAdapter() 
		{		
			public void windowClosing(WindowEvent e) 
			{
				System.exit(0);
			}

			public void windowClosed(WindowEvent e) 
			{
				System.exit(0);			
			}
		});
	}

	public void paint(Graphics g)
	{

		//pared izquierda del cuarto
		Polygon poligono=new Polygon();
		poligono.addPoint(5, 30);
		poligono.addPoint(102, 100);
		poligono.addPoint(102, 450);
		poligono.addPoint(5, 500);
		g.setColor(new Color(0x17,0xA2,0xFF));
		g.fillPolygon(poligono);
    	
    	
		//puerta del cuarto
		Polygon puerta=new Polygon();
		puerta.addPoint(40, 190);
		puerta.addPoint(98, 215);
		puerta.addPoint(98, 453);
		puerta.addPoint(40, 482);
		g.setColor(new Color(0xC7,0xF2,0xB0));
		g.fillPolygon(puerta);
		
		Polygon Marcopuerta=new Polygon();
		Marcopuerta.addPoint(40, 190);
		Marcopuerta.addPoint(98, 215);
		Marcopuerta.addPoint(98, 453);
		Marcopuerta.addPoint(40, 482);
		g.setColor(new Color(0x00,0x00,0x00));
		g.drawPolygon(Marcopuerta);
		
		
		//perilla del la puerta
		g.setColor(new Color(0xA0,0x00,0x0A));
		g.fillOval(40,350,10,10);
		
    	//Fondo del cuarto
    	g.setColor(new Color(0x17,0xA2,0xFF));
    	g.fillRect(103,100,596,350);
    	
    	//pared derecha del cuarto
		Polygon poligono2=new Polygon();
		poligono2.addPoint(700, 100);
		poligono2.addPoint(700, 450);
		poligono2.addPoint(795, 500);
		poligono2.addPoint(795, 30);
		g.setColor(new Color(0x17,0xA2,0xFF));
		g.fillPolygon(poligono2);
		
		//techo del cuarto
		Polygon poligono3=new Polygon();
		poligono3.addPoint(3, 27);
		poligono3.addPoint(102, 99);
		poligono3.addPoint(699, 99);
		poligono3.addPoint(798, 26);
		g.setColor(Color.WHITE);
		g.fillPolygon(poligono3);
		
		//Lampara colgante
		//-------- Soporte y cuerdas  ----------
		g.setColor(Color.GRAY);		
		g.fillRect(386,60,3,15);	
		g.fillArc(380,50,15,15,0,-180);
		g.drawLine(362,78,412,68);
		g.drawLine(376,68,400,78);
		g.fillRect(361,78,2,50);	//cuerda lampara1
		g.fillRect(412,68,2,40);	//cuerda lampara2
		g.fillRect(375,68,2,30);	//cuerda lampara3
		g.fillRect(400,78,2,55);	//cuerda lampara4
		
		
		//Lamparas
		//-------- Lamparas  ----------
		g.setColor(Color.WHITE);
		g.fillArc(352,128,20,45,0,180);	//lampara1
		g.fillArc(403,108,20,45,0,180);	//lampara2
		g.fillArc(366,98,20,45,0,180);	//lampara3
		g.fillArc(391,133,20,45,0,180);	//lampara4
		
		//Mesa
		g.setColor(new Color(0xFF,0x7B,0xEB));	//		base mesa
		g.fillOval(398,485,80,30);
		g.setColor(new Color(0x67,0x61,0xFF));	//		soporte
		g.fillRoundRect(430,400,20,100,5,5);		
		g.setColor(new Color(0xC7,0x5E,0xA3));	//		Mesa
		g.fillOval(300,350,280,60);
		g.setColor(new Color(0xA5,0x32,0x92));	
		g.fillOval(309,345,263,60);
		
		//Laptop
		
		Polygon poligono4 = new Polygon();		//Pantalla
		poligono4.addPoint(385, 315);
		poligono4.addPoint(445,320);
		poligono4.addPoint(450, 365);
		poligono4.addPoint(390, 360);
		g.setColor(Color.WHITE);
		g.fillPolygon(poligono4);
		
		Polygon polPant = new Polygon();		//borde Pantalla
		polPant.addPoint(385, 315);
		polPant.addPoint(445,320);
		polPant.addPoint(450, 365);
		polPant.addPoint(390, 360);
		g.setColor(Color.BLACK);
		g.drawPolygon(polPant);
		
		
		Polygon poligono5 = new Polygon();		//CPU
		poligono5.addPoint(390, 360);
		poligono5.addPoint(450, 365);		
		poligono5.addPoint(430, 400);
		poligono5.addPoint(370, 390);
		//poligono5.addPoint(315, 485);
		g.setColor(Color.WHITE);
		g.fillPolygon(poligono5);
		
		Polygon polCPU = new Polygon();		//borde C.P.U.
		polCPU.addPoint(390, 360);
		polCPU.addPoint(450, 365);		
		polCPU.addPoint(430, 400);
		polCPU.addPoint(370, 390);
		g.setColor(Color.BLACK);
		g.drawPolygon(polCPU);

		//Ventanas		
		g.setColor(new Color(0x89,0x49,0x32));
		g.fillRect(500,150,180,170);	//Marco cafe de la ventana
		g.setColor(Color.BLACK);
		g.fillRect(505,175,170,140);	//Fondo noche de la ventana
		g.fillArc(505,155,80,40,0,180);
		g.fillArc(595,155,80,40,0,180);		
			//Luna
		g.setColor(Color.WHITE);
		g.fillOval(625,165,40,40);
		g.setColor(Color.BLACK);
		g.fillOval(635,165,40,40);
		g.setColor(new Color(0x89,0x49,0x32));
		g.fillRect(505,240,170,2);  //Linea horizontal ventanas
		g.fillRect(545,150,2,165);  //Linea vertical ventana 1
		g.fillRect(633,150,2,165); //Linea vertical ventana 2		
		g.fillRect(585,175,10,140);	//Linea divisoria de las 2 ventanas
		
		

		g.setFont( new Font("Arial",Font.PLAIN,24 ));
		g.setColor(Color.BLUE);
		g.drawString("Gonzalo Silverio",250,580);
	}
	
	public void mostrar()
	{
		setVisible(true);
	}
	
	//Punto de entrada del programa
	public static void main(String args[])
	{
		GraficacionEjemplo1 test=new GraficacionEjemplo1("Ejemplo de primitivas graficas en JAVA",800,600);
		test.mostrar();
   }        
   			
}  	//Fin del ejemplo

Y el resultado es este:

Ejemplo del uso de primitivas graficas en Java

Ejemplo del uso de primitivas graficas en Java



Espero te sirva algo de esto, recuerda que comentar=agradecer. Haa y ya sabes, si quieres los .java basta con dejar tu e-mail. Hasta pronto.

Autenticacion de usuarios en java con MySQL

En algunos sistemas a veces un requerimiento es que se manejen prinvilegios y por lo tanto usuarios, este es un ejemplo muy sencillo que muestra como se podria autentificar a los usuarios para entrar al sistema. Sin mas rodeos muestro el ejemplo y espero que a alguien mas le sirva, primero que nada quiero mostrar la estructura de la tabla que se usa en este programa.

Aca la imagen:

 

Estructura de tabla de usuarios

Estructura de tabla de usuarios

Aca la imagen de la ventana de login, obviamente el usuario escribe su nombre de usuario (previamente asignado por el administrador del sistema) y su password. y debe dar click en el boton aceptar para entrar:

 

Ventana de login

Ventana de login

en caso de que el usuario haya introducido algun dato incorrecto se mostrara un mensaje avisando, igualmente se mostrara un mensaje correspondiente cuando se deje algun campo vacio:

 

Mensaje error ventana login

Mensaje error ventana login

en caso de que el usuario escriba los datos correctos se debe mostrar la interfaz principal del sistema, que en este caso e diseñado una muy sencilla y es esta:

 

Ventana principal del sistema

Ventana principal del sistema

Por ultimo muestro el codigo de de la ventana de login
VentanaLogin.java

 
//				Instituto Tecnologico de Zacatepec
//  	Descripcion:  Ventana de login para autenticar un usuario para accesar a un sistema
//  	Author: Gonzalo Silverio   gonzasilve@hotmail.com
//		Archivo: VentanaLogin.java


package testmysql;
import javax.swing.*;
import java.io.*;
import java.sql.*;
import java.awt.Panel.*;
import java.awt.*;
import java.awt.event.*;

public class VentanaLogin extends JFrame
{
        private JTextField txtUser, txtPass;
        private JLabel lblUser, lblPass;
        private JButton btnAceptar, btnCancelar;
        String usuario, elPassword;

    VentanaLogin()
    {

        Container contenedor = getContentPane();
        contenedor.setLayout(new FlowLayout());

        // crear etiqueta y cuadro de texxto del usuario
        txtUser = new JTextField(10);
        lblUser = new JLabel("Usuario: ");
        txtUser.setToolTipText("Escriba su nombre de usuario");        
        contenedor.add( Box.createVerticalStrut(50) );
        contenedor.add(lblUser);
        contenedor.add(txtUser);

        //crear etiqueta y cuadro de texxto del pw
        txtPass = new JPasswordField(10);
        lblPass = new JLabel("Contraseña: ");
        txtPass.setToolTipText("Escriba su contraseña");
        contenedor.add(lblPass);
        contenedor.add(txtPass);

        //Crear y agregar los botones 
        btnAceptar = new JButton("Aceptar");
        //establecer Boton aceptar por defecto
        getRootPane().setDefaultButton(btnAceptar);

        btnCancelar = new JButton("Cancelar");
        contenedor.add(btnAceptar);
        contenedor.add(btnCancelar);



      // Crear un escuchador al boton Aceptar 
    	ActionListener escuchadorbtnAceptar = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
                try
                {                    
                    //chekar si el usuario escrbio el nombre de usuario y pw
                    if (txtUser.getText().length() > 0 && txtPass.getText().length() > 0 )
                    {
                        // Si el usuario si fue validado correctamente
                        if( validarUsuario( txtUser.getText(), txtPass.getText() ) )    //enviar datos a validar
                        {
                            // Codigo para mostrar la ventana principal
                            setVisible(false);
                            VentanaPrincipal ventana1 = new VentanaPrincipal();
                            ventana1.mostrar();


                        }
                        else
                        {
                            JOptionPane.showMessageDialog(null, "El nombre de usuario y/o contrasenia no son validos.");
                            JOptionPane.showMessageDialog(null, txtUser.getText()+" " +txtPass.getText() );
                            txtUser.setText("");	//limpiar campos
                            txtPass.setText("");        
                            
                            txtUser.requestFocusInWindow();
                        }

                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null, "Debe escribir nombre de usuario y contrasenia.\n" +
                            "NO puede dejar ningun campo vacio");
                    }

                } catch (Exception e)
                {
                    e.printStackTrace();
                }
         		
        	}
   		};
    	btnAceptar.addActionListener(escuchadorbtnAceptar);      // Asociar escuchador para el boton Aceptar


      // Agregar escuchador al boton Cancelar
    	ActionListener escuchadorbtnCancelar=new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
         		System.exit(0);         // terminar el programa
        	}
   		};
    	btnCancelar.addActionListener(escuchadorbtnCancelar);      // Asociar escuchador para el boton Cancelar
        setTitle("Autentificacion de usuarios");
        setSize(400,150);           // Tamanio del Frame 
        setResizable(false);       // que no se le pueda cambiar el tamanio 
        //Centrar la ventana de autentificacion en la pantalla
        Dimension tamFrame=this.getSize();//para obtener las dimensiones del frame
        Dimension tamPantalla=Toolkit.getDefaultToolkit().getScreenSize();      //para obtener el tamanio de la pantalla
        setLocation((tamPantalla.width-tamFrame.width)/2, (tamPantalla.height-tamFrame.height)/2);  //para posicionar
        setVisible(true);           // Hacer visible al frame 

    }   // fin de constructor

    // Metodo que conecta con el servidor MYSQL y valida los usuarios
    boolean validarUsuario(String elUsr, String elPw)  throws IOException
    {
    	try
		{
   			//nombre de la BD: bdlogin
             //nombre de la tabla: usuarios
             //								id		integer	auto_increment not null     <--llave primaria
             //                   campos:    usuario 	char(25)
             //                              password char(50)
             
            Connection unaConexion  = DriverManager.getConnection ("jdbc:mysql://localhost/bdlogin","root", "root");
            // Preparamos la consulta
            Statement instruccionSQL = unaConexion.createStatement();
            ResultSet resultadosConsulta = instruccionSQL.executeQuery ("SELECT * FROM usuarios WHERE usuario='"+elUsr+"' AND password='"+ elPw+"'");

            if( resultadosConsulta.first() )        // si es valido el primer reg. hay una fila, tons el usuario y su pw existen
                return true;        //usuario validado correctamente
            else
                return false;        //usuario validado incorrectamente
                
		} catch (Exception e)
		{
   			e.printStackTrace();
            return false;
		}

    }
    
    public static void main(String[] args)
    {
        VentanaLogin prueba = new VentanaLogin();
        prueba.setDefaultCloseOperation(prueba.EXIT_ON_CLOSE);
    }

}

y ahora el codigo fuente para crear la ventana principal:


//				Instituto Tecnologico de Zacatepec
//  	Descripcion:  	Ventana principal del sistema del sistema
//  	Author: Gonzalo Silverio   gonzasilve@hotmail.com
//		Archivo: VentanaPrincipal.java


package testmysql;
import javax.swing.*;
import java.awt.*;

public class VentanaPrincipal extends JFrame
{
    VentanaPrincipal()
    {   
    	setSize(400,400);
        setTitle("ventana principal");        
        setLayout(new BorderLayout());
        add(Box.createHorizontalStrut(100),BorderLayout.WEST);
        add(new JLabel("Ventana principal del proyecto "),BorderLayout.CENTER);       
        
        setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

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

}

…bueno hasta pronto y espero te sirva de algo esta cosa ( xD ), comentarios son bienvenidos o si quieres el codigo, ya sabes, basta con dejar tu correo

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
}

A %d blogueros les gusta esto: