sábado, 19 de octubre de 2013

Ejemplo JTable

Después del break anterior sobre Eclipse y Netbeans, continuamos con la secuencia de entradas sobre Java Swing, esta vez es el turno de los componentes complejos, sin embargo cambiaré la metodología de las entradas anteriores pues el tema lo amerita....

Se creará una entrada por cada componente complejo, con el fin de exponer rapidamente y mediante ejemplos su funcionamiento.....iniciamos con JTable....



Que es?

Un Jtable representa una tabla de datos con sus respectivas Filas y Columnas, la información que se muestra en ella puede ser ingresada tanto por nosotros como obtenida de una 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 en 2 JTable.........


los JTable son aparentemente iguales, sin embargo la diferencia esta 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.....

Adicional a esta guia les comparto un video donde explico el proceso trabajando con Mysql



Y Listo!!!! Con eso terminamos el ejemplo, los invito a descargarlo y validar su funcionamiento...........espero que les pueda servir!!!!

Descarga!!!

El ejemplo es muy simple, sin mayores complicaciones, aquí dejo el enlace de descarga por si lo quieren revisar ;).......está en Eclipse pero si usas NetBeans te interesará esta entrada con un vídeo paso a paso de como abrirlo en el... recuerden que es gratis, y nada cuesta opinar, compartir o agradecer :)


También te podría Interesar.


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo.....y si te gustó...... te invito a compartir
 y Suscribirte ingresando al botón "Participar en este sitio" para darte cuenta de mas entradas como esta ;)

