import java.util.ArrayList;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Pagination;
import javafx.stage.Stage;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
public class Main extends Application {
// خصصناه لتخزين عدد العناصر التي نريد إظهارها في كل صفحة itemsPerPage المتغير
// getFonts() وضعنا فيه جميع أسماء الخطوط التي سنظهرها في الصفحات و التي حصلنا عليها من الدالة Arrayعبارة عن dataالكائن
ArrayList<String> data= getFonts();
// Arrayهنا قمنا بتعريف دالة ترجع أسماء الخطوط الموجودة على جهاز المستخدم ككائن نوعه
public ArrayList<String> getFonts()
return new ArrayList(Arrays.asList(Font.getFamilies().toArray(new String[]{})));
// بناءاً على عدد أسماء الخطوط التي سنظهرها فيه Pagination هنا قمنا بتعريف دالة ترجع عدد الصفحات التي يجب أن تكون موجودة في الكائن
public int getNumberOfPages()
// totalItems في المتغير dataهنا قمنا بتخزين عدد الخطوط المخزنة في الكائن
double totalItems = dataList.size();
// الشرطين التاليين يرجعان عدد الصفحات التي يجب إنشائها نسبةً لعدد العناصر التي سيتم وضعها في كل صفحة
if(totalItems%itemsPerPage == 0)
return (int)(totalItems/itemsPerPage);
return (int)(totalItems/itemsPerPage) + 1;
// pagination هنا قمنا بإنشاء دالة خاصة لإنشاء و ترتيب محتوى كل صفحة سيتم إضافتها في الكائن
public VBox createPage(int pageIndex)
// VBox محتوى كل صفحة سنعرضه بداخل حاوية نوعها
// dataإسم الخط التالي الذي يجب أن يتم جلبه من الكائن index سنستخدمه لمعرفة nextItemIndex المتغير
int nextItemIndex = pageIndex * itemsPerPage;
// لا يساوي بعد عدد العناصر التي نريد وضعها في كل صفحة vBox طالما أن عدد العناصر الموضوعة في الكائن
while(vBox.getChildren().size() < itemsPerPage) {
// و يوضع له كنص dataو سيتم جلب إسم خط جديد من الكائن Label سيتم إنشاء
Label label = new Label(dataList.get(nextItemIndex));
label.setStyle("-fx-padding: 0 0 0 5;");
// حتى يظهر في الصفحة vBox في الكائن label بعدها سيتم إضافة الكائن
vBox.getChildren().add(label);
// dataمن أجل جلب إسم الخط التالي من الكائن nextItemIndex هنا قمنا بإضافة 1 على قيمة المتغير
// الذي أصبح يحتوي على كل العناصر التي يجب عرضها في الصفحة vBox في الأخير سيتم إرجاع الكائن
public void start(Stage stage) {
// في النافذة Root Node و الذي ننوي جعله الـ AnchorPane هنا قمنا بإنشاء كائن من الكلاس
AnchorPane root = new AnchorPane();
// root الذي نريد إضافته في الكائن Pagination يمثل الـ Pagination هنا قمنا بإنشاء كائن من الكلاس
Pagination pagination = new Pagination();
// التي سترجع عدد الصفحات التي يجب إنشاءها getNumberOfPages() و مررنا الدالة pagination هنا قمنا بتحديد عدد صفحات الكائن
pagination.setPageCount(getNumberOfPages());
// حتى تقوم بتوليد محتوى كل صفحة فيه createPage() و مررنا لها الدالة setPageFactory() هنا قمنا باستدعاء الدالة
pagination.setPageFactory((Integer pageIndex) -> createPage(pageIndex));
// أبيض و جعلنا لون حدوده رمادي فاتح pagination هنا جعلنا لون خلفية الكائن
pagination.setStyle("-fx-background-color:white; -fx-border-color: lightgray;");
// STYLE_CLASS_BULLET و حددنا أننا نريد إستخدام التصميم المحدد في الثابت pagination هنا قمنا بتغيير تصميم الكائن
pagination.getStyleClass().add(Pagination.STYLE_CLASS_BULLET);
// من كل الجهات بمقدار 20 بيكسل ( root الذي سيوضع بداخله ( أي الكائن AnchorPane عن كائن الـ pagination هنا قمنا بتحديد مكان بعد الكائن
AnchorPane.setTopAnchor(pagination, 20.0);
AnchorPane.setRightAnchor(pagination, 20.0);
AnchorPane.setLeftAnchor(pagination, 20.0);
AnchorPane.setBottomAnchor(pagination, 20.0);
// root في الكائن pagination هنا قمنا بإضافة الكائن
root.getChildren().add(pagination);
// فيها و تحديد حجمها Node كأول root هنا قمنا بإنشاء محتوى النافذة مع تعيين الكائن
Scene scene = new Scene(root, 350, 250);
// هنا وضعنا عنوان للنافذة
stage.setTitle("JavaFX Pagination");
// أي وضعنا محتوى النافذة الذي قمنا بإنشائه للنافذة .stage في كائن الـ scene هنا وضعنا كائن الـ
// هنا قمنا بإظهار النافذة
// هنا قمنا بتشغيل التطبيق
public static void main(String[] args) {
import java.util.ArrayList;
import java.util.Arrays;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Pagination;
import javafx.stage.Stage;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
public class Main extends Application {
// خصصناه لتخزين عدد العناصر التي نريد إظهارها في كل صفحة itemsPerPage المتغير
int itemsPerPage = 7;
// getFonts() وضعنا فيه جميع أسماء الخطوط التي سنظهرها في الصفحات و التي حصلنا عليها من الدالة Arrayعبارة عن dataالكائن
ArrayList<String> data= getFonts();
// Arrayهنا قمنا بتعريف دالة ترجع أسماء الخطوط الموجودة على جهاز المستخدم ككائن نوعه
public ArrayList<String> getFonts()
{
return new ArrayList(Arrays.asList(Font.getFamilies().toArray(new String[]{})));
}
// بناءاً على عدد أسماء الخطوط التي سنظهرها فيه Pagination هنا قمنا بتعريف دالة ترجع عدد الصفحات التي يجب أن تكون موجودة في الكائن
public int getNumberOfPages()
{
// totalItems في المتغير dataهنا قمنا بتخزين عدد الخطوط المخزنة في الكائن
double totalItems = dataList.size();
// الشرطين التاليين يرجعان عدد الصفحات التي يجب إنشائها نسبةً لعدد العناصر التي سيتم وضعها في كل صفحة
if(totalItems%itemsPerPage == 0)
return (int)(totalItems/itemsPerPage);
else
return (int)(totalItems/itemsPerPage) + 1;
}
// pagination هنا قمنا بإنشاء دالة خاصة لإنشاء و ترتيب محتوى كل صفحة سيتم إضافتها في الكائن
public VBox createPage(int pageIndex)
{
// VBox محتوى كل صفحة سنعرضه بداخل حاوية نوعها
VBox vBox = new VBox(5);
// dataإسم الخط التالي الذي يجب أن يتم جلبه من الكائن index سنستخدمه لمعرفة nextItemIndex المتغير
int nextItemIndex = pageIndex * itemsPerPage;
// لا يساوي بعد عدد العناصر التي نريد وضعها في كل صفحة vBox طالما أن عدد العناصر الموضوعة في الكائن
while(vBox.getChildren().size() < itemsPerPage) {
try {
// و يوضع له كنص dataو سيتم جلب إسم خط جديد من الكائن Label سيتم إنشاء
Label label = new Label(dataList.get(nextItemIndex));
label.setStyle("-fx-padding: 0 0 0 5;");
// حتى يظهر في الصفحة vBox في الكائن label بعدها سيتم إضافة الكائن
vBox.getChildren().add(label);
// dataمن أجل جلب إسم الخط التالي من الكائن nextItemIndex هنا قمنا بإضافة 1 على قيمة المتغير
nextItemIndex++;
}
catch(Exception e) {
break;
}
}
// الذي أصبح يحتوي على كل العناصر التي يجب عرضها في الصفحة vBox في الأخير سيتم إرجاع الكائن
return vBox;
}
@Override
public void start(Stage stage) {
// في النافذة Root Node و الذي ننوي جعله الـ AnchorPane هنا قمنا بإنشاء كائن من الكلاس
AnchorPane root = new AnchorPane();
// root الذي نريد إضافته في الكائن Pagination يمثل الـ Pagination هنا قمنا بإنشاء كائن من الكلاس
Pagination pagination = new Pagination();
// التي سترجع عدد الصفحات التي يجب إنشاءها getNumberOfPages() و مررنا الدالة pagination هنا قمنا بتحديد عدد صفحات الكائن
pagination.setPageCount(getNumberOfPages());
// حتى تقوم بتوليد محتوى كل صفحة فيه createPage() و مررنا لها الدالة setPageFactory() هنا قمنا باستدعاء الدالة
pagination.setPageFactory((Integer pageIndex) -> createPage(pageIndex));
// أبيض و جعلنا لون حدوده رمادي فاتح pagination هنا جعلنا لون خلفية الكائن
pagination.setStyle("-fx-background-color:white; -fx-border-color: lightgray;");
// STYLE_CLASS_BULLET و حددنا أننا نريد إستخدام التصميم المحدد في الثابت pagination هنا قمنا بتغيير تصميم الكائن
pagination.getStyleClass().add(Pagination.STYLE_CLASS_BULLET);
// من كل الجهات بمقدار 20 بيكسل ( root الذي سيوضع بداخله ( أي الكائن AnchorPane عن كائن الـ pagination هنا قمنا بتحديد مكان بعد الكائن
AnchorPane.setTopAnchor(pagination, 20.0);
AnchorPane.setRightAnchor(pagination, 20.0);
AnchorPane.setLeftAnchor(pagination, 20.0);
AnchorPane.setBottomAnchor(pagination, 20.0);
// root في الكائن pagination هنا قمنا بإضافة الكائن
root.getChildren().add(pagination);
// فيها و تحديد حجمها Node كأول root هنا قمنا بإنشاء محتوى النافذة مع تعيين الكائن
Scene scene = new Scene(root, 350, 250);
// هنا وضعنا عنوان للنافذة
stage.setTitle("JavaFX Pagination");
// أي وضعنا محتوى النافذة الذي قمنا بإنشائه للنافذة .stage في كائن الـ scene هنا وضعنا كائن الـ
stage.setScene(scene);
// هنا قمنا بإظهار النافذة
stage.show();
}
// هنا قمنا بتشغيل التطبيق
public static void main(String[] args) {
launch(args);
}
}