منتدى مصر التقني
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL

اذهب الى الأسفل

 ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL  Empty ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL

مُساهمة من طرف السنى السبت نوفمبر 27, 2021 9:45 am

فى هذا المقال التعليمى سنتعلم كيفية ترقيم الصفحات في JTable أو ما يسمي JTable Pagination سنستخدم بيان JDBC المُعد وقاعدة بيانات MySQL.

 ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL  Pagination-min

استخدمنا NetBeans IDE و Jdk 1.8 لتطوير هذا المشروع....هيكل مشروعنا من ملفات وحزم على النحو التالي :

 ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL  111a-min
لتطوير هذا المشروع استخدمنا قاعدة بيانات MySQL التى تحتوى على بيانات مكتبة كتب على النحو التالى :

 ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL  Brows

سنقوم بانشاء خمس فئات او كلاسات على النحو التالى :


  1. Book.java         
  2. ConnectionFactory.java
  3. BookDAO.java
  4. Pagination.java


اولا :إنشاء الفئة Book.java التى تحتوي على كافة الاساليب و الطرق لتعين و ايجاد حقول البيانات مثل حقل id والاسم ومنشور المؤلف وحقل التاريخ ....على النحو التالى :

الكود:
import java.io.Serializable;
import java.sql.Timestamp;
 
 
public class Book implements Serializable{
 
    private long id;
    private String name;
    private String author;
    private String publication;
    private Timestamp addDate;
    
    public Book(){
        
    }
 
    public Book(long id, String name, String author, String publication, Timestamp addDate) {
        this.id = id;
        this.name = name;
        this.author = author;
        this.publication = publication;
        this.addDate = addDate;
    }
 
    @Override
    public String toString() {
        return "Book{" + "id=" + id + ", name=" + name + ", author=" + author + ", publication=" + publication + ", addDate=" + addDate + '}';
    }
 
    public long getId() {
        return id;
    }
 
    public void setId(long id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getAuthor() {
        return author;
    }
 
    public void setAuthor(String author) {
        this.author = author;
    }
 
    public String getPublication() {
        return publication;
    }
 
    public void setPublication(String publication) {
        this.publication = publication;
    }
 
    public Timestamp getAddDate() {
        return addDate;
    }
 
    public void setAddDate(Timestamp addDate) {
        this.addDate = addDate;
    }
 
}

ثانيا :إنشاء الفئة ConnectionFactory.java لأداء عمليات JDBC
حيث تحتوي هذه الفئة على طريقة getConnection التى تنشئ اتصالاً بقاعدة بيانات MySQL باستخدام اسم مستخدم قاعدة البيانات وكلمة المرور واسم قاعدة البيانات لاستخراج البيانات ومن ثم يتم التعامل معها على النحو التالى :

الكود:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
 
public class ConnectionFactory {
 
    public static Connection getConnection() {
        Connection c = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            c = DriverManager.getConnection("jdbc:mysql://localhost:3306/ebhor?useUnicode=true&characterEncoding=UTF-8", "ebhor_user", "21V6");
        } catch (ClassNotFoundException e) {
            System.out.println("ClassNotFoundException " + e);
        } catch (SQLException e) {
            System.out.println("SQLException " + e);
        }
        return c;
    }
}

ثالثا :إنشاء الفئة BookDAO.java ...وهذه الفئة تحتوي على طريقتين

1 الطريقة fetchBySize - تأخذ هذه الطريقة وسيطتين صحيحتين


  • start : لتحديد صف البداية في جدول الكتاب.
  • size : يستخدم لتحديد عدد محدد من العناصر من البداية.


ثم يتم تخزين قيم مجموعة النتائج في كائن #DefaultTableModel.

ملحوظة : 
إذا قمت بتمرير المعلمة fetchBySize (11،10) ، فسيتم تحديد 10 سجلات من MySQL مع صف جدول البداية من 11.


2. الطريقة getRowCount _ تستخدم هذه الطريقة للعثور على العدد الإجمالي للصفوف في الجدول.

الكود:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.table.DefaultTableModel;
 
public class BookDAO {
 
    Connection con = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    int st;//status
 
