import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.DatePicker;
import javafx.stage.Stage;
import javafx.util.StringConverter;
public class Main extends Application {
// ليظهر كالتالي: سنة - شهر - يوم datePicker سنستخدمه لتحديد الطريقة التي سيظهر بها التاريخ بداخل الكائن pattern المتغير
final String pattern = "d-M-Y";
// pattern هنا قمنا بتعريف دالة خاصة لإرجاع التاريخ الذي يختاره المستخدم بالشكل (الفورمات) الذي تم تحديده في المتغير
public StringConverter dateFormatter() {
StringConverter converter = new StringConverter<LocalDate>() {
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(pattern);
public String toString(LocalDate date) {
return dateFormatter.format(date);
public LocalDate fromString(String string) {
if (string != null && !string.isEmpty()) {
return LocalDate.parse(string, dateFormatter);
public void start(Stage stage) {
// يمثل قائمة إختيار التاريخ التي نريد إضافتها في النافذة DatePicker هنا قمنا بإنشاء كائن من الكلاس
DatePicker datePicker = new DatePicker();
// pattern يظهر بالفورمات الذي يشير إليه الـ datePicker لها لجعل التاريخ الذي يظهر في الكائن dateFormatter() و تمرير الدالة setConverter() هنا قمنا باستدعاء الدالة
datePicker.setConverter(dateFormatter());
// إذا كان فارغاً و سهم الكتابة غير موضوع فيه datePicker و الذي يمثل فورمات التاريخ, يظهر في الكائن pattern هنا قمنا بجعل النص المخزن في المتغير
datePicker.setPromptText(pattern.toLowerCase());
// في النافذة datePicker هنا قمنا بتحديد مكان ظهور الكائن
datePicker.setTranslateX(140);
datePicker.setTranslateY(30);
// في النافذة datePicker هنا قمنا بتحديد حجم الـ
datePicker.setPrefSize(120, 30);
// في النافذة Root Node لأننا ننوي جعله الـ Group هنا قمنا بإنشاء كائن من الكلاس
Group root = new Group();
// root في الكائن datePicker هنا قمنا بإضافة الكائن
root.getChildren().add(datePicker);
// فيها و تحديد حجمها Node كأول root هنا قمنا بإنشاء محتوى النافذة مع تعيين الكائن
Scene scene = new Scene(root, 400, 300);
// هنا وضعنا عنوان للنافذة
stage.setTitle("JavaFX DatePicker");
// أي وضعنا محتوى النافذة الذي قمنا بإنشائه للنافذة .stage في كائن الـ scene هنا وضعنا كائن الـ
// هنا قمنا بإظهار النافذة
// عند تشغيل التطبيق و بالتالي لجعل المستخدم يعرف فورمات التاريخ datePicker لضمان أن لا يكون سهم الكتابة موضوع بداخل الكائن requestFocus() هنا قمنا باستدعاء الدالة
// هنا قمنا بتشغيل التطبيق
public static void main(String[] args) {
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.DatePicker;
import javafx.stage.Stage;
import javafx.util.StringConverter;
public class Main extends Application {
// ليظهر كالتالي: سنة - شهر - يوم datePicker سنستخدمه لتحديد الطريقة التي سيظهر بها التاريخ بداخل الكائن pattern المتغير
final String pattern = "d-M-Y";
// pattern هنا قمنا بتعريف دالة خاصة لإرجاع التاريخ الذي يختاره المستخدم بالشكل (الفورمات) الذي تم تحديده في المتغير
public StringConverter dateFormatter() {
StringConverter converter = new StringConverter<LocalDate>() {
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(pattern);
@Override
public String toString(LocalDate date) {
if (date != null) {
return dateFormatter.format(date);
}
return "";
}
@Override
public LocalDate fromString(String string) {
if (string != null && !string.isEmpty()) {
return LocalDate.parse(string, dateFormatter);
}
return null;
}
};
return converter;
}
@Override
public void start(Stage stage) {
// يمثل قائمة إختيار التاريخ التي نريد إضافتها في النافذة DatePicker هنا قمنا بإنشاء كائن من الكلاس
DatePicker datePicker = new DatePicker();
// pattern يظهر بالفورمات الذي يشير إليه الـ datePicker لها لجعل التاريخ الذي يظهر في الكائن dateFormatter() و تمرير الدالة setConverter() هنا قمنا باستدعاء الدالة
datePicker.setConverter(dateFormatter());
// إذا كان فارغاً و سهم الكتابة غير موضوع فيه datePicker و الذي يمثل فورمات التاريخ, يظهر في الكائن pattern هنا قمنا بجعل النص المخزن في المتغير
datePicker.setPromptText(pattern.toLowerCase());
// في النافذة datePicker هنا قمنا بتحديد مكان ظهور الكائن
datePicker.setTranslateX(140);
datePicker.setTranslateY(30);
// في النافذة datePicker هنا قمنا بتحديد حجم الـ
datePicker.setPrefSize(120, 30);
// في النافذة Root Node لأننا ننوي جعله الـ Group هنا قمنا بإنشاء كائن من الكلاس
Group root = new Group();
// root في الكائن datePicker هنا قمنا بإضافة الكائن
root.getChildren().add(datePicker);
// فيها و تحديد حجمها Node كأول root هنا قمنا بإنشاء محتوى النافذة مع تعيين الكائن
Scene scene = new Scene(root, 400, 300);
// هنا وضعنا عنوان للنافذة
stage.setTitle("JavaFX DatePicker");
// أي وضعنا محتوى النافذة الذي قمنا بإنشائه للنافذة .stage في كائن الـ scene هنا وضعنا كائن الـ
stage.setScene(scene);
// هنا قمنا بإظهار النافذة
stage.show();
// عند تشغيل التطبيق و بالتالي لجعل المستخدم يعرف فورمات التاريخ datePicker لضمان أن لا يكون سهم الكتابة موضوع بداخل الكائن requestFocus() هنا قمنا باستدعاء الدالة
root.requestFocus();
}
// هنا قمنا بتشغيل التطبيق
public static void main(String[] args) {
launch(args);
}
}