54 comentarios:

  1. Entendi bien, pero bueno lo que necesito saber es como hacer mostrar en el Jtable un arraylist, usando el DefaultTableModel. Si me pudieses ayudar, te lo agradecería mucho :)

    ResponderEliminar
    Respuestas
    1. Hola, Gracias por comentar, te cuento que el metodo addRow() solo acepta arreglos o vectores, no permite arrayList, lo que puedes hacer es obtener los datos en un arrayList y luego pasarlos a un arreglo para que se muestre en la tabla... verifica lo siguiente:

      en el metodo de buscar usuarios con table model
      Creas el ArrayList: ArrayList< Object > obj= new ArrayList< Object >();
      En el for : obj.add(rs.getObject(i + 1));
      y luego transformas haciendo un cast y lo envias
      Object [ ] arreglo = (Object [ ] ) obj.toArray();
      model.addRow(arreglo);

      Espero que te sirva ;)

      Eliminar
    2. el link de descarga???? My name Wilder

      Eliminar
    3. Hola, con gusto, y Wilder, el enlace está ahí al final de la entrada, cualquier cosa me cuentas ;)

      Eliminar
    4. Gracias Muchas gracias lo encontre... :D

      Eliminar
    5. Hola, esta genial ese ejemplo, no quiero pasar por ignorante, pero no hallo el link de descarga, lo busco y no lo encuentro, por favor, ayúdame con eso, sigue así, buen blog, regaré el link a mis compañeros de ingeniería de sistemas, saludos

      Eliminar
    6. Hola Hector, gracias por comentar y si lo compartes seria de gran ayuda para que pueda ser fácilmente encontrado, el enlace esta en la parte que dice "aquí dejo el enlace de descarga" pasa el mouse por encima y te debería activar el link, debería verse como en texto gris (Así lo veo yo) voy a cambiar entonces el color para que sea mas fácil de encontrar ;) un saludo y te invito a suscribirte en el botón de la derecha "Participa en el Sitio" ;)

      Eliminar
    7. listo viejo, muchas gracias, ha sido un gran aporte por lo visto, creo que tengo material que puede servir para compartir, no sé si quiera, gracias :)

      Eliminar
    8. Hola Hector, muchas gracias y claro, seria bueno conocer el material, escribeme, en "Acerca De" encuentras mi correo ;) un Saludo

      Eliminar
    9. para los q tienen netbeans y ya declararon una tabl y no saben modificarla este es el codigo a aplicar en e evento
      //siendo rowData = Object rowData[][] = { { "Row1-Column1", "Row1-Column2", "Row1-Column3","prueba"},
      // { "Row2-Column1", "Row2-Column2", "Row2-Column3","prueba"},
      // { "Row3-Column1", "Row3-Column2", "Row3-Column3","prueba"}};
      Tabla.setModel(new javax.swing.table.DefaultTableModel(
      rowData /*[][] {
      {null, null, null, null},
      {null, "hola", null, null},
      {null, null, null, null},
      {null, null, null, null},
      {null, null, null, null}
      }*/,
      new String [] {
      "nombre", "CI/RIF", "Usuario", "Estatus"
      }
      ) {
      Class[] types = new Class [] {
      java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
      };

      public Class getColumnClass(int columnIndex) {
      return types [columnIndex];
      }
      }); este codigo debe ejecutarse con cuando se presiona un boton o iniciando alli le inclui una variable Object solo para que vean su editacion una vez conocido este codigo se me hizo muy facil editar la tabla =P, espero les ayude

      Eliminar
  2. Muchas gracias amigo..muy claro para empezar a entenderlo... :)

    ResponderEliminar
  3. Gracias por este archivo muy bueno :)

    ResponderEliminar
  4. Hola amigo una pregunta, teniendo las tablas hay forma de que haga un reporte y lo guarde en excel, te agradecería si me ayudas con eso !!
    Saludos

    ResponderEliminar
    Respuestas
    1. Hola Cesar, si señor, todo depende de la logica que le metas, por ejemplo puedes usar la libreria apache POI y usar los mismos datos para generar un reporte, o tambien puedes usar iReport y la misma consulta para generar el reporte, luego lo vinculas a java........................mas adelante publicaré ejemplos de los 2 temas, te invito a unirte al sitio para estar pendiente, un saludo

      Eliminar
  5. Muchas gracias, muy útil para los que estamos empezando.
    Un saludo

    ResponderEliminar
  6. Muchas Gracias, me ha ayudado mucho.

    ResponderEliminar
  7. Hola Cristian;

    Antes que todo quiero agradecerte por este blog, me ha servido de mucho. Tengo una inquietud y es que deseo implementar un Jtable pero en java server face, no se si este objeto si sea compatible con esta tecnología o hay otra forma de hacerlo. Gracias.

    ResponderEliminar
    Respuestas
    1. Hola, la verdad nunca lo he intentado por ahí ya que el JTable es enfocado a JSE (Java Standard Edition), con JSF ya hablamos de JEE (Java Enterprise Edition), ahi ya tendrias que trabajar con tablas tipo html o si trabajar con librerias como richFaces puedes usar el componente DataTable, te dejo el enlace a un demo de richFaces para que lo veas, y te dejo un videoTutorial que hice sobre un proyecto web con richFaces, tengo algunos videos que te pueden servir, mas adelante espero subir mas...

      demoRich: http://livedemo.exadel.com/richfaces-demo/richfaces/dataTable.jsf

      Video : http://www.youtube.com/watch?v=SAfGl7XbFNI

      Eliminar
  8. Buenas amigo este archivo del proyecto es para eclipse o para netbeans aclarame porfavor porque yo programo en netbeans y lo descargue y pense que descargo malo pero entonces calmame la dudita porfavor gracias

    ResponderEliminar
    Respuestas
    1. Hola Santiago, el proyecto está en Eclipse, lo que puedes hacer es crear un proyecto en netbeans y ahí copiar las clases de mi proyecto y listo, el debe tomartelas.....fijate en los paquetes porq tambien tendrias que crear la misma estructura.... un saludo

      Eliminar
  9. o te iba a decir si depronto no me podrias colaborar a hacerlo en netbeans que la verdad necesito hacer eso para una empresa y pues si me pudieras colaborar seria de mucha ayuda!

    ResponderEliminar
    Respuestas
    1. Hola Santiago, que pena no había visto este comentario, y ps en netbeans no hay problema, como te dije en el otro comentario puedes trabajarlo desde ahí..... búscate en mi blog, también tengo una entrada mostrando como importar el código al IDE netbeans fácilmente, es un vídeo tutorial, espero que te sirva ;)

      Eliminar
  10. Hola, importarlo en NetBeans es muy fácil, sigue el video tutorial de Cristian. Gracias, una consulta Cristian, podrías facilitarnos el Script de la base de datos si no es mucha molestia. Saludos desde El Salvador.

    ResponderEliminar
    Respuestas
    1. Hola Edgard, te cuento que el Script lo encuentras en la entrada sobre el MVC, te dejo el enlace y gracias por comentar ;) (Pregunta... el enlace está al iniciar esta entrada, el link no se diferencia? me gustaria que me comentaras para entonces cambiar el color.. un saludo)
      http://codejavu.blogspot.com/2013/06/ejemplo-modelo-vista-controlador.html

      Eliminar
  11. Cristian, pon el enlace en azul para diferenciarlo.

    ResponderEliminar
  12. Gracias por compartir tus conocimientos ;) éxitos!!!

    ResponderEliminar
  13. Christian, tendrías el mismo ejemplo de acceso de datos a MySql con ADO en vez de DAO ?

    Muchas Gracias. El mejor blog que he visto hasta ahora.....

    ResponderEliminar
  14. Muchas gracias por el ejemplo, sobre todo por poner las dos opciones de llenado, con arreglos y con JTableModel

    ResponderEliminar
  15. Quisiera saber como obtener los datos que están almacenados de mi tabla a las cajas de texto con eventos del mouse y keylistener

    ResponderEliminar
  16. hola necesito un favor para una tarea y no lo encuentro por ningún lado necesito que en un jtxtfield me muestre el resultado de una suma de una columna de un jtable en el modelo mvc en java netbeans porfavor si me pudieras ayudar

    ResponderEliminar
  17. Tramboliko el repanchinganteblog pinchegUeys increible

    ResponderEliminar
  18. hola necesito q cuando quiera buas informacion en una jtablet utilizando un combobox como podria hacerlo

    ResponderEliminar
    Respuestas
    1. estimado baje el codigo que esta en esta pagina y aguegue lo siguiente en VentanaRegistro
      String op[]={"Seleccione","Acepta", "Rechaza"};
      JComboBox comboz=new JComboBox(op);
      miPersonaDao2.buscarUsuariosConTableModel(model);
      if (miTabla2.getColumnModel().getColumnCount() > 0) {
      miTabla2.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(comboz));
      }

      Eliminar
  19. Hola, Excelente trabajo. Muchas Gracias por tu tiempo.
    Jorge

    ResponderEliminar
  20. Excelente muchisimas gracias es lo que andaba buscando hace a;os te pasaste gracias me haz salvado el trabajo

    ResponderEliminar
  21. Disculpa en mi caso es hacer que en la misma tabla le de yo agregar y se quede guardado, no se como hacerlo, me podrías ayudar por favor ^^

    por ejemplo son 4 filas; actividad, fecha, hora, lugar

    ResponderEliminar
  22. Hola, descargué el proyecto y me da error
    en package dao;
    en package principal;
    en import ventanas.VentanaRegistro;
    y en import dao.PersonaDao;
    import vo.PersonaVo;

    me pueden explicar por qué, gracias

    ResponderEliminar
  23. hola como puedo mostrar un jtable que es muy grande ya que tiene unos 20 campos que mostrar por cada registro , me podrias ayudar , gracias

    ResponderEliminar
  24. hola amigos, soy nuevo en java y tengo una duda muy grande alguien sabe como llevar un arreglo hecho en java hacia ireports y escribirlo en una tabla de ireports???

    ResponderEliminar
  25. Gracias por el aporte...de mucha ayuda :)

    ResponderEliminar
  26. como puedo obtener los datos que tengo guardados en una matriz de 5x5 en una jtable en java netbeans????

    ResponderEliminar
  27. como llenar el jtable desde un formulario si esta en otra ventana?

    ResponderEliminar
  28. Siempre aprendiendo mucho. Mil gracias!!!!

    ResponderEliminar
  29. Hola, de antemano quiero agradecer por la información en tu blog, solo una duda, como se podría llenar el JTable mediante un archivo Json, espero y me puedas ayudar brindandome algunos tips, gracias y que estes de lo mejor...Saludos

    ResponderEliminar
  30. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  31. esta parte del codigo no la entiendo, es decir se debe crear una clase PersonaDao con un metodo buscarUsuariosConTableModel?
    PersonaDao miPersonaDao2 = new PersonaDao();
    /**
    * enviamos el objeto TableModel, como mandamos el objeto podemos
    * manipularlo desde el metodo
    */
    miPersonaDao2.buscarUsuariosConTableModel(model);
    miBarra2.setViewportView(miTabla2);
    }

    ResponderEliminar

Eres libre de realizar cualquier comentario, desde que pueda ayudar con gusto lo atenderé, y si es un critica, bienvenida sea!!!