lunes, 28 de noviembre de 2016

CONTROL JTABLE CON BASE DE DATOS

   
                                                 

 

       

  INGENIERÍA DE SISTEMAS Y TELEMÁTICA


FIORELLA  AGUILAR ISUIZA


RAÚL AARÓN DELGADO ESPÁRRAGA




    JTABLE
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.
JTable es un componente swing java que nos permite mostrar datos en una tabla de una base de datos, sin embargo a diferencia de otros componentes similares de otros lenguajes de programación (Delphi por ejemplo), java no nos permite gestionar directamente los datos. Es eso lo que haremos hoy, construir un JTable editable, más propiamente, este JTable nos permitirá actualizar datos de una JTable directamente con la base de datos.

El Ejemplo.

Para el ejemplo presentaremos una ventana de registro de usuarios donde a medida que se diligencia el formulario, se almacenan los datos en la BD, desde allí se obtendrá la información y se mostrarán los datos.


los JTable son aparentemente iguales, sin embargo la diferencia está en la forma como los llenamos el primero lo llenaremos usando lógica de programación, el segundo lo llenaremos con un componente DefaultTableModel.

Este ejemplo es basado en la aplicación realizada sobre el Patrón Modelo Vista Controlador (El Script de la BD lo encuentran en esa entrada), por lo tanto usaremos parte de la lógica desarrollada para esta solo dejaremos la vista de registro, agregandole los JTable con las que vamos a trabajar.

La Aplicación.

Como se mencionó el ejemplo es simple, tenemos una sección de registro y una sección donde mostramos los JTable.
Por cuestiones de simplicidad no aplicaremos el MVC de lleno, sin embargo seguimos usando los patrones DAO y VO para el manejo de la información, el primero para comunicarnos con la BD y el segundo para transportar nuestros datos.
En la clase Conexion tenemos los parámetros requeridos para conectarnos a nuestra BD MySql, por ultimo usamos la clase Principal para llamar a la VentanaRegistro donde presentamos la GUI y llenamos las tablas que muestran la información.

Tabla Usuario Matriz de Datos.
Este JTable lo llenamos aplicando un poquito de lógica de programación, uno de los constructores de la clase JTable recibe 2 argumentos, el primero es la matriz con los datos a mostrar, el segundo es un arreglo con los nombres de las columnas, por esa razón lo que hacemos es obtener los datos de la BD, almacenarlos en una lista y posteriormente pasarlos a la matriz, así como inicializar un arreglo con los encabezados para finalmente mandárselos al contructor.

public void mostrarDatosUsandoLogica() {
 String titulos[] = { "Codigo", "Nombre", "Edad", "Profesión","Telefono" };
 String información[][] = obtieneMariz();// obtenemos la informacion de la BD 
 mitabla1 = new JTable(información, titulos);
 mitabla1.setEnabled(false);
 mitabla1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 mibarra1.setViewportView(mitabla1);}  
private String[][] obtieneMariz() {
 PersonaDao miPersonaDao = new PersonaDao();
  * llamamos al metodo que retorna la info de la BD y la almacena en la
  * lista
 ArrayList< PersonaVo > miLista = miPersonaDao.buscarUsuariosConMatriz();
  * como sabemos que son 5 campos, definimos ese valor por defecto para
  * las columnas las filas dependen de los registros retornados
 String informacion[][] = new String[miLista.size()][5];
   for (int x = 0; x < informacion.length; x++) {
 informacion[x][0] = miLista.get(x).getIdPersona() + "";
 informacion[x][1] = miLista.get(x).getNombrePersona() + "";
 informacion[x][2] = miLista.get(x).getProfesionPersona() + "";
 informacion[x][3] = miLista.get(x).getEdadPersona() + "";
 informacion[x][4] = miLista.get(x).getTelefonoPersona() + "";
     }
 return informacion;}
Tabla Usando Table Model
Este JTable a nivel visual es igual que el anterior, sin embargo la diferencia radica en la forma de obtener los datos, aqui usamos un constructor sin argumentos y un objeto de tipo DefaultTableModel el cual nos permite definir la forma como llenamos la tabla, tanto en el caso de los encabezados como en la información de esta manera el llenado de los datos se realiza directamente por medio del objeto model que se envia como parametro al metodo que consulta la BD.

