martes, 15 de abril de 2008

CONEXIONES A BASES DE DATOS

CONECTAR BASES DE DATOS DESDE JAVA

1. CONECTAR BD ACCESS CON JAVA

JDBC y ODBC

La capacidad para acceder a bases de datos desde Java la ofrece la API JDBC (Java DataBase Conectivity). JDBC es un estándar para manejar bases de datos en Java. ODBC es un estándar de Windows para manejar bases de datos, de forma que cualquier programa en Windows que desee acceder a bases de datos genéricas debe usar este estándar. La necesidad de crear un estándar propio para acceder a bases de datos desde Java se explica porque el estándar ODBC está programado en C y un programa que use este estándar, por lo tanto, depende de la plataforma.

CONTROLADORES JDBC-ODBC

Necesitamos acceder a un origren de datos ODBC pero contamos con una API que usa el estándar JDBC. Para solventar este problema las empresas realizan drivers que traducen el ODBC a JDBC. Hay varios tipos de Driver, pero para nuestro ejemplo usaremos los llamados puentes JDBC-ODBC. Estamos de suerte porque el JDK de Windows incorpora el driver necesario para conectar bases de datos Access.

Crear un nuevo DSN (Data Source Name)

Para realizar la conexión a una base de datos ODBC necesitaremos crear un perfil DSN desde el panel de control y posteriormente accederemos a la base de datos a partir del nombre del perfil. En el perfil DSN lo que se hace es indicar el driver a utilizar, así como el archivo o archivos del origen de datos. Estos son los pasos a llevar a cabo para configurar un perfil DSN.
1.- Iremos a Panel de Control. Ello se hace desde Inicio->Configuración o desde MiPC.
2.- Ahora hacemos doble-click en el icono de Fuentes de datos ODBC (32 bits).
3.- En nuestra pantalla aparecerá ahora la pestaña DSN usuario seleccionada. Para crear un nuevo perfil haremos click en Agregar...
4.- A continuación se nos pide que ingresemos el controlador que vamos a usar en el nuevo perfil. En nuestro caso será Microsoft Access Driver (*.mdb).
5.- Una vez aquí sólo nos queda dar un nombre al origen de datos y especificar el archivo .mdb de origen. Tras aceptar la ventana ya tenemos creado un perfil con lo que ya podemos comenzar a programar.

Clases, objetos y métodos básicos

Lo que necesitamos para hacer nuestro programa es la API JDBC incluida en la última versión del JDK. El paquete a utilizar y el cual deberemos importar es el paquete java.sql
Las primeras líneas de código suelen ser rutinarias ya que siempre serán muy similares.

Cargar el Driver

Lo primero es hacer una llamada al Driver JDBC-ODBC para cargarlo. Eso se consigue con las siguientes líneas de código:
try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); }catch(Exception e){ System.out.println("No se ha podido cargar el Driver JDBC-ODBC"); }
Con esto ya tenemos cargado el Driver. Ahora básicamente trabajaremos con tres objetos. Estos objetos son: Connection, Statement y ResultSet. El objeto Connection se obtiene al realizar la conexión a la base de datos. El objeto Statement se crea a partir del anterior y nos permite ejecutar SQL para hacer consultas o modificaciones en la base de datos. En caso de hacer una consulta (SELECT ... FROM ...) se nos devolverá un objeto que representa los datos que deseamos consultar; este objeto es un objeto ResultSet (Hoja de resultados).

El objeto Connection

Debemos realizar la conexión a nuestro origen de datos. Para ello debemos crear un objeto Connection de la siguiente forma:
Connection con = DriverManager.getConnection("jdbc:odbc:Nombre_Perfil_DSN","Nombre_Usuario", "Contraseña");
Los dos últimos parámetros pueden ser cadenas vacías "" a no ser que la base de datos las requiera. Con esto ya hemos realizado una conexión a nuestra base de datos. Pero esto todavía no es suficiente. Ahora vamos a crear un objeto Statement con el que podremos ejecutar y hacer consultas SQL. Si hasta ahora todo ha sido rutinario a partir de ahora vamos a poder crear código más adaptado a las necesidades de nuestro programa.
El objeto Statement Como se ha dicho, un objeto Statement se crea a partir del objeto Connection antes obtenido. También como se ha dicho un objeto Statement nos permite hacer consultas SQL que nos devuelven una hoja de resultados. Pues bien, según como deseamos que sea esa hoja de resultados (modificable, o no, sensible a las modificaciones o no,...) deberemos crear de una forma u otra el objeto Statement. Más adelante se explican las diferencias entre crearlos de una u otra forma. De momento nos limitaremos ha hacerlo de la forma más sencilla.
Statement stat = con.createStatement();
De esta forma muy simple hemos creado un objeto Statement. Ahora podemos usar este objeto Statement para hacer modificaciones en la base de datos a través del lenguaje SQL. Para realizar modificaciones, es decir, instrucciones INSERT, UPDATE o DELETE, se usa el método executeUpdate pasando como parámetro una cadena de texto String que contenga la instrucción SQL.
Para hacer una consulta, es decir, una instrucción SELECT debemos usar otro método: el método executeQuery que como el anterior se le ha de pasar un String que contenga la instrucción. Este método nos devuelve un objeto ResultSet que contiene los datos obtenidos. Este objeto será diferente según como hayamos creado el objeto Statement. En el ejemplo anterior hemos usado un método muy simple de Connection para crear el objeto Statement, pero hay otras formas de crearlo. Estas son y estas son las características que aportan a la hoja de resultados de una consulta:
El método anteriormente utilizado es el siguiente: createStatement(), pero existe el mismo método al que le podemos pasar dos parámetros. En la documentación se expresa así: createStatement(int resultSetType, int resultSetConcurrency). Los posibles valores a pasar son campos de la clase ResultSet. Por ejemplo para el parámetro resultSetType podemos elegir que el objeto ResultSet se pueda mover (entre registros) sólo hacia delante (ResultSet.TYPE_FORWARD_ONLY), que se pueda mover pero que cuando se actualice, aunque los cambios ya hayan sido reflejados en la base de datos, el ResultSet no los 'sienta' (ResultSet.TYPE_SCROLL_INSENSITIVE) o que se pueda mover y que los cambios si que se reflejen también en él (ResultSet.TYPE_SCROLL_SENSITIVE). Para el parámetro resultSetConcurrency podemos establecer dos valores diferentes: ResultSet.CONCUR_READ_ONLY si queremos que los datos se puedan leer pero no actualizar, y ResultSet.CONCUR_UPDATABLE si queremos permitir que la base de datos sea actualizable mediante el objeto ResultSet. Si no se usa el método sin parámetros el objeto será TYPE_FORWARD_ONLY y CONCUR_READ_ONLY.

