التنسيق باستخدام CSS
التنسيق باستخدام CSS
يمتلك JavaFX محرك CSS متكاملاً مبنياً مباشرةً داخل رسم المشهد (scene graph). كل عقدة في المشهد تحمل فئة تنسيق (style class)، ويمكنها احتواء خصائص -fx- مباشرة، وتشارك في آلية الترتيب الوراثي (cascade) المشابهة تقريباً لـ CSS في المتصفح. والنتيجة فصل واضح بين منطق التطبيق وعرضه البصري — نفس المبدأ الذي يطبّقه مطورو الويب يومياً، لكن مستهدفاً رسم مشهد سطح المكتب بدلاً من DOM المتصفح.
كيف يعمل CSS في JavaFX
عندما يرتّب وقت تشغيل JavaFX المشهد فإنه يُنفّذ أيضاً تمريرة CSS. يحمّل أوراق الأنماط بالترتيب — ثيم Modena الافتراضي أولاً، ثم أوراق أنماط التطبيق، ثم سمات style المباشرة (inline) — ويحدّد مجموعة الخصائص البصرية النهائية لكل عقدة. جميع خصائص CSS في JavaFX مسبوقة بـ -fx- لتجنّب التعارض مع خصائص CSS القياسية.
إضافة ورقة أنماط إلى المشهد
استدع getStylesheets().add() على أي Scene أو Parent. استخدم getClass().getResource() لتحديد المسار نسبةً إلى فئتك — هذا يجعل التطبيق يعمل سواء شغّلته من IDE أو JAR أو مسار الوحدات.
يمكنك أيضاً تحديد نطاق ورقة الأنماط لشجرة فرعية بإضافتها إلى عقدة Parent (مثل VBox أو AnchorPane). تنطبق الأنماط المضافة هناك فقط على تلك العقدة وعناصرها الفرعية.
المحدّدات: الفئة والمعرّف والنوع
يدعم CSS في JavaFX ثلاثة أنواع من المحدّدات مرتبطة بمفاهيم JavaFX:
- محدّد النوع — يطابق فئة تحكم JavaFX. يستهدف
.button { }جميع عقدButton. يتبع اسم المحدّد اصطلاح CSS في JavaFX (أحرف صغيرة مع واصلات). - محدّد فئة الأنماط (
.name) — يطابق العقد التي تمتلك فئة الأنماط هذه في قائمةgetStyleClass(). وهو الأداة الرئيسية للتجميع الدلالي. - محدّد المعرّف (
#name) — يطابق العقدة الوحيدة التي تساوي خاصيةidفيها هذه السلسلة. استخدمه باعتدال؛ يجب أن تكون المعرّفات فريدة داخل المشهد.
في كود Java تضيف فئات الأنماط وتزيلها في وقت التشغيل، تماماً كما تبدّل فئات CSS في JavaScript:
الفئات الشبه (pseudo-classes): hover وfocused وdisabled
يطبّق JavaFX فئات شبه تلقائياً على العقد استناداً إلى حالتها. تنسّقها بنفس الطريقة كما في CSS للويب باستخدام صيغة النقطتين ::
PseudoClass.getPseudoClass("error") وnode.pseudoClassStateChanged(errorClass, true) لتطبيق CSS الخاص بـ :error { } من منطق التحقق — دون الحاجة إلى تبديل فئات الأنماط يدوياً.
خصائص -fx- الشائعة
أكثر خصائص CSS استخداماً في تطبيقات JavaFX:
-fx-background-color— لون صلب أو تدرّج أو قائمة طلاء متعددة الطبقات.-fx-text-fill— لون النص للتسميات والأزرار.-fx-font-familyو-fx-font-sizeو-fx-font-weight— التنسيق الطباعي.-fx-padding— الحشو الداخلي (أعلى يمين أسفل يسار، نفس اختصار CSS).-fx-background-radius/-fx-border-radius— زوايا مدوّرة.-fx-border-colorو-fx-border-width— تزيين الحدود.-fx-effect— ظلال وتمويه وتوهّج داخلي.-fx-cursor— شكل المؤشر (hand، crosshair، wait وغيرها).
الثيمات: الوضعان الفاتح والداكن
تعتمد استراتيجية الثيمات النظيفة على متغيّرات CSS (تُعرف في JavaFX بالألوان المُبحث عنها). عرّف ألواناً مسمّاة على المستوى الجذري وأشر إليها في كل مكان. تبديل الجذر يغيّر الثيم كله فوراً.
لتبديل الثيم في وقت التشغيل، استبدل ورقة الأنماط:
الأنماط المباشرة (Inline) والتنسيق البرمجي
للتجاوزات الفردية يمكنك تعيين style مباشرةً على عقدة. تتفوّق الأنماط المباشرة دائماً على أوراق الأنماط الخارجية في آلية الترتيب الوراثي — استخدمها فقط للقيم الديناميكية حقاً (ألوان محسوبة في وقت التشغيل، أحجام مستمدة من البيانات).
setStyle() للقيم الديناميكية حقاً فقط. لكل شيء آخر استخدم فئات الأنماط وبدّلها برمجياً.
الفئات الشبه المخصصة: مثال عملي
لنفترض أن لديك TextField يجب أن يظهر بحدود حمراء عند فشل التحقق. عرّف فئة شبه مخصصة واربطها بمنطق التحقق الخاص بك:
الآن يستدعي متحكمك emailField.setError(true) ويتولّى محرك CSS الباقي — دون تلاعب بالأنماط المباشرة ولا سباق إزالة فئات الأنماط.
الخلاصة
يمنحك CSS في JavaFX تحكماً كاملاً في الطبقة البصرية دون لمس كود Java. استخدم أوراق الأنماط الخارجية المحمّلة عبر getStylesheets()، واستهدف العقد بمحدّدات النوع وفئات الأنماط والمعرّفات، واستفد من الفئات الشبه للحالات التفاعلية، وابنِ الثيمات حول متغيّرات الألوان المُبحث عنها. أبقِ الأنماط المباشرة استثنائية. هذا الفصل النظيف يجعل واجهتك قابلة للصيانة والاختبار وسهلة التسليم إلى مصمّم.