مقدمة إلى JavaFX
مقدمة إلى JavaFX
JavaFX هي مجموعة أدوات واجهة المستخدم الرسومية الحديثة للغة Java. تحلّ محلّ Swing بوصفها الأسلوب الموصى به لبناء تطبيقات سطح المكتب الغنية، وتُحضر معها نموذج عرض قائم على شجرة المشهد (scene graph)، وتنسيق بالـ CSS، ورسومات مُعجَّلة بالمعالج الرسومي، ونظامًا نظيفًا من الخصائص والربط يجعل واجهات المستخدم التفاعلية سهلة الكتابة. بنهاية هذا البرنامج التعليمي ستكون قد بنيت نافذة JavaFX حقيقية قابلة للتشغيل — لكنّك أولًا تحتاج إلى فهم ما هي JavaFX، ولماذا وُجدت، وكيف تربطها بمشروعك.
تاريخ مختصر: من AWT إلى Swing إلى JavaFX
كان لـ Java دعمٌ للواجهات الرسومية منذ أيامها الأولى. ظهرت مجموعة الأدوات المجردة للنوافذ (AWT) في Java 1.0 وكانت تعرض المكوّنات باستخدام أدوات واجهة المستخدم الأصيلة لنظام التشغيل. كانت تعمل، لكنّ الطبقة الرفيعة فوق عناصر التحكم الخاصة بكل منصة جعلت السلوك المتسق عبر المنصات أمرًا عسيرًا. جاءت Swing مع Java 1.2 وحلّت مشكلة الاتساق برسم كل أداة في Java نفسها — فـ Swing تمتلك كل بكسل. جعل ذلك Swing قابلة للنقل بدرجة عالية، لكنّ نموذج خيوطها عُرضة للأخطاء (يجب أن يحدث كل عمل على واجهة المستخدم على خيط إرسال الأحداث)، وقد تراكمت في واجهتها البرمجية عقودٌ من التعقيد.
قُدِّمت JavaFX كتنزيل منفصل مع Java 8 ثم أُدمجت مباشرةً في حزمة JDK. أعاد Oracle فصلها في Java 11، لتصبح مشروعًا مفتوح المصدر مستقلًا مستضافًا على openjfx.io. الإصدار المستقر الحالي وقت كتابة هذا الدرس هو JavaFX 21 (دعم طويل الأمد LTS)، ويستهدف Java 21.
ما يجعل JavaFX مختلفة عن Swing
الاختلاف المعماري الأبرز هو شجرة المشهد (scene graph). في Swing تبني شجرة من كائنات JComponent وترسمها Swing في مرور تسلسلي مسطّح. في JavaFX كل عنصر مرئي هو Node (عقدة) في شجرة محتجزة تسمى Scene Graph. يتنقّل المُصيِّر (renderer) عبر هذه الشجرة بكفاءة متجاوزًا الفروع غير المتغيرة، ويُفوّض عملية الرسم إلى وحدة معالجة الرسوميات عبر خط أنابيب العرض Prism الكامن.
الاختلافات الرئيسية في لمحة سريعة:
- العرض: Swing — عرض برمجي بـ Java2D افتراضيًا. JavaFX — Prism المُعجَّل بالمعالج الرسومي (OpenGL/Direct3D)، مع عرض برمجي احتياطي في البيئات التي لا رأس لها.
- التنسيق: تستخدم Swing فئات "مظهر وإحساس" قابلة للتوصيل. تستخدم JavaFX CSS — نفس الصياغة التي تستخدمها على الويب، مطبّقةً على العقد.
- تصريحات التخطيط: تُهيَّأ مدارات تخطيط Swing في كود Java. يمكن تهيئة JavaFX أيضًا في كود Java أو في FXML، وهي لغة ترميز XML لوصف شجرة المشهد بشكل تصريحي (مماثلة لتخطيطات XML في Android).
- الخصائص والربط: تُقدّم JavaFX خصائص قابلة للمراقبة (
StringProperty،IntegerProperty، إلخ) يمكن ربطها معًا بحيث يُحدّث تغيير قيمة واحدة عناصر واجهة المستخدم التابعة تلقائيًا. - الخيوط: JavaFX لها نفس قاعدة Swing — يجب أن تحدث جميع تعديلات واجهة المستخدم على خيط تطبيق JavaFX — لكنّها توفر مساعدات أنظف (
Platform.runLater) وواجهة برمجيةTask/Serviceللعمل في الخلفية. - الوسائط والويب: تشحن JavaFX مع
MediaPlayerللصوت والفيديو وWebView، وهو متصفح مدمج مبني على Chromium (التوفر يعتمد على المنصة).
نظام وحدات JavaFX
JavaFX مُقسَّمة إلى وحدات حتى تسحب فقط ما تحتاجه:
javafx.base— المجموعات القابلة للمراقبة، الخصائص، الربطjavafx.graphics— شجرة المشهد، Stage، Scene، العقد، الأشكال، التحويلات، محرك CSSjavafx.controls— عناصر التحكم المعيارية:Button،TextField،TableView، إلخjavafx.fxml— محمّل FXML ودعم المتحكّمjavafx.media— الصوت والفيديوjavafx.web— مكوّنWebView
في الدروس القليلة الأولى تحتاج فقط إلى javafx.controls (الذي يجلب معه تعديًا javafx.base وjavafx.graphics).
إعداد مشروع JavaFX باستخدام Maven
الطريقة الموصى بها للبدء هي النموذج الأولي الرسمي لـ Maven الذي يديره فريق OpenJFX. شغّل هذا الأمر (مع استبدال معرّفات المجموعة والقطعة بمعرّفاتك الخاصة):
ينتج هذا هيكلًا عظميًا جاهزًا للعمل مع ملف pom.xml يحتوي بالفعل على تبعية JavaFX والمكوّن الإضافي javafx-maven-plugin. المقطع ذو الصلة:
لتشغيل التطبيق من الطرفية:
exec:java العادي. تتطلب JavaFX وسائط JVM محددة هي --module-path و--add-modules منذ Java 11. يُضيف javafx-maven-plugin هذه الوسائط تلقائيًا. محاولة تشغيل تطبيق JavaFX بأمر java عادي أو بـ exec:java دون هذه الأعلام تُنتج رسالة خطأ مبهمة: "Error: JavaFX runtime components are missing".
الإعداد باستخدام Gradle
إذا كنت تفضّل Gradle، أضف مكوّن org.openjfx.javafxplugin الإضافي:
دعم بيئات التطوير المتكاملة
تدعم كلٌّ من IntelliJ IDEA وEclipse مشاريع JavaFX. تشحن IntelliJ مع معالج مشاريع JavaFX مدمج (ملف → جديد → مشروع → JavaFX) يولّد هيكل Maven/Gradle لك. الإصدار المجاني Community Edition يعمل، وإن كان الإصدار Ultimate Edition يضيف مصمّمًا مرئيًا لـ FXML. Scene Builder — محرر FXML مرئي مستقل ومجاني من Gluon — يتكامل مع كلا البيئتين ويتيح لك سحب المكوّنات على لوحة قماش ورؤية FXML الناتج في الوقت الفعلي.
--module-path و--add-modules الصحيحة ستُعطيك خطأ وقت التشغيل حتى لو كانت الفئات موجودة على classpath.
JavaFX مقابل Swing — متى تختار كلًّا منهما
في أي مشروع سطح مكتب جديد يجب عليك اختيار JavaFX. لا تزال Swing مدعومة وتعمل، لكنّها تتلقى إصلاحات للأخطاء الحرجة فقط؛ فكل تطوير جديد لواجهة المستخدم من جانب Oracle يستهدف JavaFX. الأسباب الرئيسية للبقاء مع Swing هي: أنك تصون قاعدة كود Swing كبيرة قائمة، أو تحتاج مكتبة مكوّنات طرف ثالث (مثل JFreeChart) لا يوجد لها منفذ JavaFX بعد. يمكن للمجموعتين التعايش معًا: SwingNode يُضمّن محتوى Swing داخل مشهد JavaFX، وJFXPanel يُضمّن مشهد JavaFX داخل تطبيق Swing.
الخلاصة
JavaFX هي مجموعة أدوات واجهة المستخدم الرسومية الحديثة المُعجَّلة بالمعالج الرسومي، القابلة للتنسيق بـ CSS، والمبنية على شجرة المشهد للغة Java. تحلّ محلّ Swing في التطوير الجديد وهي متاحة كتبعية Maven/Gradle مستقلة منذ Java 11. تُعدّها عبر تبعية OpenJFX الرسمية والمكوّن الإضافي javafx-maven-plugin أو مكوّن Gradle الإضافي للحصول على وسائط مسار الوحدات المطلوبة مُعدَّةً تلقائيًا. في الدرس القادم ستكتب أول فئة فرعية من Application وتفهم دورة الحياة التي يتبعها كل تطبيق سطح مكتب.