    public DefaultTableModel fetchBySize(int start, int size) {
        System.out.println("book frame dao");
        DefaultTableModel model = new DefaultTableModel(new String[]{"Id", "Name", "Author", "Publication",}, 0);
        con = ConnectionFactory.getConnection();
        try {
            String query = "select * from book limit " + start + "," + size;
            System.out.println(query);
            ps = con.prepareStatement(query);
            rs = ps.executeQuery();
            int i = 0;
            while (rs.next()) {
                long id = rs.getLong("id");
                String name = rs.getString("name");
                String author = rs.getString("author");
                String publication = rs.getString("publication");
                model.addRow(new Object[]{id, name, author, publication});
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                con.close();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
        return model;
    }
 
    public double getRowCount() {
        System.out.println("book table row count");
        con = ConnectionFactory.getConnection();
        long count = 0;
        try {
            String query = "SELECT count(*) FROM book ";
            System.out.println(query);
            ps = con.prepareStatement(query);
            rs = ps.executeQuery();
            while (rs.next()) {
                count = rs.getLong("count(*)");
 
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                con.close();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
        return count;
    }
}

رابعا :إنشاء الفئة Pagination.java وتستخدم هذه الفئة لتطبيق مفهوم ترقيم الصفحات فى جدول البيانات ويتم ذلك من خلال الطريقة getPageNos التى تتطلب وسيطتين currentPage و totalPages للحصول على المجموعة التالية من أرقام الصفحات وإرجاع مصفوفة أعداد صحيحة...على النحو التالى :

الكود:
public class Pagination {
 
    public static int[] getPageNos(int currentPage, int totalPages) {
        int[] pages = new int[5];
        if (currentPage <= 2) {
            System.out.println("currentPage <=2");
            if (totalPages >= 5) {
                System.out.println("if");
                for (int i = 0; i <= 4; i++) {
                    pages[i] = i + 1;
                }
            } else {
                System.out.println("else");
                for (int i = 0; i < totalPages; i++) {
                    pages[i] = i + 1;
                }
            }
        } else if (currentPage == totalPages) {
            System.out.println("currentPage == totalPages");
            if (totalPages >= 5) {
                System.out.println("if");
                int j = 4;
                for (int i = 0; i <= 4; i++) {
                    pages[i] = currentPage - j--;
                }
            } else {
                System.out.println("else");
                int j = 3;
                for (int i = 0; i <= totalPages; i++) {
                    pages[i] = currentPage - j--;
                }
            }
        } else if ((currentPage - 2) >= 1 && (currentPage + 2) <= totalPages) {
            System.out.println("((currentPage - 2) >= 1 && (currentPage + 2) <= totalPages)");
            for (int i = 0; i <= 4; i++) {
                pages[i] = currentPage - 2 + i;
            }
        } else if (currentPage == totalPages - 1) {
            System.out.println("currentPage == totalPages - 1");
            for (int i = 0; i <= 4; i++) {
                pages[i] = currentPage - 3 + i;
            }
        }
 
        return pages;
    }
}

خامسا :إنشاء الفئة BookFrame.java التى تستخدم لإنشاء واجه المستخدم الرسومية لتنفيذ المشروع وتلك الفئة تحتوي على الطرق التالية :



  1. الطريق getCount  : تعمل هذه الطريقة في العثور على عدد سجلات جدول الكتاب عن طريق استدعاء getRowCount () من BookDAO.java...تقوم أيضًا بحساب إجمالي الصفحات الخاصة بالترقيم بناءً على حقل PAGE_SIZE.
  2. الطريقة getPageData :للحصول على السجلات من Book Table. وقم بتعيينه على JTable بناءً على رقم الصفحة....لتحديث تفاصيل ترقيم الصفحات ، يتم استدعاء getPaginationDetails ().
  3. الطريقة getPaginationDetails :تُستخدم هذه الطريقة للحصول على أرقام الصفحات الديناميكية من Pagination.java.وفقًا للأرقام ، يقوم بإنشاء أزرار وإضافة مستشعرات الإجراءات إلى الأزرار وتقوم أيضًا مع زر تعطيل وتمكين الميزات لرقم الصفحة الأولى والأخيرة.


الكود:
import ebhor.dao.BookDAO;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;
 
public class BookFrame extends JFrame implements ActionListener {
 
    JTable jTable;
    Container container;
    //  JButton start, end;
    DefaultTableModel model;
    BookDAO dao = new BookDAO();
    /*used for pagination*/
    final int PAGE_SIZE = 10;
    double tableRowCount;
    int totalPages;
    int currentPage;
    int startRow;
    int numbers[];
    JButton[] buttons;
    JPanel mainPanel, tablePanel, pagingPanel;
 
    BookFrame() {
        System.out.println("calling bookframe");
        container = this.getContentPane();
 
        mainPanel = new JPanel(new GridLayout(2, 1, 30, 50)); // main panel
        mainPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Subject Lists", TitledBorder.CENTER, TitledBorder.TOP));
 
        //create a JTable panel
        tablePanel = new JPanel();
        DefaultTableModel dm = (DefaultTableModel) dao.fetchBySize(0, 10);
        jTable = new JTable(dm);
        tablePanel.add(new JScrollPane(jTable));
        jTable.setRowHeight(23);
        //ading table panel to main panel
        mainPanel.add(tablePanel);
 
        //paging button panel
        pagingPanel = new JPanel();
 
        buttons = new JButton[9];
        //adding paging panel to main panel
        mainPanel.add(pagingPanel);
        //adding main panel to container
        container.add(mainPanel);
        getCount();
        getPageData(1);
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("event called" + e.getSource());
        String pageNumber = "";
        if (e.getSource() instanceof JButton) {
            if (((JButton) e.getSource()).getText().equalsIgnoreCase("Start")) {
                pageNumber = "1";
            } else if (((JButton) e.getSource()).getText().equalsIgnoreCase("End")) {
                pageNumber = totalPages + "";
            } else if (((JButton) e.getSource()).getText().equalsIgnoreCase("<<")) {
                pageNumber = (currentPage - 1) + "";
            } else if (((JButton) e.getSource()).getText().equalsIgnoreCase(">>")) {
                pageNumber = (currentPage + 1) + "";
            } else {
                pageNumber = ((JButton) e.getSource()).getText();
            }
            System.out.println("hello " + pageNumber);
            //this.repaint();
            getPageData(Integer.parseInt(pageNumber));
            getPaginationDetails();
 
        }
 
    }
 
    /*get total numbers of record in table*/
    public void getCount() {
        tableRowCount = dao.getRowCount();
        if (tableRowCount > 0) {
            totalPages = (int) Math.ceil(tableRowCount / PAGE_SIZE);
            currentPage = 1;
            System.out.println("row count is " + tableRowCount + "page Count" + totalPages);
        } else {
            JOptionPane.showMessageDialog(null, "No Record to display");
        }
 
    }
 
    /*Get data from table based on page no*/
    public void getPageData(int pageNo) {
 
        currentPage = pageNo;
        //calculate starting row for pagination
        startRow = PAGE_SIZE * (pageNo - 1);
        DefaultTableModel dm = (DefaultTableModel) dao.fetchBySize(startRow, PAGE_SIZE);
        jTable.setModel(dm);
        getPaginationDetails();
 
    }
 
    // dynamically generate page numbers
    public void getPaginationDetails() {
        System.out.println("pagination details");
        int inc = 0;
 
        System.out.println(currentPage + "  " + totalPages);
        pagingPanel.removeAll();
        pagingPanel.revalidate();
        numbers = ebhor.pagination.Pagination.getPageNos(currentPage, totalPages);
 
        buttons[0] = new JButton("Start");
        buttons[0].addActionListener(this);
        pagingPanel.add(buttons[0]);
        buttons[1] = new JButton("<<");
        buttons[1].addActionListener(this);
        pagingPanel.add(buttons[1]);
 
        for (int i = 0; i < numbers.length; i++) {
 
            if (numbers[i] != 0) {
                buttons[i + 2] = new JButton(numbers[i] + "");
                buttons[i + 2].setBounds(500 + inc, 500, 50, 30);
                buttons[i + 2].addActionListener(this);
                pagingPanel.add(buttons[i + 2]);
                inc += 40;
            }
            if (numbers[i] == currentPage) {
                buttons[i + 2].setBackground(Color.BLUE);
                buttons[i + 2].setForeground(Color.WHITE);
 
            }
        }
        buttons[7] = new JButton(">>");
        buttons[7].addActionListener(this);
        pagingPanel.add(buttons[7]);
        buttons[8] = new JButton("End");
        buttons[8].addActionListener(this);
        pagingPanel.add(buttons[8]);
        /*if current page is 1 then disable start and previous button*/
        if (currentPage == 1) {
            buttons[0].setEnabled(false);
            buttons[1].setEnabled(false);
 
        }
        /*if current page is last then disable end and next button*/
        if (currentPage == PAGE_SIZE) {
            buttons[7].setEnabled(false);
            buttons[8].setEnabled(false);
 
        }
    }
 
    //start of execution
    public static void main(String[] args) {
        BookFrame frame = new BookFrame();
        frame.setTitle("JTable with Pagination");
        frame.setVisible(true);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
    }
}

الاخراج :

 ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL  Pagination-min
السنى
السنى
........
........

تاريخ التسجيل : 18/02/2011
المساهمات : 249
النقاط : 465
التقيم : 26
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

 ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL  Empty رد: ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL

مُساهمة من طرف أحمد مناع الجمعة يناير 14, 2022 9:15 am


أحسنت يا سني @السنى

ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم
أحمد مناع
أحمد مناع
.
.

تاريخ التسجيل : 15/02/2011
المساهمات : 1108
النقاط : 202034
التقيم : 144
الدولة : مصر
الجنس : ذكر

https://egy-tech.forumegypt.net

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الرجوع الى أعلى الصفحة

ََ

مواضيع ذات صلة


 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى