الجمعة، 24 أغسطس، 2012

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

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

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

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



private Locale arabic = new Locale("ar", "KW");
private ComponentOrientation arabicOrientation =
ComponentOrientation.getOrientation(arabic);
console_area.setComponentOrientation(arabicOrientation);
ثم بعد ذلك استخدام:



console_area.applyComponentOrientation(arabicOrientation);

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

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

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




int pos = console.console_area.getText().length();
console.console_area.setCaretPosition(pos);
و بالفعل عمل مُحاكي سطر الأوامر بشكلٍ جيد، و إن كان أثقل في العمل من النسخة التي كانت تعمل بالـawt بشكلٍ طفيف.

الخلاصة هنا أن استخدام الـswing أفضل و أكثر أمناً من الـawt التي يتم إهمالها تدريجياً بما يُوحي بالرغبة مستقبلاً في إسقاطها من الحسابات تماماً.

هناك 6 تعليقات:

  1. أسلوبك في شرح المشكلة واضح ومنطقي يا أبا إياس، وفهمته مع أني لم أقرب كتاب برمجي منذ سنوات! وخبرتي قبلها كانت متواضعة أصلا.
    وجميل جدا أنك لم تضطر لتغيير الكثير عند الانتقال من مكتبة لأخرى، فهو شيء نادر كما أظن.

    ردحذف
    الردود
    1. أشكرك علي الإطراء :)

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

      حذف
  2. وهل عند ادخال نص عربى فى مربع النص من مكتبة swing يظهر بشكل صحيح ؟ والعكس عند الكتابة فيه أو إرسال قيمة باللغة العربية؟
    وهل جميع المكونات فى مكتبة swing تسمح بتحويل الاتجاه الى اليمين Rtl
    مشكلتى مع اللغة العربية فى جافا كانت مع هذة المكتبة نجحت فى تحويل اتجاه مربع النص كتجربة ولكنى لم انجح فى ادخال او اخراج نص عربى

    ردحذف
    الردود
    1. إدخال النص العربي و قراءته يتمان بصورةٍ صحيحةٍ في صندوق النصوص في swing. أما بالنسبة لدعم اتجاه اليمين إلي اليسار فلا أدري هل تدعمه كل المكونات أم لا لكن صندوق النصوص يتم فيه الأمر بشكل عادي.
      أقترح أن تتأكد من كون صندوق النصوص الذي تتعامل معه من مكتبة swing و ليس من awt فربما يكون ما حدث معي هو عين ما حدث معك.

      حذف
  3. السلام عليكم أبا اياس مــاشاء الله قرآت الموضوع بووداي التقنية وجيت هنا أسألك

    ألحين أنا تعلمت شوي بالجافا تعلمت الحمدلله الاساسيات

    لكن يوم وصلت للـ GUI وجدت صعوبة حيث أستخدم أنا محرر نصوص VIM

    يعني مااقدر أتعامل مع الـ GUI بشكل سلس مثل بعض IDE

    هل تنصحني كمبتدا أستمر بـاستخدام vim حيث أحدد مكان كل شي بنفسي ولا استخدم IDE

    وكيف المبرمجين المتقدمين هل يستخدمون البرامج المساعدة في عمل GUI

    جزاك الله خير

    ردحذف
    الردود
    1. و عليكم السلام و رحمة الله و بركاته

      مرحباً بك أخي مُفيداً و مُستفيداً ^_^

      في رأيي المتواضع فـ"يجب" عليك أن تعتمد علي بيئات البرمجة المتكاملة كل الاعتماد؛ ليس معني هذا أن الوسائل الأخري سيئة 100%، بل معناه أن الجيل القديم هو الذي يستفيد منها كل الاستفادة، و لو أخذنا لينوس تورفالدز مثالاً فسنري أنه من الأفضل له أن يستخدم محرر نصوص كفء في البرمجة لأنه يُتيح له استخدام سطر الأوامر بكثرة، كما أنه خفيف و سريع و غير معقد، و هو لا يحتاج إلي الإمكانيات الزائدة التي توجد في الييئات المتكاملة لأنه يُبرمج علي مستوي غاية في الانخفاض علي عكس معظمنا.

      أما نحن فنحتاج لمصمم واجهاتٍ رسومية gui designer لأن برامجنا في حيز المستخدم user space و "يجب" عملياً أن تكون بواجهةٍ رسوميةٍ في الأغلبية الساحقة من الأحيان.

      أنا عن نفسي أُرشح لك بيئة النتبينز netbeans لقوتها و إمكانياتها الواسعة، و أنا عن نفسي أستعملها منذ أن احترفتُ الجافا.
      يمكنك تحميل آخر إصدارة من الرابط:
      http://netbeans.org/downloads/index.html

      حذف