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:
Ahora nos hace falta crear los eventos para los botones de "Siguiente" y "Anterior", entonces nuestro código queda de la siguiente manera:
Es muy importante estar atentos a la siguiente línea de código:
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:
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); } }
Recibe notificaciones por correo
2 Comentarios
Escribir Comentariohola 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.
ResponderSe 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:
Responder- 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
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