بين الـawt و الـswing

نشره م. وائل حسن -أ… في

كنتُ قد قلتُ من قبل في واحدةٍ من تدويناتي أن هناك تنبيهات لأخطاء زمن تنفيذ runtime errors تظهر أثناء تجربة برنامجي الذي أعمل عليه حالياً في بيئة الـJVM، و ذلك بشكلٍ لا يمكن توقعه ! و قد ظننتُ ساعتها أن هذا ناتجٌ عن مشاكل في نظام التشغيل عندي (كتخمينٍ مبدئي) و قد تبين لي الآن  خطأ هذا الظن.
و كذا فقد كانت هناك مشاكل تواجهني بخصوص اللغة العربية في واجهة المشروع، حيث أن في البرنامج توجد تلك النافذة frame التي يوجد بها صندوق نصوص textarea يقوم بالتفاعل مع المستخدم بعرض نتائج له و أخذ مُدخلاتٍ عند اللزوم بما يُماثل محاكيات سطر الأوامر   command line emulators، و قابلتني مشكلة اتجاه النص في صندوق النصوص لأن الاتجاه الافتراضي كان من اليسار لليمين، و كان من اللازم تغيير ذلك بتغيير إعدادت صندوق النصوص ليُناسب اللغة العربية التي تُعرض بها الرسائل.

و هنا ظهرت المشاكل الغريبة: فقد جربتُ حلين هما استخدام:


ثم بعد ذلك استخدام:


و لكنهما لم يعملا مطلقاً !
و حينما بحثتُ علي الشبكة عن مثيلٍ لهذه المشاكل الغريبة وجدتُ أن أحدهم قام بالإبلاغ عن هذه المشكلة علي موقع sun، و كان الرد عليه أنها مشاكل تتعلق بمكتبة awt التي "لا تعمل" فيها دالة applyComponentOrientation  أصلاً  لعدم وجود كودٍ لها في الصنف textarea !
يعني أن الدالة مجرد حبرٍ علي ورق !
بل الأنكي أن الرد أكمل أنه ليست هناك نية لإصلاح هذا الأمر الآن !
و قد نصح صاحبُ الرد السائلَ أن يستخدم مكتبة swing بدلاً من الـawt في عمله.
و كالعادة لم "أُكذِّب خبراً" و انطلقتُ لأجرب هذا الحل الجديد، فقمتُ بعمل نسخةٍ احتياطيةٍ من عملي الأخير حتي لا أُجازف به عند عمل التغييرات الجديدة التي ربما تكون جذرية.
ثم قمتُ بحذف صندوق نصوص مكتبة awt و أدرجتُ صندوق نصوص swing، و الجيد هنا أن مكونات الواجهة API التي استعملتُها مع صندوق نصوص awt كانت موجودةً بأكملها في صندوق نصوص swing (و لا أدري هل الواجهتان متماثلتان بالكامل أم لا) و بالتالي لم أحتج لتغيير أي شيءٍ في الأكواد نهائياً (بعد جعل اسم الصندوق الجديد مماثلاً لاسم الصندوق المحذوف بالطبع).

و حينما اختبرتُ البرنامج وجدته قد تلافي مشكلة اتجاه النصوص بنجاحٍ و الحمد لله تعالي، و الرائع أن تلك الاستثناءات التي تحدثتُ عنها من قبل أصبحت أقل بكثيرٍ جداً عما كانت عليه قبلاً، بما يعني أن السبب الرئيس وراء ظهورها هو استخدام الـawt، أو علي الأقل استخدامها مع الـswing في نفس المشروع (و إن كنتُ أُرَجِّح الظن الأول)، و حينما قللتُ الاعتماد علي الـawt قلت المشاكل بالتوافق.

بعد ذلك واجهتني مشكلةٌ أخري هي أنه: عند كتابة نصٍ كبير الحجم في صندوق النصوص الجديد لا يتم عرض آخر الأسطر التي تم كتابتها، بل تظل الأسطر الأولي هي التي في المقدمة، و لرؤية الأسطر الأخيرة يحتاج المستخدم لاستخدام عمود الإزاحة scrollbar يدوياً و هو أمرٌ غير عملي لمثل هذه البرامج، فاحتجتُ إلي كودٍ لجعل الانزلاق يتم تلقائياً و وجدتُه بالفعل بحمد الله تعالي، و بعد تعديلٍ بسيط أصبح كما يلي:



و بالفعل عمل مُحاكي سطر الأوامر بشكلٍ جيد، و إن كان أثقل في العمل من النسخة التي كانت تعمل بالـawt بشكلٍ طفيف.

تذكرتُ بعد هذه الحكاية أن مكتبة الـawt كانت هي المكتبة المُعتمدة للواجهات الرسومية gui قديماً، و لكنها كانت مرتبطةً بأنظمة التشغيل بشكلٍ مُبالغٍ فيه و لذا كثُرت الأغلاط bugs فيها لدرجة أنهم وجدوا أنه من الأفضل الاستغناء عنها و عمل بديلٍ لها غير مرتبطٍ بنفس الدرجة بأنظمة التشغيل هو الـswing.
هذه الأشياء كنتُ قد علمتُها منذ زمنٍ طويل و لم أتذكرها إلا بعد ما مررتُ بالتجربة التي شرحتُها في المقال، و كان تذكرها في وقتٍ سابقٍ سيجنبني كل تلك الحيرة التر مررتُ بها. لكن الحمد لله علي الخبرة التي أجنيها من المشاكل التي أقابلها.