private void mostrarDatosConTableModel() {
 DefaultTableModel model;
 model = new DefaultTableModel();// definimos el objeto tableModel
 miTabla2 = new JTable();// creamos la instancia de la tabla
 miTabla2.setModel(model);
 model.addColumn("Nº Documento");
 model.addColumn("Nombre");
 model.addColumn("Edad");
 model.addColumn("Profesión");
 model.addColumn("Telefono");

 miTabla2.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 miTabla2.getTableHeader().setReorderingAllowed(false);

 PersonaDao miPersonaDao2 = new PersonaDao();
 /**
  * enviamos el objeto TableModel, como mandamos el objeto podemos
  * manipularlo desde el metodo
  */
 miPersonaDao2.buscarUsuariosConTableModel(model);
 miBarra2.setViewportView(miTabla2);
}

Con esta tabla vemos que podemos utilizar otros elementos compatibles con el componente JTable que nos pueden ahorrar muchas lineas de código, en este caso comparandolo con el anterior nos ahorra un método con un proceso de mas para obtener el mismo resultado.


PROPIEDAD MÁS USADA:
● Model: Permite definir el número de columnas y filas del objeto como también las expresiones que irán en las columnas.
MÉTODOS MÁS USADOS:
● addColumn(): Añade la columna al final de la matriz de columnas.
● setModel(): Asigna el modelo de datos al objeto JTable.
● GetRowCount(): Devuelve el número de filas en la tabla.

DefaultTableModel
Esta clase permite construir el modelo para el objeto Table. Los métodos más utilizados son:
● addColumn(): Añade una columna al modelo.
 ● AddRow(): Añade una fila al final del modelo.
● getColumnCount(): Devuelve el número de columnas en esta tabla de datos.
● getRowCount(): Devuelve el número de filas en esta tabla de datos.
 ● getValueAt(): Devuelve un valor de atributo para la celda en la posición row, column.
● insertRow(): Inserta una fila en el modelo.

APLICACIÓN
Construir una aplicación que permita calcular el promedio de las notas obtenidas en el curso de Programación Visual. La aplicación debe permitir el ingreso del nombre del alumno, la nota de la I Unidad, la nota de la II Unidad y la nota de la III Unidad. Además debe permitir la selección del turno a la que pertenece el alumno. A través de un botón de comando debe agregar los datos en un objeto Jtable, calculando el promedio de las notas; y a través de otro botón de comando debe eliminar la fila seleccionada en el objeto JTable. También se debe mostrar el total de filas agregadas en el objeto JTable.
Solución:
● Usaremos el mismo proyecto utilizado en la sesión anterior y sólo agregarás un formulario (Jframe).}


Inmediatamente se muestra la siguiente ventana:


● A continuación se muestra el entorno de desarrollo de NetBeans y no olvides de dar clic en el botón derecho del mouse sobre el formulario y establece AbsoluteLayout en Set Layout.



Seleccionamos el objeto JComboBox y elegimos en la ventana de propiedades, la propiedad model que permite colocar los ítems dentro de la caja de lista desplegadle. Elegimos el botón de comando referido a la propiedad model se muestra la siguiente ventana:


● Ingresamos “”,“Mañana”, “Tarde” y “Noche” y luego hacemos click en el botón de comando OK. Continuamos con el diseño del formulario agregando un botón de comando “Agregar” y un botón de comando “Eliminar”. Luego procedemos a agregar el objeto JTable.



● Al ser dibujado el objeto JTable se observa en el panel de la izquierda que se vincula a un objeto JScrollPane. El objeto Jtable tiene como propiedad principal a model.


● Luego de seleccionar el botón de comando referido a la propiedad model se muestra la siguiente ventana:


● Observamos en la ventana anterior que por defecto el objeto Table propone la  conformación de 4 columnas y 4 filas, dando la posibilidad de aumentar o disminuir el número de columnas y filas. Además podemos establecer los títulos de cada columna. Aquí debemos hacer hincapié que las columnas y las filas son tipo Object esto quiere decir que un objeto JTable es una matriz de objetos (arreglo bidimensional). Nosotros vamos a establecer el número de columnas a través de la programación y las filas se crearán en la medida que se necesiten. 
● Los nombres de los objetos de control dibujados en el formulario queda de la siguiente manera:
● Vamos a proceder a programar. Comenzamos con hacer uso del paquete swing y específicamente a las clases JoptionPane y a la clase JTable.


● Luego procedemos a crear un modelo para el objeto JTable llamado Tabla a través de la clase DefaultTableModel. Lo hacemos dentro de la clase frmNotas. Usar la clase DefaultTableModel es posible gracias al import javax.swing.table.


Declaramos y creamos una variable de memoria dtm del tipo DefaultTableModel.
 ● En el método constructor programamos lo siguiente (sólo escribe lo que se señala la llave de color rojo):

