om.
om.

Reputation: 4239

How to provide pagination support to a JTable in Swing?

I have created one GUI in Swing Java in which I have used JTable.Now I want to display next page information into it by using pagination. How should I do that ?

Upvotes: 14

Views: 26598

Answers (5)

Stephan
Stephan

Reputation: 43033

Alternatively, you can make use of the QuickTable project.

Screenshot

Here is the DBTable component in action:

DBTable component, embedded in JFrame, with data loaded from a CSV file.

The DBTable component is embedded in a traditionnal JFrame.

Sample code

The following sample code produces the window shown in the previous screenshot:

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();
    }
}

Resources and dependencies

test.csv

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

H2

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.187</version>
</dependency>

References

Upvotes: 0

andy
andy

Reputation: 1105

I have written a Java pagination tool dataj. It uses JQuery dataTables plug-in pagination metadata to build up the result page. I have also added some client classes for Java Swing including a TableRowSorter that calls the (server side) sorting instead of sorting inside the table model. Feel free to download it and contact me if you have any questions. It's under Apache 2 license.

Upvotes: 0

martinusadyh
martinusadyh

Reputation: 1120

You can try with 2 query, first query is to count total rows in DB and second query is for the real data :) And for the UI side, you can try like this:


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 

And in service layer, you just need use limit function like this :


public List findAllComment(Integer pageNumber, Integer rowsPerPage) {
        try {
            List listWP = new ArrayList();
            preparedFindAll.setInt(1, (rowsPerPage*(pageNumber-1)));
            preparedFindAll.setInt(2, rowsPerPage);
            ResultSet rs = preparedFindAll.executeQuery();
            while (rs.next()) {
                WPComment comment = new 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(comment);
            }
            return listWP;
        } catch (SQLException ex) {
            Logger.getLogger(TablePagingServiceJDBC.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }

    public Integer countComments() {
        try {
            Integer 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;
    }

Or you can fork me on github at Project Page Table Paging on Swing :)

Upvotes: 0

akf
akf

Reputation: 39485

Another option to implement this is to use a scrollbar-less scrollpane and a couple nav buttons to effect the control. The buttons that have been added are normal JButtons for the prototype.

A quick prototype is added below. It makes a couple assumptions, one of which is that the table model has all of its data. Work could be done to ensure that rows end up flush at the top of the view upon navigation.

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);

}

alt text http://img7.imageshack.us/img7/4205/picture4qv.png

Upvotes: 4

Petros
Petros

Reputation: 8992

Paging in a Swing JTable looks like a nice article.

Here is an excerpt:

As far as I remember the solution for this problem lies in the concept of paging: just retrieve the data that the user wants to see and nothing more. This also means you have to sometimes get extra data from the db server (or appserver) if your user scrolls down the list.

Big was my surprise that there wasn't really an out-of-the-box solution (not even a copy- paste solution) for this problem. Anyone that knows one, please don't hesitate to extend my (rather limited) knowledge of the J2EE platform.

So we dug in, and tried to build a solution ourselves. What we eventually came up with was an adapted TableModel class to takes care of the paging.

Upvotes: 3

Related Questions