وائل حسن مهندس بيشارك كويس
عدد المساهمات : 104 تاريخ التسجيل : 18/05/2010 العمر : 37 الموقع : أرى بخارى بلادي وهي نائية -- وأستريح إلى ذكرى خراسانِ Upload Photos : أهم مواضيعى : مدونتي الشخصية:
مدونة أفكار (مدونةٌ شخصيةٌ عن: السياسة، و المجتمع، و الأدب، و العلم.)
http://afkar-abo-eyas.blogspot.com
| موضوع: بين الـawt و الـswing الجمعة 24 أغسطس - 18:54 | |
|
كنتُ قد قلتُ من قبل أن هناك تنبيهاتٍ لأخطاء زمن تنفيذ runtime errors تظهر أثناء تجربة برنامجي الذي أعمل عليه حالياً في بيئة الـJVM، و ذلك بشكلٍ لا يمكن توقعه ! و قد ظننتُ ساعتها أن هذا ناتجٌ عن مشاكل في نظام التشغيل عندي (كتخمينٍ مبدئي) و قد تبين لي الآن خطأ هذا الظن. و كذا فقد كانت هناك مشاكل تواجهني بخصوص اللغة العربية في واجهة المشروع، حيث أن في البرنامج توجد تلك النافذة frame التي يوجد بها صندوق نصوص textarea يقوم بالتفاعل مع المستخدم بعرض نتائج له و أخذ مُدخلاتٍ عند اللزوم بما يُماثل محاكيات سطر الأوامر command line emulators، و قابلتني مشكلة اتجاه النص في صندوق النصوص لأن الاتجاه الافتراضي كان من اليسار لليمين، و كان من اللازم تغيير ذلك بتغيير إعدادت صندوق النصوص.
و هنا ظهرت المشاكل الغريبة: فقد جربتُ حلين هما استخدام:
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] 1 2 3 4 |
private Locale arabic = new Locale("ar", "KW"); private ComponentOrientation arabicOrientation = ComponentOrientation.getOrientation(arabic); console_area.setComponentOrientation(arabicOrientation); |
ثم بعد ذلك استخدام:
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] 1 |
console_area.applyComponentOrientation(arabicOrientation); |
و لكنهما لم يعملا مطلقاً ! و حينما بحثتُ علي الشبكة عن مثيلٍ لهذه المشاكل الغريبة وجدتُ أن أحدهم قام بالإبلاغ عن هذه المشكلة علي موقع sun، و كان الرد عليه أنها مشاكل تتعلق بمكتبة awt التي "لا تعمل" فيها دالة applyComponentOrientation أصلاً لعدم وجود كودٍ لها في الصنف textarea ! يعني أن الدالة مجرد حبرٍ علي ورق ! بل الأنكي أن الرد أكمل أنه ليست هناك نية لإصلاح هذا الأمر الآن ! و قد نصح صاحبُ الرد السائلَ أن يستخدم مكتبة swing بدلاً من الـawt في عمله. و كالعادة لم "أكذب خبراً" و انطلقتُ لأجرب هذا الحل الجديد، فقمتُ بعمل نسخةٍ احتياطيةٍ من عملي الأخير حتي لا أُجازف به عند عمل التغييرات الجديدة التي ربما تكون جذرية. ثم قمتُ بحذف صندوق نصوص مكتبة awt و أدرجتُ صندوق نصوص swing، و الجيد هنا أن مكونات الواجهة API التي استعملتُها مع صندوق نصوص awt كانت موجودةً بأكملها في صندوق نصوص swing (و لا أدري هل الواجهتان متماثلتان بالكامل أم لا) و بالتالي لم أحتج لتغيير أي شيءٍ في الأكواد نهائياً (بعد جعل اسم الصندوق الجديد مماثلاً لاسم الصندوق المحذوف بالطبع). و حينما اختبرتُ البرنامج وجدته قد تلافي مشكلة اتجاه النصوص بنجاحٍ و الحمد لله تعالي، و الرائع أن تلك الاستثناءات التي تحدثتُ عنها من قبل أصبحت أقل بكثيرٍ جداً عما كانت عليه قبلاً، بما يعني أن السبب الرئيس وراء ظهورها هو استخدام الـawt، أو علي الأقل استخدامها مع الـswing في نفس المشروع (و إن كنتُ أُرَجِّح الظن الأول)، و حينما قللتُ الاعتماد علي الـawt قلت المشاكل بالتوافق.
بعد ذلك واجهتني مشكلةٌ أخري هي أنه: عند كتابة نصٍ كبير الحجم في صندوق النصوص الجديد لا يتم عرض آخر الأسطر التي تم كتابتها، بل تظل الأسطر الأولي هي التي في المقدمة، و لرؤية الأسطر الأخيرة يحتاج المستخدم لاستخدام عمود الإزاحة scrollbar يدوياً و هو أمرٌ غير عملي لمثل هذه البرامج، فاحتجتُ إلي كودٍ لجعل الانزلاق يتم تلقائياً و وجدتُه بالفعل بحمد الله تعالي، و بعد تعديلٍ بسيط أصبح كما يلي:
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] 1 2 3 4 |
int pos = console.console_area.getText().length() - 1; if(pos < 0) pos = 0; console.console_area.setCaretPosition(pos); |
و بالفعل عمل مُحاكي سطر الأوامر بشكلٍ جيد، و إن كان أثقل في العمل من النسخة التي كانت تعمل بالـawt بشكلٍ طفيف. الخلاصة هنا أن استخدام الـswing أفضل و أكثر أمناً من الـawt التي يتم إهمالها تدريجياً بما يُوحي بالرغبة مستقبلاً في إسقاطها من الحسابات تماماً. | |
|