¿Cómo proporcionar soporte de paginación a una JTable en Swing?

He creado una GUI en Swing Java en la que he usado JTable.Now. Quiero mostrar la información de la página siguiente usando paginación. ¿Cómo debo hacer eso?

Paginación en un Swing JTable parece un buen artículo.

Aquí hay un extracto:

Hasta donde recuerdo, la solución para este problema radica en el concepto de paginación: simplemente recupere los datos que el usuario quiere ver y nada más. Esto también significa que a veces tiene que obtener datos adicionales del servidor db (o servidor de aplicaciones) si su usuario se desplaza hacia abajo en la lista.

Grande fue mi sorpresa de que no había realmente una solución lista para usar (ni siquiera una solución de copiar y pegar) para este problema. Cualquiera que conozca uno, no dude en ampliar mi conocimiento (bastante limitado) de la plataforma J2EE.

Así que buscamos, e intentamos construir una solución nosotros mismos. Lo que eventualmente se nos ocurrió fue una clase adaptada de TableModel para encargarse de la paginación.

Otra opción para implementar esto es usar un scrollpane sin barra de desplazamiento y un par de botones de navegación para efectuar el control. Los botones que se han agregado son JButton normales para el prototipo.

Un prototipo rápido se agrega a continuación. Hace un par de suposiciones, una de las cuales es que el modelo de tabla tiene todos sus datos. Se podría trabajar para garantizar que las filas terminen al ras en la parte superior de la vista al navegar.

 private void buildFrame() { frame = new JFrame("Demo"); frame.setSize(300, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); addStuffToFrame(); frame.setVisible(true); } private void addStuffToFrame() { final JTable table = getTable(); final JScrollPane scrollPane = new JScrollPane(table); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); final JButton next = new JButton("next"); final JButton prev = new JButton("prev"); ActionListener al = new ActionListener(){ public void actionPerformed(ActionEvent e) { Rectangle rect = scrollPane.getVisibleRect(); JScrollBar bar = scrollPane.getVerticalScrollBar(); int blockIncr = scrollPane.getViewport().getViewRect().height; if (e.getSource() == next) { bar.setValue(bar.getValue() + blockIncr); } else if (e.getSource() == prev) { bar.setValue(bar.getValue() - blockIncr); } scrollPane.scrollRectToVisible(rect); } }; next.addActionListener(al); prev.addActionListener(al); JPanel panel = new JPanel(new BorderLayout()); JPanel buttonPanel = new JPanel(); buttonPanel.add(prev); buttonPanel.add(next); panel.add(buttonPanel, BorderLayout.NORTH); panel.add(scrollPane, BorderLayout.CENTER); frame.getContentPane().add(panel); } private JTable getTable() { String[] colNames = new String[]{ "col 0", "col 1", "col 2", "col 3" }; String[][] data = new String[100][4]; for (int i = 0; i < 100; i++) { for (int j = 0; j < 4; j++) { data[i][j] = "r:" + i + " c:" + j; } } return new JTable(data,colNames); } 

texto alternativo http://img7.imageshack.us/img7/4205/picture4qv.png

Puedes intentar con 2 consultas, la primera consulta es contar filas totales en DB y la segunda consulta es para datos reales 🙂 Y para el lado de UI, puedes intentarlo así:

