الوقت/التاريخ الآن هو الجمعة أبريل 26, 2024 4:22 pm

1 نتيجة بحث عن DefaultTableModel

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

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

الوسم defaulttablemodel على المنتدى منتدى مصر التقني Pagination-min

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

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

الوسم defaulttablemodel على المنتدى منتدى مصر التقني 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);
 
    }
}


الاخراج :

الوسم defaulttablemodel على المنتدى منتدى مصر التقني Pagination-min
من طرف السنى
في السبت نوفمبر 27, 2021 9:45 am
 
ابحث في: واجهة المستخدم الرسومية Java Swing
موضوع: ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL
المساهمات: 1
مشاهدة: 558

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

انتقل الى: