본문 바로가기

Swing/JTable 08

JTable, Oracle Paging example

자바 JTable 과 Oracle 을 이용한 페이징(Paging) 구현 예제


오라클 데이터베이스에 포함되어 있는 EMP 테이블과 Java의 JTable을 연동하여 페이지 네비게이션(Page Navigation)기능을 구현해 봤습니다.


테스트환경

 - JDK 1.7

 - Oracle 11g XE

 - NetBeans 8.0

 - Windows 7



Screen Shot




JTable-Oracle-Paging.zip


EmpJTableFrame.java

package org.kdea.java;


import java.awt.event.*;

import javax.swing.*;


public class EmpJTableFrame extends javax.swing.JFrame {


    private JTable table;

    private EmpTableModel model;

    JScrollPane scrollPane;

    

    public EmpJTableFrame() 

    {

        initComponents();

        

        setTitle("JTable-Oracle Paging Example");


        model = new EmpTableModel();

        table = new JTable(model);


        table.setFillsViewportHeight(true);

        

        EmpTableModelHandler modelHandler = new EmpTableModelHandler();

        table.getModel().addTableModelListener(modelHandler);

        

        // 테이블 셀을 클릭하면 호출되는 이벤트 핸들러

        table.addMouseListener(new MouseAdapter() {

            @Override

            public void mouseClicked(MouseEvent e) {

                int column = table.getSelectedColumn();

                int row = table.getSelectedRow();

                String cellData = table.getModel().getValueAt(row, column).toString();

                System.out.printf("%d, %d, %s\n", row, column, cellData);

            }

        });

        

        JScrollPane scrollPane = new JScrollPane(table);

        scrollPane.setBounds(5, 5, 310, 180);

        getContentPane().add(scrollPane);

    }


    /**

     * This method is called from within the constructor to initialize the form.

     * WARNING: Do NOT modify this code. The content of this method is always

     * regenerated by the Form Editor.

     */

    @SuppressWarnings("unchecked")

    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          

    private void initComponents() {


        jButtonNextPage = new javax.swing.JButton();

        jButtonPrevPage = new javax.swing.JButton();

        jLabelCurPage = new javax.swing.JLabel();

        jTextFieldRowsPerPage = new javax.swing.JTextField();

        jLabel1 = new javax.swing.JLabel();


        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);


        jButtonNextPage.setText("NEXT >>");

        jButtonNextPage.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent evt) {

                jButtonNextPageActionPerformed(evt);

            }

        });


        jButtonPrevPage.setText("<< PREV");

        jButtonPrevPage.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent evt) {

                jButtonPrevPageActionPerformed(evt);

            }

        });


        .............................................

                .........................................

         ...................................


        pack();

    }// </editor-fold>                        


    int page;

    private void jButtonNextPageActionPerformed(java.awt.event.ActionEvent evt) {                                                

        EmpDAO dao = new EmpDAO();

        int rowsPerPage = Integer.parseInt(jTextFieldRowsPerPage.getText());

        java.util.List<EmpVO> list = dao.getEmpPage(rowsPerPage, ++page);

        

        int ttPages = dao.getTotalRows()/rowsPerPage;

        ttPages += dao.getTotalRows()%rowsPerPage==0? 0 : 1;

        if(page>ttPages) {

            page = ttPages;

            return;

        }

        model = new EmpTableModel();

        model.setEmpList(list);

        table.setModel(model);

        table.repaint();


        String pgDisplay = String.format("    %d / %d    ", page, ttPages);

        jLabelCurPage.setText(pgDisplay);

    }                                               


    private void jButtonPrevPageActionPerformed(java.awt.event.ActionEvent evt) {                                                

        EmpDAO dao = new EmpDAO();

        int rowsPerPage = Integer.parseInt(jTextFieldRowsPerPage.getText());

        java.util.List<EmpVO> list = dao.getEmpPage(rowsPerPage, --page);

        

        int ttPages = dao.getTotalRows()/rowsPerPage;

        ttPages += dao.getTotalRows()%rowsPerPage==0? 0 : 1;

        if(page<1) {

            page = 1;

            return;

        }

        model = new EmpTableModel();

        model.setEmpList(list);

        table.setModel(model);

        table.repaint();

        

        table.repaint();


        String pgDisplay = String.format("    %d / %d    ", page, ttPages);

        jLabelCurPage.setText(pgDisplay);

    }                                               


    /**

     * @param args the command line arguments

     */

    public static void main(String args[]) {

        /* Set the Nimbus look and feel */

...................

     ...............

.....................


        /* Create and display the form */

        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {

                new EmpJTableFrame().setVisible(true);

            }

        });

    }


    // Variables declaration - do not modify                     

    private javax.swing.JButton jButtonNextPage;

    private javax.swing.JButton jButtonPrevPage;

    private javax.swing.JLabel jLabel1;

    private javax.swing.JLabel jLabelCurPage;

    private javax.swing.JTextField jTextFieldRowsPerPage;

    // End of variables declaration                   

}




EmpDAO.java
......................
   ............................
public List<EmpVO> getEmpPage(int rowsPerPage, int page)
    {
        conn = getConn();
        String sql = null;
        sql = "SELECT * FROM "+
                "("+
                    "SELECT T1.*, "+
                    "ROWNUM AS RN, "+
                    "FLOOR((ROWNUM-1)/?+1) AS PAGE, "+
                    "COUNT(*) OVER() AS TTCNT FROM "+
                    "("+
                        "SELECT empno, ename, hiredate, deptno, sal from emp2 "+
                    ") T1 "+
                ") "+ 
                "WHERE PAGE = ?";

        try{
          pstmt = conn.prepareStatement(sql);
          pstmt.setInt(1, rowsPerPage);
          pstmt.setInt(2, page);
          rs = pstmt.executeQuery();
          ArrayList<EmpVO> list = new ArrayList<EmpVO>();
          
          while(rs.next()) {
             EmpVO emp = new EmpVO();
             emp.setEmpno(rs.getInt("EMPNO"));
             emp.setEname(rs.getString("ENAME"));
             emp.setHiredate(rs.getDate("HIREDATE"));
             emp.setDeptno(rs.getInt("DEPTNO"));
             emp.setSal(rs.getInt("SAL"));
             list.add(emp);
             
             this.setTotalRows(rs.getInt("TTCNT"));
          }
          return list;
        }
        catch(Exception e) {
          e.printStackTrace();
        }finally{
            closeAll();
        }
        return null;
    }

......................
   ............................