Declaramos y creamos una variable de memoria titulos del tipo cadena y es un arreglo. Esta variable titulos se inicializa con los valores “Alumno”, ”I Unidad”, “II Unidad”, “III Unidad”, “Promedio” y “Turno”, que serán los títulos de las columnas del objeto JTable. Luego, con el método setColumnIdentifiers() se define las columnas con sus respectivos títulos en la variable dtm (modelo del JTable llamado Tabla). Finalmente, se vincula el modelo, representado en la variable dtm, al objeto JTable llamado Tabla.

 ● Si en estos momentos decidimos ejecutar nuestra aplicación, quedaría nuestro formulario así:
Observamos que el objeto JTable muestra las columnas definas en la programación hecha en el método constructor.
● Procedamos con la programación del botón de comando Agregar (sólo escribe lo que se señala la llave de color rojo).

Declaramos y creamos una variable de memoria datos de tipo String y de tamaño Luego, declaramos las variables de memoria n1, n2, n3 y total de tipo entero, la variable promedio de tipo double y una variable de memoria verifica de tipo booleano. Las variables de memoria n1, n2 y n3 reciben los valores ingresado en los cuadros de textos txtn1, txtn2 y txtn3 respectivamente. Con la variable de memoria verifica se pretende evaluar si se llegó a escribir en los cuadros de textos y se haya seleccionado un turno. Con la sentencia IF evaluamos la variable verifica y con el operador ! hacemos negación, es decir, si la variable verifica es falso entonces con ! se convierte en verdadero. Si la variable verifica es falso significa que se ingresó los datos en los cuadros de textos y se seleccionó el turno, entonces procedemos a calcular el promedio teniendo presente que las variables n1,n2, n3 siendo enteras deben ser tratadas como reales (double). Posteriormente, hacemos uso del arreglo datos asignando los datos ingresados y el turno seleccionado en cada uno de los elementos. Con el método addRow() logramos crear una fila con los valores contenidos con el vector o arreglo datos. Luego, limpiamos los cuadros de textos y hacemos que el objeto JComboBox quede en al dar el valor cero al método setSelectedIndex(). Si la variable verifica es verdadero significa que falta ingresar algún dato o seleccionar el turno. Finalmente, se muestra la cantidad de filas agregadas en el cuadro de texto txtTotal y haciendo uso del método setRowCount() perteneciente a dtm.
● Procedamos con la programación del botón de comando Eliminar.


Declaramos las variables fila y total de tipo entero. La variable fila se le asigna el valor de la posición de la fila seleccionada en el objeto Jtable llamado Tabla. Con la sentencia IF se evalúa a la variable fila si es mayor o igual a cero procedemos a remover o borrar la fila previamente seleccionad, caso contrario se muestra un mensaje indicando que se debe seleccionar una fila en la Tabla. Finalmente, se muestra la cantidad de filas agregadas en el cuadro de texto txtTotal y haciendo uso del método setRowCount() perteneciente a dtm.
EJEMPLO
import java.awt.Component;
import javax.swing.AbstractCellEditor;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableCellEditor;
/**
 * @web http://www.jc-mouse.net
 * @author Mouse
 */
public class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor{

    private database db;
    private String OldValue=""; //Valor antiguo de la celda
    private String NewValue=""; //valor nuevo de la celda
    private String NameColum="";//nombre de la columna
    private String ID="";// Llave del registro
    private JComponent component = new JTextField();

    public MyTableCellEditor(database db, String NameColumn)
    {
            this.db = db;
            this.NameColum = NameColumn;
    }

    public Object getCellEditorValue() {
        return ((JTextField)component).getText();
    }

    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        OldValue = value.toString();//Toma valor de celda antes de cualquier modificación
        ID = table.getValueAt(row,0).toString();//obtiene el ID unico del registro
        ((JTextField)component).setText(value.toString());//coloca valor de la celda al JTextField
        return component;
    }

    @Override
    public boolean stopCellEditing() {
        NewValue = (String)getCellEditorValue();//Captura nuevo valor de la celda
        //Compara valores, si no son iguales, debe actualizar registro
        if( !NewValue.equals(OldValue))
        {   //Realiza la actualizacion
            if( !db.update( NameColum+"='"+NewValue+"' ", ID ) )
            {   //Si existe algun error al actualizar, escribe viejo valor en la celda
                JOptionPane.showMessageDialog(null,"Error: No se puede actualizar");
                ((JTextField)component).setText(OldValue);
            }
        }
        return super.stopCellEditing();
    }
}



 RESUMEN