El objeto ResultSet: Hoja de resultados

Moverse por la hoja de resultados

Al hablar de posición del cursor nos referimos a la posición dentro de los datos del objeto ResultSet. Lo primero que hay que saber es que el cursor tiene tantas posiciones como filas tenga la consulta y dos más que se sitúan antes de la primera fila y después de la última. Nada más crear un objeto ResultSet, la posición del cursor es la anterior a la primera fila.
Para mover el cursor a la posición siguiente usaremos el método next() que nos devuelve una variable booleana: sí, si se ha podido mover; no, si no ha sido posible el desplazamiento. Nos devolverá false si estamos en el último registro (el posterior al último). Para movernos hacia atrás tenemos un método muy similar: el método previous() que al igual que el anterior nos devuelve un valor booleano que será false si estamos en el registro anterior al primero. Estos métodos nos permiten movernos de forma relativa por la hoja de resultados; si deseamos movernos a un registro determinado usaremos el método absolute(int numero_fila), que también nos devuelve un valor boolean. Además tenemos otros métodos que son: afterLast(), que mueve el cursor a la fila posterior a la última; beforeFirst() que mueve el cursor a la fila anterior a la primera; last() que mueve el cursor a la última fila; first() que mueve el cursor a la primera fila. Todos ellos devuelven un valor booleano.

Obtener datos de la hoja de resultados


Para acceder a los datos de la hoja de resultados usamos los métodos get...(int numeroColumna) o get...(String nombreColumna). Estos métodos nos devuelven el valor que indica el nombre del método (por ejemplo tenemos: getString, getInt, getDate, ...) indicando el número o el nombre de la columna. Hay que tener en cuenta que el número de columna es el número de columna en la hoja de resultados y por tanto se establece con el orden en el que se han incluido las columnas en la instrucción SELECT. Por ejemplo si hemos hecho la consulta de la siguiente forma: SELECT Nombre, Apellidos ... la columna Nombre será la primera y la columna Apellidos será la segunda independientemente de cómo estén situadas en la base de datos. Si hacemos un SELECT * FROM ..., en ese caso las columnas estarán en el orden en el que están en la base de datos.

Modificar la base de datos con el objeto ResultSet

Hemos dicho que mediante el objeto Statement podemos ejecutar sentencias SQL para modificar la base de datos y hacer consultas, por lo que podemos usar el lenguaje SQL para hacer cualquier operación en la base de datos; pero además tenemos métodos especializados que nos permiten hacer estas mismas tareas sin usar el lenguaje SQL. Para ello se usan los métodos especializados del objeto ResultSet. Por tanto si deseamos modificar la base de datos a través de Java, sin utilizar SQL, lo primero que deberemos hacer es realizar una consulta SQL para obtener el objeto ResultSet (parece un poco paradógico). Ahora sólo nos queda usar los métodos especializados de este objeto.
Por ejemplo podemos usar deleteRow() para borrar una fila.
Para actualizar una fila se usan los métodos update...(NombreColumna, valor) o update...(NumeroColumna, valor), así podemos encontrar updateFloat, updateString, ... Para que los cambios se reflejen en la base de datos se debe llamar al método updateRow() o cancelRowUpdates() si queremos cancelar la actualización.
resultset.updateString("Nombre", "PEPE");resultset.updateRow();
Para insertar una fila nos hemos de mover a un lugar del cursor especial con el método toInsertRow(), una vez allí usaremos los métodos update... explicados antes y para reflejar esta actualización llamar al método insertRow().[1]

[1]. http://www.gamarod.com.ar/articulos/como_conectar_java_y_access.asp


CONECTAR BD ORACLE CON JAVA

