ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL
منتدى مصر التقني :: قسم لغات البرمجة Programming languages :: لغة الجافا Java :: واجهة المستخدم الرسومية Java Swing
صفحة 1 من اصل 1 • شاطر
ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL
فى هذا المقال التعليمى سنتعلم كيفية ترقيم الصفحات في JTable أو ما يسمي JTable Pagination سنستخدم بيان JDBC المُعد وقاعدة بيانات MySQL.
![ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL Pagination-min](https://www.ebhor.com/wp-content/uploads/2021/04/pagination-min.jpg)
استخدمنا NetBeans IDE و Jdk 1.8 لتطوير هذا المشروع....هيكل مشروعنا من ملفات وحزم على النحو التالي :
لتطوير هذا المشروع استخدمنا قاعدة بيانات MySQL التى تحتوى على بيانات مكتبة كتب على النحو التالى :
![ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL Brows](https://www.ebhor.com/wp-content/uploads/2021/04/brows.jpg)
سنقوم بانشاء خمس فئات او كلاسات على النحو التالى :
اولا :إنشاء الفئة Book.java التى تحتوي على كافة الاساليب و الطرق لتعين و ايجاد حقول البيانات مثل حقل id والاسم ومنشور المؤلف وحقل التاريخ ....على النحو التالى :
ثانيا :إنشاء الفئة ConnectionFactory.java لأداء عمليات JDBC
حيث تحتوي هذه الفئة على طريقة getConnection التى تنشئ اتصالاً بقاعدة بيانات MySQL باستخدام اسم مستخدم قاعدة البيانات وكلمة المرور واسم قاعدة البيانات لاستخراج البيانات ومن ثم يتم التعامل معها على النحو التالى :
ثالثا :إنشاء الفئة BookDAO.java ...وهذه الفئة تحتوي على طريقتين
1 الطريقة fetchBySize - تأخذ هذه الطريقة وسيطتين صحيحتين
ثم يتم تخزين قيم مجموعة النتائج في كائن #DefaultTableModel.
ملحوظة :
إذا قمت بتمرير المعلمة fetchBySize (11،10) ، فسيتم تحديد 10 سجلات من MySQL مع صف جدول البداية من 11.
2. الطريقة getRowCount _ تستخدم هذه الطريقة للعثور على العدد الإجمالي للصفوف في الجدول.
رابعا :إنشاء الفئة Pagination.java وتستخدم هذه الفئة لتطبيق مفهوم ترقيم الصفحات فى جدول البيانات ويتم ذلك من خلال الطريقة getPageNos التى تتطلب وسيطتين currentPage و totalPages للحصول على المجموعة التالية من أرقام الصفحات وإرجاع مصفوفة أعداد صحيحة...على النحو التالى :
خامسا :إنشاء الفئة BookFrame.java التى تستخدم لإنشاء واجه المستخدم الرسومية لتنفيذ المشروع وتلك الفئة تحتوي على الطرق التالية :
الاخراج :
![ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL Pagination-min](https://www.ebhor.com/wp-content/uploads/2021/04/pagination-min.jpg)
![ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL Pagination-min](https://www.ebhor.com/wp-content/uploads/2021/04/pagination-min.jpg)
استخدمنا NetBeans IDE و Jdk 1.8 لتطوير هذا المشروع....هيكل مشروعنا من ملفات وحزم على النحو التالي :
![ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL 111a-min](https://www.ebhor.com/wp-content/uploads/2021/04/111a-min.jpg)
![ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL Brows](https://www.ebhor.com/wp-content/uploads/2021/04/brows.jpg)
سنقوم بانشاء خمس فئات او كلاسات على النحو التالى :
- Book.java
- ConnectionFactory.java
- BookDAO.java
- 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 التى تستخدم لإنشاء واجه المستخدم الرسومية لتنفيذ المشروع وتلك الفئة تحتوي على الطرق التالية :
- الطريق getCount : تعمل هذه الطريقة في العثور على عدد سجلات جدول الكتاب عن طريق استدعاء getRowCount () من BookDAO.java...تقوم أيضًا بحساب إجمالي الصفحات الخاصة بالترقيم بناءً على حقل PAGE_SIZE.
- الطريقة getPageData :للحصول على السجلات من Book Table. وقم بتعيينه على JTable بناءً على رقم الصفحة....لتحديث تفاصيل ترقيم الصفحات ، يتم استدعاء getPaginationDetails ().
- الطريقة 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](https://www.ebhor.com/wp-content/uploads/2021/04/pagination-min.jpg)
السنى- ........
- تاريخ التسجيل : 18/02/2011
المساهمات : 249
النقاط : 465
التقيم : 26
الجنس :
رد: ترقيم صفحات JTable Pagination باستخدام JDBC مع قواعد بيانات MySQL
أحسنت يا سني @السنى
ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم
| |
منتدى مصر التقني :: قسم لغات البرمجة Programming languages :: لغة الجافا Java :: واجهة المستخدم الرسومية Java Swing
صفحة 1 من اصل 1
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى
» تصميم تطبيق جوال لمغسلة ملابس
» تصميم تطبيق جوال لشركة عقارات
» شركة مكافحة النمل الابيض بالرياض
» تصميم تطبيق جوال لنقل الاثاث
» هناجر
» تصميم تطبيق جوال لمتجر ورد
» تصميم تطبيق جوال لسلسلة مطاعم
» تصميم تطبيق جوال لتوصيل الطلبات
» مظلات سيارات متحركة