JTABLE
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.
El Ejemplo.
Para el ejemplo presentaremos una ventana de registro de usuarios donde a medida que se diligencia el formulario, se almacenan los datos en la BD, desde allí se obtendrá la información y se mostrarán los datos.
 
los JTable son aparentemente iguales, sin embargo la diferencia está en la forma como los llenamos el primero lo llenaremos usando lógica de programación, el segundo lo llenaremos con un componente DefaultTableModel.

La Aplicación.

Como se mencionó el ejemplo es simple, tenemos una sección de registro y una sección donde mostramos los JTable.
Por cuestiones de simplicidad no aplicaremos el MVC de lleno, sin embargo seguimos usando los patrones DAO y VO para el manejo de la información, el primero para comunicarnos con la BD y el segundo para transportar nuestros datos.

Tabla Usuario Matriz de Datos.
Este JTable lo llenamos aplicando un poquito de lógica de programación, uno de los constructores de la clase JTable recibe 2 argumentos, el primero es la matriz con los datos a mostrar, el segundo es un arreglo con los nombres de las columnas, por esa razón lo que hacemos es obtener los datos de la BD,
PROPIEDAD MÁS USADA:
● Model: Permite definir el número de columnas y filas del objeto como también las expresiones que irán en las columnas.
MÉTODOS MÁS USADOS:
● addColumn(): Añade la columna al final de la matriz de columnas.
● setModel(): Asigna el modelo de datos al objeto JTable.
● GetRowCount(): Devuelve el número de filas en la tabla.

DefaultTableModel
Esta clase permite construir el modelo para el objeto Table. Los métodos más utilizados son:
● addColumn(): Añade una columna al modelo.
 ● AddRow(): Añade una fila al final del modelo.
● getColumnCount(): Devuelve el número de columnas en esta tabla de datos.
● getRowCount(): Devuelve el número de filas en esta tabla de datos.
 ● getValueAt(): Devuelve un valor de atributo para la celda en la posición row, column.
● insertRow(): Inserta una fila en el modelo.


SUMMARY

JTABLE
Jtable is a class that allows me to organize a certain information in a table, this differs from a normal database because when using Jtable you can visualize this table, giving the user information organization, opportunities to edit and resize the columns among other.
The example.
For the example we will present a user registration window where as the form is processed, the data is stored in the DB, from there the information will be obtained and the data will be displayed.

The JTable are apparently the same, however the difference is in the way we fill them first we will fill it using programming logic, the second we will fill it with a DefaultTableModel component.

The application.

As mentioned the example is simple, we have a registry section and a section where we show the JTable.
For simplicity we will not apply the MVC fully, however we continue to use the DAO and VO standards for information handling, the first to communicate with the DB and the second to transport 

our data.

User Matrix Table of Data.
This JTable we fill it applying a bit of programming logic, one of the constructors of the class JTable receives 2 arguments, the first is the matrix with the data to be shown, the second is an array with the names of the columns, for that reason What we do is obtain the data of the DB,
MOST USED PROPERTY:
● Model: It defines the number of columns and rows of the object as well as the expressions that will go in the columns.
MOST USED METHODS:
● addColumn (): Adds the column to the end of the column array.
● setModel (): Assigns the data model to the JTable object.
● GetRowCount (): Returns the number of rows in the table.

DefaultTableModel
This class allows constructing the model for the Table object. The most used methods are:
● addColumn (): Adds a column to the model.
 ● AddRow (): Adds a row to the end of the model.
● getColumnCount (): Returns the number of columns in this data table.
● getRowCount (): Returns the number of rows in this data table.
 ● getValueAt (): Returns an attribute value for the cell in the row, column position.
● insertRow (): Inserts a row in the model.


Recomendaciones:
Ø  Es un control que nos permite mostrar la información en el orden que queramos.
Ø  Además funciona como el datagridview el cual es un control utilizado en visual que si deseas puedes editar la información mostrado o sino deseas puedes hacerlo que no sea editable.
Ø  Es recomendable porque puedes mostrar todos los datos que deseas.

Conclusiones:

Ø  En conclusión ente control es de mucha ayuda para los programadores que sirve para mostrar información.
Ø  Este control también sirve para registrar información si lo desea.
Ø  Además a este control usted lo podrá dar el número de columnas y de filas que desee.

Apreciación del Equipo:

Este control es de mucha ayuda para poder desarrollar software en los cuales se va a tener que mostrar la información que esta almacenada en la besa de datos o la información que desea guardar en la base de datos como se da en el caso de los detalles para que la persona que este manipulando pueda verificar la información guardada.

LINKOGRAFÍA:

http://www.jc-mouse.net/java/jtable-editable-con-base-de-datos