Para poder conectar a Java con ORACLE lo primero que necesitamos es la implementación de JDBC para ORACLE. Esta implementación se encuentra en el archivo Classes12.jar,
ORACLE_HOME es una variable de entorno que se crea durante la instalación del servidor ORACLE, y que indica donde está instalado fisicamente ORACLE dentro del sistema de archivos, normalmente C:\oracle\ora92 para servidores Windows y ORACLE 9i. Esta .misma nomenclatura se aplica al hablar de la instalación cliente
Debemos configurar correctamente nuestra variable CLASSPATH para incluir en ella el archivo Classes12.jar.
Oracle proporciona los siguientes drivers en su implementacion JDBC:
JDBC Thin Driver: No requiere de la instalación cliente de ORACLE. Ideal para Applets.
JDBC OCI :API nativa de ORACLE, para aplicaciones J2EE.
JDBC KPRB driver: (default connection) para Java Stored Procedures y Database JSP's.
Todos los drivers soportan la misma sintaxis y funcionalidad, por lo que nuestro código variará únicamente en la forma de crear la conexion.
Conectar a ORACLE con JDBC Thin Driver
El driver JDBC Thin se conecta y comunica con ORACLE a nivel de sockets. Proporciona su propia versión del protocolo Net8 (SQL*Net) sobre TCP/IP, por lo que no es necesario que exista una instalación de la parte cliente de ORACLE. Dado que este driver es código 100% Java es completamente independiente de la plataforma de ejecución, y como implementa su propia versión del protocolo es ideal para aplicaciones que se ejecutan sobre un navegador Web (applets)
import java.sql.*; class dbAccess {public static void main (String args []) throws SQLException {DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@WIN01:1521:oracleBD", "user", "passw");//driver@machineName:port:SID , userid,password Statement stmt = conn.createStatement();ResultSet rset=stmt.executeQuery("select BANNER from SYS.V_$VERSION");while (rset.next())

System.out.println (rset.getString(1));

// Print col 1 stmt.close(); } }
Conectar a ORACLE con JDBC OCI Driver
El driver JDBC OCI usa el API ORACLE OCI (Oracle Call Interface) para interactuar con ORACLE, por lo que es necesaria la instalación y configuración de la parte cliente de ORACLE. El driver OCI trabaja con SQL*Net o Net8, por lo que tamdebemos haber creado un alias en el archivo TNS names (%ORACLE_HOME%\network\ADMIN):
ORACLEBD=(DESCRIPTION= ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=WIN01)(PORT=1521)))CONNECT_DATA =(SERVICE_NAME = ORACLEBD) ) )
El driver JDBC OCI permite realizar llamadas a ORACLE OCI directamente desde Java proporcionandoun alto grado de compatibilidad con una versión específica de ORACLE utilizando métodos nativos, pero específicos de la plataforma.
import java.sql.*;

