How to provide pagination support to a JTable in Swing?

后端 未结 5 520
遇见更好的自我
遇见更好的自我 2020-11-27 06:51

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 ?

相关标签:
5条回答
  • 2020-11-27 07:29

    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

    • QuickTable basic tutorial
    • QuickTable official tutorials
    • Download latest jar
    • h2 database
    0 讨论(0)
  • 2020-11-27 07:43

    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.

    0 讨论(0)
  • 2020-11-27 07:45

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

    0 讨论(0)
  • 2020-11-27 07:47

    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.

    0 讨论(0)
  • 2020-11-27 07:53

    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

    0 讨论(0)
提交回复
热议问题