الأشكال الأساسية ولوحة الرسم
الأشكال الأساسية ولوحة الرسم
يأتي JavaFX بنظامَين مختلفَين للرسم. الأول هو نظام عقد الأشكال: كائنات تصريحية مثل Rectangle وCircle وLine تعيش بوصفها عقدًا من الدرجة الأولى في رسم البيانات المشهدية، وتستجيب لـ CSS وتستقبل أحداث الماوس ويمكن تحريكها بنفس واجهة برمجة الانتقالات التي تستخدمها لأي عقدة أخرى. الثاني هو Canvas: سطح بكسل ذو وضع فوري يعمل مثل قماش HTML5 — تحصل على GraphicsContext وتصدر أوامر الرسم بشكل إجرائي. لكل نهج مكانه المناسب، وفهم أيهما تختار مهارة محورية.
عقد الأشكال: رسوميات متجهية تصريحية
تمتد جميع فئات الأشكال من javafx.scene.shape.Shape، التي تمتد بدورها من Node. وهذا يعني أن كل شكل يشارك تلقائيًا في التخطيط واختبار الاصطدام والحركات. أكثر الأشكال استخدامًا هي:
Rectangle— يُعرَّف بـxوyوwidthوheight، معarcWidth/arcHeightالاختياريين لتدوير الزوايا.Circle— يُعرَّف بإحداثيات المركزcenterXوcenterYوالنصفradius.Ellipse— مثل Circle لكن بنصفَي قطر مستقلَّينradiusXوradiusY.Line— يصل بين نقطتين: من(startX, startY)إلى(endX, endY).Polygon/Polyline— تسلسلات اعتباطية من أزواج إحداثيات x/y.Path— الشكل الأكثر قوةً: تسلسل من كائناتPathElement(MoveTo وLineTo وCubicCurveTo وArcTo وغيرها) يمكنه وصف أي محيط.
فيما يلي مشهد صغير يضع ثلاثة أشكال في Pane ويطبق عليها تعبئة وحدودًا:
setFill() داخل الشكل؛ أما setStroke() فتلوّن محيطه الخارجي. كلتاهما تقبل أي Paint — سواء Color أو LinearGradient أو RadialGradient. ضبط التعبئة على Color.TRANSPARENT هو الطريقة الصحيحة لإنشاء شكل محيطي فقط.
العمل مع LinearGradient
تُعدّ ألوان الرسم في JavaFX كائنات متكاملة. يتدرّج LinearGradient بين نقاط توقف ألوان على طول متجه اتجاه. وسيطات المنشئ هي: startX وstartY وendX وendY (كلها في النطاق 0–1 عندما يكون proportional=true)، وطريقة الدورة، والعلم التناسبي، وقائمة كائنات Stop.
خصائص الحدود
تكشف فئة Shape عن تحكم دقيق في الحدود يعكس نموذج SVG/canvas:
setStrokeLineCap(StrokeLineCap.ROUND)— نهايات مدوّرة للمسارات المفتوحة والخطوط.setStrokeLineJoin(StrokeLineJoin.MITER)— كيفية ربط الزوايا.setStrokeDashArray(Double...)— أطوال متناوبة للشرطات والفراغات.setStrokeDashOffset(double)— إزاحة الطور في نمط الشرطات، مفيدة لتحريك "نمل المسير" المتحرك.
واجهة برمجة Canvas: الرسم الفوري
Canvas عقدة ذات مخزن بكسل ثابت. لا تضيف إليها أشكالًا فرعية؛ بدلًا من ذلك تصدر أوامر رسم على GraphicsContext الخاصة بها. التغييرات فورية ودائمة — لا يوجد تسلسل أشكال محتجز يمكن الاستعلام عنه أو تحريكه. وهذا يجعل Canvas الخيار المناسب للمرئيات الكثيفة (الرسوم البيانية وصور الألعاب وخرائط الحرارة) حيث ستكون تكلفة إدارة آلاف عقد رسم البيانات المشهدية الفردية باهظة جدًا.
GraphicsContext بحالة رسم حالية (طلاء التعبئة وطلاء الحدود وعرض الخط والخط والتحويل والقطع). استدع الضوابط قبل كل أمر رسم يحتاجها. استخدم gc.save() / gc.restore() لدفع مكدس الحالة بأكمله وإخراجه، وهو أنظف طريقة لتطبيق تحويل أو قطع مؤقت دون تلويث أوامر الرسم اللاحقة.
مسح اللوحة وإعادة رسمها
بما أن اللوحة مخزن بكسل، فإن تحديثها يعني إعادة الطلاء. النمط المعياري هو مسح المنطقة المتأثرة وإعادة رسم كل شيء:
حفظ حالة GraphicsContext واستعادتها
الاختيار بين عقد الأشكال و Canvas
- استخدم عقد الأشكال عندما تحتاج إلى أحداث النقر/التحوم على أشكال فردية، أو تنسيق CSS، أو حركات سلسة للخصائص عبر واجهة برمجة الانتقالات.
- استخدم Canvas عندما ترسم مئات العناصر في كل إطار، أو تنفّذ مخططًا مخصصًا أو حلقة لعبة، أو تحتاج إلى تحكم دقيق على مستوى البكسل.
- امزج بينهما بحرية:
CanvasمجردNode— يمكنك وضعها في نفسPaneمع عقد أشكال، وطبقة خلفية مرسومة بالبكسل خلف عناصر تحكم متجهية تفاعلية.
الخلاصة
يمنحك JavaFX أداتَي رسم قويتَين. عقد الأشكال — Rectangle وCircle وPath وأقاربها — تعيش في رسم البيانات المشهدية وتستجيب لـ CSS والأحداث، وهي الخيار الافتراضي الصحيح لعناصر واجهة المستخدم التفاعلية. أما Canvas مع GraphicsContext فهي سطح ذو وضع فوري يتفوق في التصيير الكثيف عالي التردد. أتقن كليهما، وافهم نموذج آلة الحالة في GraphicsContext، واستخدم save()/restore() للحفاظ على روتينات الرسم المعقدة نظيفة وقابلة للتركيب.