Mostrar datos de una tabla MySQL con Java Swing

Estándar

Al momento de crear una aplicación que acceda a bases de datos es muy posible que necesite presentar los datos en pantalla via la interfaz gráfica específicamente en una tabla que presente los datos registro por registro, como era de esperar Java tiene las herramientas para hacer eso.

Preparando el proyecto.Las partes de como acceder a una base de datos y como preparar el proyecto para usar MySQL Connector se explican en esta entrada: https://hashblogeando.wordpress.com/2013/10/22/acceder-a-una-base-de-datos-mysql-desde-java/ se recomienda revisarla antes de comenzar.

Datos a presentar

Para este ejemplo se presentaran en pantalla los datos de la tabla mostrada en la figura  1:

Figura 01 - Datos

Figura 01 – Datos

Notara que la tabla solo tiene cuatro columnas, para que todo funcione necesita tener a la mano el nombre de las columnas y los datos de conexión, ya que los necesitara.

Teoría básica.

Para presentar datos en la interfaz gráfica utilizaremos dos clases JTable y DefaultTableModel el primero sirve para presentar datos en la interfaz gráfica en la forma esperada con la cuadricula y títulos de cada columna mientras que el segundo contiene los datos que deseamos presentar, como muchas cosas del java suena mas complejo que lo que deveria, pero a la vez da una mayor flexibilidad en como hacer las cosas y mantiene la separación de datos y presentación.

Uso básico de JTable

La clase JTable no tiene la mayor complicación en su uso, sin embargo hay un detalle que debe de tomar en cuenta cuenta lo que se podría pensar esta clase no tiene barras de desplazamiento incluidas por lo que necesita hacer uso de un objeto JScrollPane para que quepa cómodamente en la ventana.

Para presentar datos en los objetos de esta clase es necesario asignar un modelo que contenga los datos a desplegar, esto es con el metodo setModel.

Uso básico de DefaultTableModel

Los datos presentados por el objeto JTable son controlados por esta clase principalmente los títulos de las columnas y los datos que se presentaran en la tabla, esto ultimo se lleva acabo por medio del método addRow, el cual recibe como argumento un arreglo de objetos los cuales se presentaran en la tabla.

Proyecto

02 - Proyecto

02 – Proyecto

Como notara en el proyecto de ejemplo se usaran dos clases, una que extiende JFrame y contiene la tabla y los accesos a base de datos y otra que contiene el método main, como se menciono al principio de la entrada necesita agregar las librerías del MySQL Connector al proyecto. ahora pasemos al codigo y las anotaciones.

Código

package mx.com.hashSoft;

import java.awt.BorderLayout;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Tabla extends JFrame{
    /**
     *
     */
    private static final long serialVersionUID = 210601883990408438L;
    private Connection conexion = null;
    private Statement comando = null;
    private ResultSet resultados = null;
    private JTable tabla = null;
    DefaultTableModel modelo = null;
    JScrollPane desplazamiento = null;
    
    /**
     * Obtenemos todos los datos de la tabla juegos;
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    private void leerDatos() throws ClassNotFoundException, SQLException {
        String usuario = “inventario”;
        String passwd = “1973”;
        String instruccion = “SELECT * FROM HashData.juegos”;

        Class.forName(“com.mysql.jdbc.Driver”);
        conexion = DriverManager.getConnection(“jdbc:mysql://127.0.0.1:3306/HashData” + “?” + “user=” + usuario + “&” + “password=” + passwd + “”);
        comando = conexion.createStatement();
        resultados = comando.executeQuery(instruccion);
    }
    
    /**
     * Cierra la conexion con base de datos
     * @throws SQLException
     */
    private void cerrar() throws SQLException {
        conexion.close();        
    }   
    
    public Tabla() {
        // Nombre de las columnas como apareceran en la tabla
        String[] columnas = {“id”, “Consola”, “Nombre”, “Obtenido”};
        tabla = new JTable();
        modelo = new DefaultTableModel();
        desplazamiento = new JScrollPane(tabla);
        int id, consola, obtenido;
        String nombre;
        
        // Parametros de la ventana
        this.setTitle(“Tabla de juegos”);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(new BorderLayout());
        
        // Modelo de la tabla
        modelo.setColumnIdentifiers(columnas);
        
        // Barras de desplazamiento
        desplazamiento.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        desplazamiento.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        
        // Propiedades de la tabla
        tabla.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        tabla.setFillsViewportHeight(true);        
        
        tabla.setModel(modelo);
        
        // Agregando elementos a la ventana
        this.getContentPane().add(desplazamiento, BorderLayout.NORTH);    
        this.pack();
        
        // Ponemos los datos en la tabla
        
        try {
            // Obtener datos de la tabla
            this.leerDatos();
            
            while(resultados.next() == true) {
                
                id = resultados.getInt(“id”);
                consola = resultados.getInt(“consola”);
                obtenido = resultados.getInt(“obtenido”);
                nombre = resultados.getString(“nombre”);
                
                modelo.addRow( new Object[] {id, consola, nombre, obtenido} );                
            }
            
            this.cerrar();
            
        } catch (SQLException | ClassNotFoundException e) {
            System.out.println(“Error de lectura de BD\n\n”);
            
            e.printStackTrace();
        }
    }
}

package mx.com.hashSoft;
public class MostrarDatos {   
    static public void main(String[] args) {       
        Tabla ventana = new Tabla();       
        ventana.setVisible(true);        
    }
}

Como es costumbre en las entradas de este blog , las lineas mas relevantes se marcaron en rojo y su función se detallara a continuación, cabe denotar que el como se accedió a la base de datos se explico en otra entrada.

String[] columnas = {“id”, “Consola”, “Nombre”, “Obtenido”}; – Declaramos cuales seran los nombres de las columnas que se presentaran en la tabla.

tabla = new JTable(); – Creamos un objeto JTabla

modelo = new DefaultTableModel(); – Creamos el modelo de datos que usaremos en la tabla.

desplazamiento = new JScrollPane(tabla); – Creamos el panel con barras de desplazamiento que contendrá a la tabla

modelo.setColumnIdentifiers(columnas); – Le indicamos al modelo que nombres tendrán las columnas.

desplazamiento.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
desplazamiento.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); – Con esto establecemos que aparescan las barras de desplazamiento cuando se necesiten

id = resultados.getInt(“id”);
consola = resultados.getInt(“consola”);
obtenido = resultados.getInt(“obtenido”);
nombre = resultados.getString(“nombre”); – Obtenemos los datos de la base de datos almacenándolos en variables del tipo adecuado

 modelo.addRow( new Object[] {id, consola, nombre, obtenido} ); – La linea principal, con esto agregamos un nuevo renglón al modelo y por tanto a la tabla se pasa como argumento un arreglo de objectos con lo que deseamos agregar, aparecieran en el orden en el que se introduzcan aquí.

Resultado

Figura 03 - Salida

Figura 03 – Salida

 

Una vez que ejecute la clase MostrarDatos, sobra decir que necesitara o recrear la tabla de la figura 1 y colocar los datos de conexión correctos vera algo como la figura 3, presentando los datos de la tabla, de modo que si modifica la tabla y vuelve a ejecutar el programa estos cambiaran de forma acorde.

Espero que esta entrada halla sido de utilidad y que le de una idea de como implementar y extender el como presentar datos en pantalla, nos vemos en la siguiente entrada.