class dbAccess { public static void main (String args []) throws SQLException { try { Class.forName ("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); }
Connection conn = DriverManager.getConnection ("jdbc:oracle:oci:@ORACLEBD", "user", "passw");//@TNSNames_Entry, userid, password Statement stmt = conn.createStatement(); ResultSet rset = stmt.executeQuery("select BANNER from SYS.V_$VERSION");

while (rset.next()) System.out.println (rset.getString(1));// Print col 1 stmt.close(); } }
Conectar a ORACLE con JDBC KPRB Driver.
Por último el driver ORACLE JDBC KPRB es utilizado para escribir en Java procedimientos almacenados, funciones, triggers ... Ofrece acceso a la conexion activa por lo que no es necesario crear ninguna conexión adicional.
El driver JDBC KPRB de ORACLE permite obtener un handle de la conexion actual del contexto a través del método OracleDriver.defaultConenction(). Como hemos dicho, se utiliza para procedimientos almacenados, triggers .... Para ejecutar un procedimiento almacenado debemos estar conectados a ORACLE a través de una herramienta cliente como SQL*Plus., lo que hacemos con defaultConenction() es acceder a está conexion.
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED BANNER ASimport java.sql.*;class dbAccess{ public static String showBanner() throws SQLException { String banner=""; Connection conn = (new oracle.jdbc.driver.OracleDriver()).defaultConnection();
Statement stmt = conn.createStatement(); ResultSet rset = stmt.executeQuery("select BANNER from SYS.V_$VERSION"); while (rset.next()) banner += rset.getString(1);//stmt.close(); NO CERRAR LA CONEXION return banner; }}
Es necesario crear un "wrapper" para poder ejecutar el programa desde PL/SQL o SQL.
CREATE OR REPLACE FUNCTION ShowBanner RETURN VARCHAR2ISLANGUAGE JAVA NAME 'dbAccess.showBanner() return java.lang.String';
Una vez hecho esto, podemos ejecutar la función como si se tratase de una función PL/SQL.
SELECT ShowBanner FROM DUAL;
http://www.devjoker.com/contenidos/Articulos/132/Como-conectar-a-ORACLE-con-Java.aspx

CONECTAR JAVA CON MYSQL

Para poder conectar java con una base de datos (MySQL en este ejemplo), necesitamos el Driver o Connector de la base de datos. Este Driver puede habitualmente bajarse de la página web de la base de datos. Por ejemplo, el de MySQL se puede bajar de http://dev.mysql.com/downloads/connector/j/5.0.html.
En el zip que nos bajamos hay dentro un java-mysql-connector-5.0.5-bin.jar que es el que tiene dentro del Driver. Debemos poner este jar accesible a nuestro proyecto java:
Poniéndolo en $JAVA_HOME/lib/ext/ y así será accesible por defecto para siempre. Esta opción no es aconsejable, puesto que este jar estará disponible para todas las aplicaciones que corramos en el ordenador, lo necesiten o no. Si no somos cuidadosos, podemos tener conflictos entre distintas versiones o con otros jar que pongamos que ahí.
Poniéndolo en el CLASSPATH
Añadiéndolo a nuestro proyecto del IDE que usemos.
Una vez accesible, para conectarse a la base de datos hacemos esto
import java.sql.Connection;
import java.sql.DriverManager;
...
try
{
Class.forName("org.gjt.mm.mysql.Driver");
Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost/agenda", "root", "LA_PASSWORD"); ...
[3]http://www.chuidiang.com/chuwiki/index.php?title=Conectar_java_con_mysql


CONECTAR BD POSTGRES CON JAVA

import java.sql.*;class Prueba { public static void main (String args[]) { // Comprobamos que nos han pasado el user y el password if (args.length != 2) { System.out.println("Error: prueba "); System.exit(1);

}
// Cargamos el driver para postgresql try { Class.forName("org.postgresql.Driver"); } catch (ClassNotFoundException e1) { System.out.print("Prueba (cargando driver): ");

e1.getMessage(); e1.printStackTrace(); System.exit(1); }
Connection db = DriverManager.getConnection ("jdbc:postgresql://localhost:5432/sdft", args[0], args[1]);
Statement st = db.createStatement(); ResultSet rs = st.executeQuery("SELECT * FROM prueba");
db.setAutoCommit(false); Statement st = conn.createStatement(); st.setFetchSize(5); ResultSet rs = st.executeQuery("SELECT * FROM mytable")
// Consultamos los datos devueltos for (int i = 1; rs.next(); i++) { System.out.print("En la columna " + i + " tenemos un "); System.out.println(rs.getInt(1));} // Cerramos la peticion y los datos rs.close(); st.close(); } catch (Exception e) { System.out.print("Prueba (accediento a la base de datos): "); e.getMessage(); e.printStackTrace(); System.exit(1); } }}
[4].

[4].http://deigote.blogspot.com/2006/06/servicios-web-4-instalando-postgresql.html[4]. http://deigote.blogspot.com/2006/06/servicios-web-4-instalando-postgresql.html



JTable

DEFINICIÓN

Al igual que los arboles las tablas son importantes y poderosas. Jtable es una clase que me permite organizar una determinada información en tabla, esta difiere de una base de datos normal porque al utilizar Jtable tu puedes visualizar esta tabla, brindándole a el usuario organización de información, oportunidades de editar y cambiar el tamaño de las columna entre otras.

SUS INICIOS (LOS DE JTABLE)


En principio se creo la clase Jtable para constituir un interfaz ligado a bases de datos a través de "Java Database Connectivity" (JDBC), y así evita la complejidad que existía par el manejo de datos, dando así al programador mucha mas facilidad a la hora de trabajar con este tipo de información.
Jtable le da al programador muchas facilidades, pues este posee varias características que permiten hacer desde tablas con información compleja y muy estructurada hasta tablas con información sencilla y "básica".
TABLE MODEL
La clase Jtable controla como se presentan los datos, siendo el TableModel quien controla los datos sí mismos. para crear una Jtable habrá pues que crear un TableModel antes, normalmente. TableModel lo que hace es predeterminar ciertas características para el Jtable es decir que tu puedes poner ciertos parámetros dentro de un TableModel y así no tener que determinarlos siempre. TableModel es un programa que guarda los datos de la tabla para si mismo, es decir, puede tener la información de la tabla pero estos datos son los visualizados por el computador, es decir, para visualizar una tabla el TABLEMODEL puede tener la información pero sin el Jtable no se puede visualizar para el usuario.
EDITABLE O NO?
Jtable tiene una característica muy llamativa, este permite que el programador pueda decirdir que se edita y que no, sin embargo si el programador dentro de su programa o de su TABLEMODEL no tiene determinado este aspecto, Jtable automáticamente hace editable las celdas dentro de la tabla. Existen varias maneras de hacer editable o no las celdas dentro de la tabla, para ver estos comandos tu te puedes dirigir a Dentro de las celdas encontradas en una tabla se puede permitir al usuario editar o no editar según lo desee el programador, esta propiedad se puede arreglar desde el table model o directamente y/o desde el programa. Jtable tiene la propiedad de dejar editable las celdas si no encuentra nada que hable de esto.



..."Con la llegada de Swing, como parte de la JFC(Java Foundation Classes), la construcción de Interfaces Gráficas de Usuario(GUI) recibió un excelente conjunto de componentes (aproximadamente 40)que la mejoraron: desde el siempre utilizado JButton, hasta el flexible JEditorPane o el JDesktopPane, pasando por los JTree y los JTable; sin dejar de mencionar a los JFilechooser y los JDialog, todos ellos, y los componentes restantes, permiten la creación de aplicaciones con interfaces gráficas más intuitivas y completas.
Swing es el resultado de la unión de esfuerzos entre
Netscape, con su Internet Foundation Classes, y SUN. Swing es sólo una parte de la JFC, muchos cometemos el error de creer que Swing y JFC son lo mismo. La JFC contiene también otros elementos, estos son algunos de ellos:
Cortar y Pegar
Elementos de Accesibilidad
Java 2D
Impresión
De todos los componentes que forman Swing, quizá los JTree y las JTable, sean los componentes con APIs más extensas (la clase JTable tiene más de 100
métodos), y quiza también los más complejos.
Afortunadamente esa complejidad les permite ser también de los componentes Swing más personalizables y potentes; al igual que en la mayoría de las otras clases Swing no es necesario conocer todos sus métodos para comenzar a utilizarlos y darles una utilidad práctica.
Como programadores, sabemos muy bien que la presentacion de datos tabulados es una de las tareas más comunes que se presentan al momento de crear interfaces gráficas; desde la simple tabla que permite únicamente mostrar el resultado de una consulta, hasta las que permiten editar directamente el contenido de cada celda, ordenar las columnas, personalizar su apariencia, etc.Todas las tareas antes descritas, y muchas otras, son posibles de realizar utilizando la clase JTable; por supuesto, mientras más complejo sea el requerimiento a cubrir, se requerirá en igual medida utilizar más métodos o recursos de la clase.
Este primer artículo:
Muestra como crear una JTable sencilla para la visualizacion de datos.
Explica que es un modelo de tabla
Muestra como crear una JTable con DefaultTableModel como modelo de tabla
Muestra como crear una JTable con AbstractTableModel como modelo de tabla
Describe la API JTable
Describe la API DefaultTableModel
Describe la API AbstractTableModel
Un Ejemplo Sencillo
El título de este artículo es: JTable con ejemplos; asi que comenzaremos creando una tabla sencilla. Esta tabla únicamente mostrará un conjunto de datos definidos desde su constructor, para ello primero daremos una vistazo rápido a los
constructores que proporciona esta clase; puedes ver al final del artículo con detalle más información.
JTable()
JTable(int numRows, int numColumns)
JTable(Object[][] rowData, Object[] columnNames)
JTable(TableModel dm)
JTable(TableModel dm, TableColumnModel cm)
JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm)
JTable(Vector rowData, Vector columnNames)
Para este primer ejemplo utilizaremos el 3er.
constructor de la lista anterior. El cual nos permite construir una tabla a partir de dos parámetros; el primero de ellos: rowData es un array bidimencional de objetos que representa el contenido de la tabla, y el segundo: columnNames representa los nombres de cada columna, contenidos también en un array que por lo general es un array de String's. Nuestro primer ejemplo tendra las siguientes columnas: String[] columnNames =
{"Nombre", "Apellido", "Pasatiempo", "Años de Practica", "Soltero(a)"};
Y utilizaremos el siguiente array para su contenido: Object[][] data = {
{"Mary", "Campione", "Esquiar", new Integer(5), new Boolean(false)},
{"Lhucas", "Huml", "Patinar", new Integer(3), new Boolean(true)},
{"Kathya", "Walrath", "Escalar", new Integer(2), new Boolean(false)},
{"Marcus", "Andrews", "Correr", new Integer(7), new Boolean(true)},
{"Angela", "Lalth", "Nadar", new Integer(4), new Boolean(false)}
};
El
constructor, entonces queda asi: JTable table = new JTable(data, columnNames);
El código completo de nuestro primer ejemplo es el siguiente:
Ejemplo 1. SimpleTable1.javaimport javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.*;
public class SimpleTable1 extends JFrame {
public SimpleTable1() {
super("Ejemplo 1");
//array bidimencional de objetos con los datos de la tabla
Object[][] data = {
{"Mary", "Campione", "Esquiar", new Integer(5), new Boolean(false)},
{"Lhucas", "Huml", "Patinar", new Integer(3), new Boolean(true)},
{"Kathya", "Walrath", "Escalar", new Integer(2), new Boolean(false)},
{"Marcus", "Andrews", "Correr", new Integer(7), new Boolean(true)},
{"Angela", "Lalth", "Nadar", new Integer(4), new Boolean(false)}
};
//array de String's con los títulos de las columnas
String[] columnNames = {"Nombre", "Apellido", "Pasatiempo",
"Años de Practica", "Soltero(a)"};
//se crea la Tabla
final JTable table = new JTable(data, columnNames);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
//Creamos un JscrollPane y le agregamos la JTable
JScrollPane scrollPane = new JScrollPane(table);
//Agregamos el JScrollPane al contenedor
getContentPane().add(scrollPane, BorderLayout.CENTER);
//manejamos la salida
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
SimpleTable1 frame = new SimpleTable1();
frame.pack();
frame.setVisible(true);
}
}"





..."Para usar tablas, hay que distinguir dos cosas. Por un lado tenemos el JTable, que es lo que vemos. Por otro lado tenemos los datos, que es lo que queremos pintar en el JTable. Los datos pueden guardarse en cualquier clase que implemente TableModel. Java nos ofrece DefaultTableModel, una clase que implementa TableModel y nos permite añadir, modificar y borrar esos datos.La forma sencilla de juntar todo esto es

DefaultTableModelo datos = new DefaultTableModel();

JTable tabla = new JTable(datos);

y ya está.Ahora podemos añadir columnas a nuestros datos llamando adatos.addColumn ("Nombre columna");

y podemos añadir, borrar y modificardatos.addRow ( arrayConLosDatosParaUnaFila );

}datos.removeRow ( fila );

datos.setValueAt (dato, fila, columna)".


JTable
La forma más sencilla de usar un JTable y tener toda su funcionalidad es instanciar un DefaultTableModel y meterlo en el JTable, en el constructor DefaultTableModel modelo = new DefaultTableModel();
JTable tabla = new JTable(modelo);
Podemos añadir columnas directamente en el modelo modelo.addColumn("etiqueta columna 1");
modelo.addColumn("etiqueta columna 2");
Podemos añadir datos directamente en el modelo, así como borrarlos o modificarlos Object [] fila = new Object[2];
fila[0] = "dato columna 1";
fila[1] = "dato columna 3";
modelo.addRow ( fila ); // Añade una fila al final
modelo.setValueAt ("nuevo valor", 0, 1); // Cambia el valor de la fila 1, columna 2.
modelo.removeRow (0); // Borra la primera fila
Todo lo que hagamos se reflejará de inmediato en el JTable.
Obtener fila y columna del JTable en la que se hace click
A veces nos interesa seleccionar una fila del JTable para hacer algo con ella (sacar un menú, recoger datos para mostrarlos en otro sitio, etc).
Una forma de hacerlo es añadiendo un MouseListener al JTable, de esta manera tabla.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
int fila = tabla.rowAtPoint(e.getPoint());
int columna = tabla.columnAtPoint(e.getPoint());
if ((fila > -1) && (columna > -1))
System.out.println(modelo.getValueAt(fila,columna));
}
});
Hemos añadido un MouseAdapter para no tener que implementar todos los métodos del MouseListener.
Con el método tabla.rowAtPoint() es posible enterarnos en qué fila de del JTable ha ocurrido el evento del ratón (el click en este caso). Para ello basta llamar a este método pasándole las coordenadas x,y del evento de ratón, que se obtienen con el método e.getPoint().
Una vez que sabemos la fila, debemos comprobar si es mayor que -1. El método rowAtPoint() nos devuelve -1 si pinchamos en el JTable, pero fuera de cualquier fila. Es el caso de que el JTable tenga un tamaño en pixels superior al que le corresponde según su número de filas.
Lo mismo vale para columnAtPoint().
Una vez que tenemos la fila y sabemos que no es -1, es fácil a través del modelo obtener los datos correspondientes. En este caso se escribe por pantalla con un System.out.prinln() el valor de la fila y columna que se ha seleccionado.
Hacer que una celda del JTable no sea editable
Si usamos DefaultTableModel las celdas del JTable son editables por defecto. A veces esto no nos interesa y JTable no tiene métodos para impedirlo. La forma de decidir qué celdas son o no editables es hacer nuestro propio modelo de datos, nuestro TableModel. La forma sencilla de hacerlo es heredar de DefaultTableModel y redefinir el método isCellEditable() para que sirva a nuestros propositos public class MiModelo extends DefaultTableModel
{
public boolean isCellEditable (int row, int column)
{
// Aquí devolvemos true o false según queramos que una celda
// identificada por fila,columna (row,column), sea o no editable
if (column == 3)
return true;
return false;
}
}
En este ejemplo, hemos creado nuestro propio modelo de datos que hace que la columna 4 (los índices empiezan en cero) de la tabla sea editable y el resto no. Ahora simplemente instanciamos el JTable usando este modelo y rellenamos los datos igual que antes MiModelo modelo = new MiModelo();
JTable tabla = new JTable(modelo);
Cambiar el tipo de dato con DefaultTableModel
DefaultTableModel por defecto le dice al JTable que todos los datos que tiene son Object. A veces, porque queramos cambiar el TableCellRenderer o cualquier otro motivo, nos interesa que determinadas columnas se consideren como Boolean, como Integer o cualquier otro tipo de dato.
Para modificar esto, tenemos que crearnos nuestro propio modelo de Datos. La forma más sencilla es heredar de DefaultTableModel y redefinir el método getColumnClass(). public class MiModelo extends DefaultTableModel
{
/** Primera columna Boolean, segunda Integer y el resto Object */
public Class getColumnClass(int columna)
{
if (columna == 0) return Boolean.class;
if (columna == 1) return Integer.class;
return Object.class;
}
}
En el ejemplo se ha hecho que la primera columna sea de Boolean, la segunda de Integer y el resto de Object.
Una cosa curiosa de los Boolean, es que el JTable al pintarlos los pone como JCheckBox.
Hacer visible una fila concreta del JTable dentro de un JScrollPane
Para que un JTable tenga barras de scroll y tenga una "cabecera" con las etiquetas de las columnas, es necesario meterla en un JScrollPane. Esto se puede hacer de dos formas. JTable tabla = new JTable();
JScrollPane scroll = new JScrollPane(tabla);
o bien JTable tabla = new JTable();
JScrollPane scroll = new JScrollPane();
scroll.setViewportView(tabla);
es bastante habitual al principio equivocarse y usar el método add(), que NO funcionará correctamente JTable tabla = new JTable();
JScrollPane scroll = new JScrollPane();
// Esto NO funciona.
scroll.add(tabla);
Cuando tenemos un JTable metido dentro de un JScrollPane, a veces queremos que las barras de scroll se desplacen para que una determinada celda sea visible.
No conozco una forma inmediata de hacerlo, pero una posible solución es esta. ...
// Nos devuelve la posición en pixels de una celda en fila,columna
Rectangle r = tabla.getCellRect( fila, columna, true);
// Mueve el scroll para que el rectangulo sea visible
scrollPane.getViewport().scrollRectToVisible (r);



Meter un ResultSet en un JTable. El ResultSetMetaData

..."En este tutorial tenemos un ejemplo en el que se consulta una base de datos MySQL y el resultado se muestra en un JTable. Nos centraremos en cómo meter el ResultSet en el JTable y de paso crearemos una pequeña clase ConversorResultSetADefaultTableModel que se pueda usar siempre, independientemente de la consula, la tabla, el número de columnas, etc. Eso sí, con sus limitaciones.


LA BASE DE DATOS


Presuponemos que tenemos instalado MySQL y que hemos creado una base de datos y una tabla con datos similar a la siguiente:
mysql> create database prueba;

mysql> use prueba;

mysql> create table persona (id smallint auto_increment, nombre varchar(60), nacimiento date, primary key(id));

mysql> insert persona values (NULL, 'Pedro', '1995-09-12');
Es decir, una base de datos prueba con una tabla persona que tiene los campos id, nombre y nacimiento tal cual se ve en el recuadro.
También suponemos que tenemos disponible el jar con el Driver de MySQL y que lo ponemos en el CLASSPATH o lo añadimos a nuestro proyecto si usamos un IDE.

LA CONSULTA Y EL ResultSet


Primero se obtiene la conexión a la base de datos con un código como este:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost/prueba","usuario","clave");
Por supuesto tendrás que cambiar el "usuario" y "clave" por los que tú tengas en la base de datos. También, si la base de datos no corre en tu ordenador local, tienes que cambiar "localhost" por el nombre o IP del ordenador donde corra la base de datos.
El siguiente paso es realizar la consulta y obtener el ResultSet. El código es el siguiente
Statement s = conexion.createStatement();ResultSet rs = s.executeQuery("select * from persona");

METER EL ResultSet EN UN JTable


Para meter los datos en el JTable, usaremos un DefaultTableModel. Para ello basta con instanciar el JTable de esta forma
DefaultTableModel modelo = new DefaultTableModel();JTable tabla = new JTable(modelo);
Ahora sólo hay que rellenar el DefaultTableModel con los datos del ResultSet. La forma "manual" de hacer esto es la siguiente
//Creamos las columnas.modelo.addColumn("id");modelo.addColumn("nombre");modelo.addColumn("nacimiento");

// Bucle para cada resultado en la consultawhile (rs.next()){

// Se crea un array que será una de las filas de la tabla.

Object [] fila = new Object[3];

// Hay tres columnas en la tabla // Se rellena cada posición del array con una de las columnas de la tabla en base de datos. for (int i=0;i<3;i++)>

fila[i] = rs.getObject(i+1);

// El primer indice en rs es el 1, no el cero, por eso se suma 1.

// Se añade al modelo la fila completa. modelo.addRow(fila);

}
Con esto basta. Todo lo que hagamos en el DefaultTableModel se refresca automáticamente en el JTable. Por ello, según se va ejecutando este código, en el JTable se iran añadiendo automáticamente los datos.

LOS METADATOS


El código que acabamos de hacer está claro que es muy dependiente de la tabla de base de datos que estamos consultando. Hay que añadir tantas columnas como campos tenga el resultado de base de datos. El nombre de las columnas depende de qué estemos consultando, es decir, un nombre de persona, una marca de coche, etc.
Sin embargo, existe una forma más o menos automática de hacer esto. Dado un ResultSet que obtenemos como consulta de base de datos, podemos interrogarle sobre cuántas columnas tiene y cuáles son los nombres de sus campos. Con ello, podemos hacer el código anterior de forma genérica, de tal manera que sólo teniendo el ResultSet y le DefaultTableModelo, podemos rellenarlo sin saber en absoluto qué consulta ni qué tablas se han consultado.
Para obtener esta información, hay que pedirle los MetaDatos al ResulSet. El código que lo hace es este
ResultSetMetaData metaDatos = rs.getMetaData();
La clase ResultSetMetaData contiene toda la información sobre los campos de base de datos contenidos en el ResultSet. Necesitamos preguntarle por el número de columnas y por la etiqueta para cada una de las columnas. Este es el código que lo hace
// Se obtiene el número de columnas.int numeroColumnas = metaDatos.getColumnCount();

// Se crea un array de etiquetas para rellenar

Object[] etiquetas = new Object[numeroColumnas];

// Se obtiene cada una de las etiquetas para cada columna

for (int i = 0; i <>
// Nuevamente, para ResultSetMetaData la primera columna es la 1.

etiquetas[i] = metaDatos.getColumnLabel(i + 1);

}
Listo. Ya hemos obtenido de forma genérica la información necesaria para rellenar el DefaultTableModel.
En la clase ConversorResultSetADefaultTableModel del ejemplo se hace precisamente esto. Se le pasa un DefaultTableModel y un ResultSet y se encarga de meter los datos de un lado a otro, utilizando este código genérico que hemos hecho. Una vez que tenemos el array de etiquetas, basta hacer esta llamada al DefaultTableModelo para configurar su número de columnas
modelo.setColumnIdentifiers(etiquetas);
El relleno de los datos es inmediato. Igual que el código "manual", pero se puede quitar el "3" y poner un "numeroColumnas".
EL EJEMPLO
En ResultSetATableModel.zip tienes los fuentes completos del ejemplo. Si tienes configurada la base de datos como se indicó al principio y tienes un usuario y password similar al del código, puedes desempaquetar, compilar y ejecutar con
Linux
$ unzip ResultSetATableModel.zip$ export CLASSPATH=.:/mysql-connector-java-3.1.12-bin.jar$ javac chuidiang/ejemplos/base_datos/*.java$ java chuidiang.ejemplos.base_datos.PruebaMySQL
Windows
$ unzip ResultSetATableModel.zip$ set CLASSPATH=.;\mysql-connector-java-3.1.12-bin.jar$ javac chuidiang\ejemplos\base_datos\*.java$ java chuidiang.ejemplos.base_datos.PruebaMySQL
Puesto que en el código de ejemplo he puesto que cada segundo se realice la consulta nuevamente y se refresquen los datos, mientras el progrma está en marcha puedes modificar, añadir o borrar datos de la tabla de base de datos. Verás como se actualizan en el JTable.
Puedes revisar los fuentes de ejemplo. La clase realmente interesante es ConversorResultSetADefaultTableModel que posiblemente puedas reutilzar tal cual o con pequeños cambios en tus proyectos.
Una pequeña observación respecto al código. Como SWING no es thread-safe, es decir, no se puede usar alegremente con varios hilos. Como en el ejemplo hay dos hilos: el del main y el de AWT, me he visto obligado en los sitios en que modifico el DefaultTableModel a usar un SwingUtilities.invokeAndWait(). Si quitas eso, es posible que te salten excepciones en el repintado del JTable (es lo que me pasaba a mí y por eso tuve que ponerlo)."

JTable

JComboBox


..."Los JComboBox son muy parecidos a las Listas, excepto que estos también permiten la introducción de los datos, las maneras para crear son muy similares a las de JList: new JComboBox(); new JComboBox(Object[] datos); new JComboBox(Vector datos); Lo métodos son: Valor de Retorno Nombre del Métodovoid addItem(Object item) Agrega un elemento al comboObject getSelectedItem() Retorna el valor seleccionado. int getSelectedIndex() Obtiene el índice seleccioando. void setEditable(boolean tipo) Determina si sólo mostrara los valores (false) o si se pueden escribir nuevos valores (true)Y al igual que que JList, tiene un Listener que es: ItemListener que sólo implementa un método: public void itemStateChanged(ItemEvent e) que se realiza cuando se cambia a un item. El registro del Listener se realiza con el método addItemListener de la clase JComboBox. http://perseo.cs.buap.mx/~danguer/projects/curso_java/manual/node37.html

El API ComboBox

..."Las siguientes tablas listan los métodos y constructores más utilizados de JComboBox. Otros métodos a los que nos gustaría llamar están definidos por las clases JComponent y Component.
El API para utilizar ComboBox se divide en dos categorías.
Seleccionar u Obtener Ítems de la Lista del ComboBox
Método
Propósito
JComboBox(ComboBoxModel)
JComboBox(Object[])
JComboBox(Vector)
Crea un ComboBox con una lista predeterminada.
void addItem(Object)
void insertItemAt(Object, int)
Añade o inserta un ítem en la lista.
Object getItemAt(int)
Object getSelectedItem()
Obtiene un ítem de la lista.
void removeAllItems()
void removeItemAt(int)
void removeItem(Object)
Elimina uno o más ítems de la lista.
int getItemCount()
Obtiene el número de ítems de la lista.
void setModel(ComboBoxModel)
ComboBoxModel getModel()
Selecciona u obtiene el modelo de datos que proporciona los ítems de la lista.
Personalizar la Configuración del ComboBox
Método
Propósito
void setEditabe(boolean)
boolean isEditable()
Selecciona u Obtiene si el usuario puede teclear en el ComboBox.
void setRenderer(ListCellRenderer)
ListCellRenderer getRenderer()
Selecciona u obtiene el objeto responsable para crear el ítem seleccionado en el ComboBox. Utilizado cuando el ComboBox no es editable.
void setEditor(ComboBoxEditor)
ComboBoxEditor getEditor()
Selecciona u obtiene el objeto responsable del pintado y edición del ítem seleccionado en el ComboBox. Esto sólo se utiliza cuando el ComboBox es editable".
http://www.programacion.net/java/tutorial/swing/1/

..."este es un ejemplo de JComboBox

//Popup state to prevent feedbackboolean stateCmb = false;
//Extend JComboBox's length and reset itpublic void popupMenuWillBecomeVisible(PopupMenuEvent e){
JComboBox cmb = (JComboBox)e.getSource();
//Extend JComboBox cmb.setSize(NEW_LENGTH, cmb.getHeight());
//If it pops up now JPopupMenu will still be short //
Fire popupMenuCanceled... if(!stateCmb) cmb.firePopupMenuCanceled();
//Reset JComboBox and state stateCmb = false;
cmb.setSize(OLD_LENGTH, cmb.getHeight());
} //Show extended JPopupMenupublic void popupMenuCanceled(PopupMenuEvent e){ JComboBox cmb = (JComboBox)e.getSource();
stateCmb = true;
//JPopupMenu is long now, so repop cmb.showPopup();
}
//Popup state to prevent feedbackboolean stateCmb = false;
//Extend JComboBox's length and reset itpublic void popupMenuWillBecomeVisible(PopupMenuEvent e){
JComboBox cmb = (JComboBox)e.getSource();
//Extend JComboBox cmb.setSize(NEW_LENGTH, cmb.getHeight());
//If it pops up now JPopupMenu will still be short
//Fire popupMenuCanceled... if(!stateCmb) cmb.firePopupMenuCanceled();
//Reset JComboBox and state stateCmb = false;
cmb.setSize(OLD_LENGTH, cmb.getHeight());
} //Show extended JPopupMenupublic void popupMenuCanceled(PopupMenuEvent e){ JComboBox cmb = (JComboBox)e.getSource(); stateCmb = true;
//JPopupMenu is long now, so repop cmb.showPopup();
} "
http://forum.java.sun.com/thread.jspa?threadID=570675