لقد قمت بإنشاء ساعة عالمية باستخدام Java Swing. الساعة نفسها ليست معقدة للغاية. السبب وراء قيامي بهذا المشروع الصغير هو معرفة ما إذا كان بإمكاني تخصيص المناطق الزمنية.
ها هي واجهة المستخدم الرسومية مع المناطق الزمنية الافتراضية.
إليك JDialog
الذي يعرض المناطق الزمنية المختلفة حول العالم.
يمكنك تحديد أي عدد تريده من المناطق الزمنية، على الرغم من أنني أقترح أن تكون 10 مناطق زمنية هي الحد العملي لمعظم شاشات العرض الحالية.
يتيح لك Thw JDialog
نقل المناطق الزمنية من القائمة الأساسية إلى قائمة العرض، ومن قائمة العرض إلى القائمة الأساسية. يمكنك مسح جميع المناطق الزمنية المعروضة إذا كنت تريد البدء من جديد. يجب عليك تحديد منطقة زمنية واحدة على الأقل لعرضها،
تظل القائمة الأساسية مرتبة أبجديًا. تعرض قائمة العرض المناطق الزمنية بالترتيب الذي تحدده بها. يتيح لك الضغط على مفتاح Ctrl
أثناء النقر بزر الماوس الأيسر تحديد مناطق زمنية متعددة لإضافتها أو إزالتها من القوائم.
لا يقوم هذا الرمز بحفظ المناطق الزمنية التي تحددها في ملف خصائص. هذا شيء يمكن إضافته إذا كنت تريد استخدام هذه الساعة العالمية كملف JAR قابل للتنفيذ.
لدى Oracle برنامج تعليمي مفيد، وهو إنشاء واجهة المستخدم الرسومية باستخدام Swing. تخطي قسم التعلم المتأرجح مع قسم NetBeans IDE.
عندما أقوم بإنشاء تطبيق Swing، أستخدم نمط التحكم في عرض النموذج (MVC). يسمح لي هذا النمط بفصل مخاوفي والتركيز على جزء واحد من تطبيق Swing في كل مرة. يشير اسم النمط إلى أنك تقوم بإنشاء النموذج أولاً، ثم العرض، وأخيرًا وحدة التحكم. هذه عملية متكررة، لذا فإن التغييرات في العرض أو وحدة التحكم يمكن أن تسبب تغييرات في النموذج.
بالنسبة لتطبيق Swing، يعني نمط MVC:
يقرأ العرض المعلومات من النموذج.
العرض لا يقوم بتحديث النموذج.
تقوم وحدة التحكم بتحديث النموذج وإعادة رسم/إعادة التحقق من صحة العرض.
لا توجد عادة وحدة تحكم واحدة "لتحكمهم جميعًا". يعمل كل Action
أو ActionListener
بشكل مستقل ويقوم بتحديث الجزء الخاص به من النموذج والعرض.
لقد قمت بإنشاء فئة نموذجية واحدة، وهي فئة WorldClockModel
. تحتوي هذه الفئة على التاريخ والوقت الحاليين ZonedDateTime
، و java.util.List
بجميع المناطق الزمنية، و java.util.List
للمناطق الزمنية التي سيتم عرضها. لقد اخترت ZonedDateTime
بحيث لا يتعين علي تخزين الوقت الحالي إلا مرة واحدة. يمكنني تمرير ZoneId
إلى ZonedDateTime
للحصول على الوقت الحالي في أي منطقة زمنية.
تأتي List
جميع المناطق الزمنية من طريقة ZoneId
getAvailableZoneIds
. أقوم بتصفية المناطق الزمنية التي لا تتعلق بالمدينة.
لقد قمت بإنشاء فئتين للعرض، فئة WorldClockGUI
وفئة DisplayPanel
. تقوم فئة WorldClockGUI
بإنشاء JFrame
و JPanel
الرئيسي. تتكون JPanel
الرئيسية من مثيلات DisplayPanel
، واحدة لكل منطقة زمنية سيتم عرضها.
يحتوي JFrame
على BorderLayout
افتراضي، لذا قمت بوضع JPanel
الرئيسية في وسط BorderLayout
. يستخدم JPanel
الرئيسي GridLayout
لوضع مثيلات DisplayPanel
في عمودين متباعدين بشكل متساوٍ.
يعرض JDialog
قائمة بجميع المناطق الزمنية، وقائمة المناطق الزمنية المعروضة، والتحكم في JButtons
لنقل المناطق الزمنية من قائمة إلى أخرى. أستخدم اثنين DefaultListModels
، واحد لكل قائمة.
تقوم فئة TimezoneDialogListener
بنسخ قائمة العرض من شاشة العرض DefaultListModel
مرة أخرى إلى فئة نموذج التطبيق وتحديث العرض.
يقوم Timer
التأرجح بتحديث الوقت الحالي كل 20 ثانية. وهذا دقيق بما يكفي لساعة تعرض الساعات والدقائق.
تقوم بقية JButtons
الموجودة في JDialog
بتشغيل ActionListeners
المجهولين لأداء مهامهم. المستمعون قصيرون، لذلك كان من المنطقي تخصيص دروس مجهولة لهم.