public class MainForm extends javax.swing.JFrame { private void initDefaultValue() { rowsPerPage = Integer.valueOf(cmbPageSize.getSelectedItem().toString()); totalRows = Main.getTablePagingService().countComments(); Double dblTotPage = Math.ceil(totalRows.doubleValue()/rowsPerPage.doubleValue()); totalPage = dblTotPage.intValue(); if (pageNumber == 1) { btnFirst.setEnabled(false); btnPrevious.setEnabled(false); } else { btnFirst.setEnabled(true); btnPrevious.setEnabled(true); } if (pageNumber.equals(totalPage)) { btnNext.setEnabled(false); btnLast.setEnabled(false); } else { btnNext.setEnabled(true); btnLast.setEnabled(true); } txtPageNumber.setText(String.valueOf(pageNumber)); lblPageOf.setText(" of " + totalPage + " "); lblTotalRecord.setText("Total Record " + totalRows + " rows."); List wPComments = Main.getTablePagingService().findAllComment(pageNumber, rowsPerPage); jTable1.setModel(new CommentTableModel(wPComments)); autoResizeColumn(jTable1); } private void btnFirstActionPerformed(ActionEvent evt) { pageNumber = 1; initDefaultValue(); } private void btnPreviousActionPerformed(ActionEvent evt) { if (pageNumber > 1) { pageNumber -= 1; initDefaultValue(); } } private void btnNextActionPerformed(ActionEvent evt) { if (pageNumber 

Y en la capa de servicio, solo necesitas usar la función de límite así:


 public List findAllComment (Entero pageNumber, Integer rowsPerPage) {
         tratar {
             List listWP = new ArrayList ();
             preparedFindAll.setInt (1, (rowsPerPage * (pageNumber-1)));
             preparedFindAll.setInt (2, rowsPerPage);
             ResultSet rs = preparedFindAll.executeQuery ();
             while (rs.next ()) {
                 Comentario de WPComment = nuevo WPComment ();
                 comment.setCommentID (rs.getInt ("comment_ID"));
                 comment.setCommentAuthor (rs.getString ("comment_author"));
                 comment.setCommentDate (rs.getDate ("comment_date"));
                 comment.setCommentContent (rs.getString ("comment_content"));
                 listWP.add (comentario);
             }
             return listWP;
         } catch (SQLException ex) {
             Logger.getLogger (TablePagingServiceJDBC.class.getName ()) .log (Level.SEVERE, null, ex);
         }

         devolver nulo;
     }

     Número de entero públicoComentarios () {
         tratar {
             Entero totalRows = 0;
             ResultSet rs = preparedCount.executeQuery ();
             while (rs.next ()) {
                 totalRows = rs.getInt ("count (*)");
             }
             return totalRows;
         } catch (SQLException ex) {
             Logger.getLogger (TablePagingServiceJDBC.class.getName ()) .log (Level.SEVERE, null, ex);
         }

         return 0;
     }

O me puedes inclinar en github en Project Page Table Paging en Swing 🙂

He escrito una herramienta de paginación Java dataj . Utiliza metadatos de paginación de plug-in JQuery dataTables para crear la página de resultados. También he agregado algunas clases de cliente para Java Swing, incluido un TableRowSorter que llama a la ordenación (del lado del servidor) en lugar de ordenar dentro del modelo de tabla. Siéntase libre de descargarlo y contácteme si tiene alguna pregunta. Está bajo la licencia de Apache 2.

Alternativamente, puede hacer uso del proyecto QuickTable .

Captura de pantalla

Aquí está el componente DBTable en acción:

Componente DBTable, incrustado en JFrame, con datos cargados desde un archivo CSV.

El componente DBTable está incrustado en un JFrame tradicional.

Código de muestra

El siguiente código de muestra produce la ventana que se muestra en la captura de pantalla anterior:

 import javax.swing.JFrame; import javax.swing.UIManager; import quick.dbtable.DBTable; public class QuickTableFrame extends JFrame { private static final long serialVersionUID = -631092023960707898L; public QuickTableFrame() { try { // Use system look and feel UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); // set Frame properties setSize(300, 200); setVisible(true); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); // create a new quicktable DBTable dBTable1 = new DBTable(); // add to frame getContentPane().add(dBTable1); // set the database driver to be used, we are using jdbc-odbc driver dBTable1.setDatabaseDriver("org.h2.Driver"); /* * set the jdbc url,"quicktabledemo" is the data source we have * created for the database */ dBTable1.setJdbcUrl("jdbc:h2:mem:test;INIT=create table employee as select * from CSVREAD('test.csv');"); // set the select statement which should be used by the table dBTable1.setSelectSql("select * from employee"); // to create the navigation bars for the table dBTable1.createControlPanel(); // connect to database & create a connection dBTable1.connectDatabase(); // fetch the data from database to fill the table dBTable1.refresh(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { // create a new table frame QuickTableFrame myframe = new QuickTableFrame(); } } 

Recursos y dependencias

test.csv

 empid,emp_name,emp_dept,emp_salary 1,Azalia,ornare,114918 2,Jade,tristique,152878 3,Willa,In scelerisque scelerisque,166733 ... 

H2

  com.h2database h2 1.4.187  

Referencias

  • QuickTable tutorial básico
  • Tutoriales oficiales de QuickTable
  • Descargar el último tarro
  • base de datos h2