JTable con Paginación

   Hemos trabajado con tablas anteriormente, pero hace poco me preguntaron como trabajar con límites en ellas, es decir, tengo "x" registros y quiero mostrar mas de 10.000.000 (por así decirlo), aunque el modelo de tabla permite mostrarlos de forma nativa, no es nada práctico mostrar una tabla con millones de registros. Es por ello que en estos casos debemos definir un tamaño de tabla y luego darle al usuario la opción de paginar, es decir, tener botones para ir adelante o atrás, mostrando los resultados según la posición actual del cursor de la tabla....

   Si, suena complicado, pero no lo es, es mas simple de lo que parece, lo primero es trabajar con el modelo, lo cual explico es estas entradas:

 - JTable: http://carlitoxenlaweb.blogspot.com/2008/12/tablas-swing.html
 - Modelo: http://carlitoxenlaweb.blogspot.com/2010/05/jtable-y-su-modelo.html

   Una vez sabemos como funciona, vamos a lo que nos interesa, seguiremos utilizando las variables visto en entradas anteriores (enlaces de arriba), pero manejaremos una nueva llamada "dimensión", con lo que definimos las dimensiones de nuestra tabla.

   IMPORTANTE: una cosa es el tamaño de nuestro panel y otra muy diferente del contenido de la tabla, especificamente hablo de la variable JScrollPane y no de JTable o JPanel.

   Una vez aclarado esto, definiremos el tamaño de la siguiente manera:
dimension = tabla.getPreferredSize();
scrollPane.setPreferredSize(new Dimension(
        dimension.width,
        tabla.getRowHeight()*filas)
);

   Ahora nos hace falta crear los eventos para los botones de "Siguiente" y "Anterior", entonces nuestro código queda de la siguiente manera:
public void actionPerformed(ActionEvent evt) {
    alto = tabla.getRowHeight() * (filas - 1);
    barra = scrollPane.getVerticalScrollBar();
    barra.setValue( barra.getValue() + alto );
}

   Es muy importante estar atentos a la siguiente línea de código:
barra.setValue( barra.getValue() + alto );

   Esta línea es quien define la posición en donde nos ubicaremos, si vamos hacia atras "restamos" ( - ), si vamos hacia "adelante" entonces sumamos ( + ).

   Y eso es todo, con esto ya tenemos nuestra tabla con paginación lista y funcionando, aquí un ejemplo:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class jTableConNavegacion extends JFrame {

    //Variables
    int alto;
    final int filas = 11;
    String[] columnas = {"1","2","3","4","5","6","7"};
    Integer[][] data = new Integer[1000][columnas.length];
    
    //Componentes
    Dimension dimension;
    JButton siguiente;
    JButton anterior;
    JScrollBar barra;
    JPanel botones;
    JPanel contenedor;
    
    //Tabla
    final JScrollPane scrollPane;
    final JTable tabla;
    
    public jTableConNavegacion() {
        
        //Definimos el contenedor
        super("JTable con Navegacion");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocation(100,100);
        setSize(320,262);
        contenedor = new JPanel(new BorderLayout(3,3));
       
        //Creamos el panel para los botones
        botones = new JPanel(new FlowLayout(FlowLayout.CENTER));
        anterior = new JButton("Anterior");
        siguiente = new JButton("Siguiente");
        
        //Creamos datos falsos para el ejemplo
        for (int xx=0; xx<data.length; xx++) {
            for (int yy=0; yy<data[0].length; yy++) {
                data[xx][yy] = new Integer((xx+1)*(yy+1));
            }
        }
        
        //Inicializamos la tabla
        tabla = new JTable(new DefaultTableModel(data, columnas));
        
        //Definimos scroll y tamano
        scrollPane = new JScrollPane(
                tabla,
                JScrollPane.VERTICAL_SCROLLBAR_NEVER,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        dimension = tabla.getPreferredSize();
        scrollPane.setPreferredSize(new Dimension(dimension.width,
                tabla.getRowHeight()*filas));
       
        //Cargamos listener para los botones
        siguiente.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent evt) {
                alto = tabla.getRowHeight() * (filas - 1);
                barra = scrollPane.getVerticalScrollBar();
                barra.setValue( barra.getValue() + alto );
            }
        });
    
        anterior.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent evt) {
                alto = tabla.getRowHeight() * (filas-1);
                barra = scrollPane.getVerticalScrollBar();
                barra.setValue( barra.getValue() - alto );
            }
        });
        
        //Preparamos la interfaz
        add(contenedor);
        botones.add(anterior);
        botones.add(siguiente);
        contenedor.add(scrollPane, BorderLayout.CENTER);
        contenedor.add(botones, BorderLayout.SOUTH);
    }
    
    public static void main(String[] arg) {
        JOptionPane.showMessageDialog(null,"Navegacion en JTable....n");
        JOptionPane.showMessageDialog(null,"By Carlitox ("+
            "http://calitoxenlaweb.blogspot.com)");
        jTableConNavegacion app = new jTableConNavegacion();
        app.setVisible(true);
    }
}

2 Comentarios

Escribir Comentario
BloodBane
AUTOR
10 de junio de 2016, 11:42 delete

hola tengo una duda, en este ejemplo cargas todos los datos y luego solo muestras una parte??? mi pregunta es por si se maneja cantidades grandes de datos esto afectaria el rendimiento. Espero tu respuesta. Gracias.

Responder
avatar
11 de junio de 2016, 22:49 delete

Se cargan los datos y se muestran paginados, estos son datos de pruebas, sin embargo si quieres optimizar debe ser como comentas. Para hacerlo con MySQL simplemente colocas un LIMIT X,Y. Donde X es la cantidad de registros a mostrar por página a partir del número dado, siendo Y el límite de registros, por ejemplo:

- Del 1 al 50: SELECT * FROM tabla LIMIT 50
- Del 51 al 100: SELECT * FROM tabla LIMIT 50, 50
- Del 101 al 180: SELECT * FROM tabla LIMIT 100, 80

Responder
avatar

Lamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.

Si necesitas publicar código haz click en "Conversión" para hacerlo legible.
ConversiónConversión EmoticonEmoticon