محبوبترینها
نمایش جنگ دینامیت شو در تهران [از بیوگرافی میلاد صالح پور تا خرید بلیط]
9 روش جرم گیری ماشین لباسشویی سامسونگ برای از بین بردن بوی بد
ساندویچ پانل: بهترین گزینه برای ساخت و ساز سریع
خرید بیمه، استعلام و مقایسه انواع بیمه درمان ✅?
پروازهای مشهد به دبی چه زمانی ارزان میشوند؟
تجربه غذاهای فرانسوی در قلب پاریس بهترین رستورانها و کافهها
دلایل زنگ زدن فلزات و روش های جلوگیری از آن
خرید بلیط چارتر هواپیمایی ماهان _ ماهان گشت
سیگنال در ترید چیست؟ بررسی انواع سیگنال در ترید
بهترین هدیه تولد برای متولدین زمستان: هدیههای کاربردی برای روزهای سرد
در خرید پارچه برزنتی به چه نکاتی باید توجه کنیم؟
صفحه اول
آرشیو مطالب
ورود/عضویت
هواشناسی
قیمت طلا سکه و ارز
قیمت خودرو
مطالب در سایت شما
تبادل لینک
ارتباط با ما
مطالب سایت سرگرمی سبک زندگی سینما و تلویزیون فرهنگ و هنر پزشکی و سلامت اجتماع و خانواده تصویری دین و اندیشه ورزش اقتصادی سیاسی حوادث علم و فناوری سایتهای دانلود گوناگون
مطالب سایت سرگرمی سبک زندگی سینما و تلویزیون فرهنگ و هنر پزشکی و سلامت اجتماع و خانواده تصویری دین و اندیشه ورزش اقتصادی سیاسی حوادث علم و فناوری سایتهای دانلود گوناگون
آمار وبسایت
تعداد کل بازدیدها :
1829408914
مديريت رويداد در جاوا
واضح آرشیو وب فارسی:سایت ریسک: View Full Version : مديريت رويداد در جاوا B O L O T04-06-2007, 10:14 PMاشاره : در زبان برنامهنويسي جاوا هم همانند ديگر زبانهاي برنامهنويسي كه فرض ميشود خواننده حداقل با اصول اوليه يكي از اين زبانها آشنا است، از مفهوم رويداد استفاده فراوان ميشود. با هر يك از كنشهاي كاربر در زمان كار با رابطهاي گرافيكي كاربر، رويدادهاي متعددي از طرف اجزاي گرافيكي رابط كاربر توليد و يا صادر ميشود. به عنوان مثال قرار گرفتن اشارهگر ماوس روي يك كليد (بدون فشرده شدن كليدهاي ماوس)، خارج شدن اشارهگر ماوس از محدوده همان كليد، پايين رفتن كليد سمت چپ در زماني كه اشارهگر در محدود هندسي كليد قرار دارد و يا بالا آمدن كليد پس از كليك شدن آن كليد، نمونههايي از رويدادهاي بسيار متعددي هستند كه برنامهنويس تنها در برابر برخي از آنها تصميم ميگيرد تا واكنشهاي مناسبي طراحي كند. نكته ديگري كه بد نيست در همينجا به آن اشاره كنيم آن است كه كنشهاي كاربر در برخورد با رابطهاي گرافيكي تنها عامل توليد يا صدور بخشي از رويدادها هستند و بسياري از رويدادهاي ديگر در برابر كنش و واكنشهاي دروني سختافزار توليد ميشوند. مثلاً زنگ خوردن تلفن ممكن است باعث شود تا سختافزار مودم درون يك كامپيوتر را وادار به توليد رويدادهاي مختلفي نمايد. اتصال يك دستگاه چاپگر به درگاه موازي يا USB يك دستگاه كامپيوتر نيز مورد ديگري است كه موجب توليد گروه ديگري از رويداد خواهد شد. ما در اين نوشته، توجه خود را معطوف رويدادهايي خواهيم كرد كه بر اثر كنشهاي كاربر در برابر رابطهاي گرافيكي نرمافزارها توليد ميشوند. بهطور كلي برنامهنويسان در محيطهاي برنامهنويسي گوناگون ميتوانند با انتخاب يكي از اشياي رابط كاربر در زمان طراحي نرمافزار خود براي هر يك از رويدادهاي توليد شده توسط آن شي گرافيكي قطعات كد هدفداري بنويسند. اين عمل در زبان جاوا كمي پيچيدهتر از ديگر زبانهاي برنامهنويسي انجام ميشود. براي شرح بهتر اين مقوله در دنياي جاوا بهتر است در ابتدا با اصطلاحات متداول در اين زبان كمي آشنا شويم. بهطور كلي در زبان جاوا هر شي رابط گرافيكي كه بتواند رويداد توليد نمايد، يك منبع رويداد (Event Source نام دارد. همانطور كه قبلاً گفتيم، در محيطهاي برنامهنويسي غيرجاوا مانند ويژوال بيسيك يا دلفي، برنامهنويس با انتخاب يك شي از اشياي رابط كاربر و انتخاب يكي از رويدادهاي وابسته با آن مثلاً كليك ماوس، به تابعي خواهد رسيد كه بايد درون آن كدهاي مورد نظر خود را قرار دهد. بدين ترتيب، در زمان اجرا (run time) و در زماني كه آن رويداد بر اثر كنش با كاربر نرمافزار توليد شد، پردازنده طي مكانيسمي كه از نظر برنامهنويس پنهان است تابع نوشته شده را اجرا خواهد كرد و در نتيجه هدف برنامهنويس در برابر آن كنش كاربر تأمين خواهد شد. در محيط جاوا ماجراي فوق با سناريوي كمي متفاوت انجام ميشود. تا اينجا بيان كرديم كه بر اثر كنش كاربر با نرمافزار توليد شده، رويدادهايي توليد يا صادر خواهند شد. اما برنامهنويس كدهاي مورد نظر خود را براي واكنش در برابر كنشهاي كاربر بايد كجا بنوسد؟ همانطور كه ميدانيد در زبان جاوا هيچ كدي در خارج از موجوديتي به نام كلاس معني و مفهوم نمييابد. در نتيجه در محيط جاوا براي آنكه مكاني براي قرار گرفتن چنين كدهايي در نظر گرفته شود، از مفهوم كلاسهايي بهنام Listener استفاده ميشود. وظيفه كلاس Listener همانطور كه از نام آنها مشخص است، آن است كه به رويدادها گوش فرا دهند و يا شايد بهتر باشد كه در فارسي بگوييم كه چشم به رويدادها داشته باشند. بدين ترتيب به محض آنكه رويدادي صادر گشت، كلاس Listener مربوطه بلافاصله تابع مشخصي را اجرا ميكند. اما كلاسListener مربوطه يعني چي؟ كدام كلاس Listener وظيفه دارد تا به رويداد مثلاً كليك شد شي A واكنش نشان دهد؟ در اينجا مفهوم register و يا ثبت شدن كلاسListener بر روي يك منبع رويداد مشخص مطرح ميشود ( اين مطلب را كمي بعد، مجدداً شرح خواهيم داد). فهرست رويدادها و آداپتورهاي Listener متناظر Listener type Act that results in the event ActionListener كليك بر روي يك شي، فشردن كليد Enter بر روي صفحه كليد در حالي كه كاربر دارد متني را در يك فيلد مشخص تايپ ميكند و يا انتخاب يك آيتم از يك منو WindowListener كاربر فريم يا پنجره اصلي را ميبندد MouseListener كاربر در حاليكه اشارهگر ماوس روي يك شي گرافيكي واقع شده است، يكي از كليدهاي ماوس را فشار ميدهد. MouseMotionListener كاربر اشارهگر ماوس را بر روي يك شي گرافيكي حركت ميدهد. ComponentListene يك شي گرافيكي در حالت visible قرار ميگيرد FocusListener يك شي گرافيكي در وضعيت انتخاب يا فوكوس واقع ميشود. ListSelectionListener ريتم انتخاب شده از يك جدول يا فهرست، تغيير ميكند. جدول 1 از طرف ديگر همانطور كه رويدادهاي گوناگون را ميتوان با در نظر گرفتن منبع آنها گروهبندي كرد، كلاس Listener نيز بر همين اساس به دستههايي تقسيم ميشوند. به عنوان مثال رويدادهاي كليك يك كليد، فشردن كليد Enter در زماني كه كاربر در حال تايپ در يك فيلد متني است و انتخاب يك آيتم از يك منو در يك گروه قرار ميگيرند و كلاس Listener اين گروه ActionListener نام دارد (براي درك آنكه چرا چنين رويدادهاي متفاوتي در يك گروه قرار گرفتهاند ميتوانيد به كادر <آيا جاوا براي كاربردهاي Enterprise . . . مراجعه نماييد). بدين ترتيب رويداد كليك ماوس بر روي يك كليد از ديگر رويدادهاي ماوس مانند ورود و خروج اشارهگر ماوس از محدوده هندسي يك كليد كه براي آنها كلاسListener ،MouseMotionListener تعريف شده است، تفكيك شده است. شكل 1 - تصويري از مفهوم منابع رويداد و آداپتورهاي EventListener در جاوا. براي مشاهده فهرست كاملتر گروهبنديهاي رويدادها و كلاس Listener متناظر آنها به جدول شماره 1 مراجعه نماييد. تا اينجا شايد از آنچه بيان شد، چنين تجسم كرده باشيد كه رويدادها همانند سيگنالهايي هستند كه فقط حامل خبر مربوط به وقوع خود را حمل ميكنند. مثلاً شايد تصور كرده باشيد كه يك رويداد، مشابه صداي يك بوق يا يك جرقه الكتريكي است كه پس از وقوع به سمت تمام اشياي ديگر انتشار مييابد. اگرچه چنين تصويري چندان دور از واقعيت موجود در دنياي جاوا نيست، اما با آن نيز تفاوتهاي اساسي دارد (حقيقت آن است كه ديدگاه برنامهنويسي قديمي و غير شيگرا و البته زبانهاي برنامهنويسي دوران مياني كه بينابين برنامهنويسي ساختيافته و به اصطلاح OOP قرار ميگيرند مثل VB و delphi باعث تقويت چنين نگاهي شده است). آيا جاوا براي كاربردهاي Enterprise مناسب تر از زبان هاي ديگر است؟ اگر كمي دقت كنيد، بهخاطر خواهيد آورد كه در بسياري از برنامههاي كاربردي، كاربر ميتواند پس از وارد كردن متن مشخصي در يك فيلد مثلاً نام كاربري خود - بهجاي كليك كردن بر روي كليد خاصي، فقط كليد Enter را بر روي صفحه كليد فشار دهد. اينكار همان نتيجه كليك با ماوس بر روي كليد مثلاً OK را خواهد داشت. به همين سبب موضوع قرار گرفتن رويدادهاي گروه فوق در يك دسته كاملاً منطقي خواهد بود. برنامهنويسان زبانهايي مانند VB يا Delphi ميدانند كه ايجاد يك عكسالعمل يكسان براي رويدادهاي كليك ماوس بر روي كليد A و يا فشردن كليد Enter بر روي صفحه كليد در زماني كه فلان فيلد متني در حال فوكوس است، لازم خواهد بود تا كمي با برنامه خود سر و كله بزنند و يا آنكه بهدنبال فايلهاي پروژههاي قبلي خود بگردند! اما ملاحظه ميكنيد كه در جاوا از قبل براي اين چنين موضوعي پيشبينيهاي لازم شده است و رويدادهاي اين دو كنش در يك گروه قرار گرفتهاند. خلاصه آنكه اگرچه در بسياري از موارد مشاهده ميكنيم كه بسياري از اعمال در زبانهاي برنامهنويسي غيرجاوا با سهولت زيادتري نسبت به زبان جاوا انجام ميشوند، اما در اعماق پروژهها ايدهها و تفكرات پيشرفتهاي در زبان جاوا ديده ميشوند كه باعث ميشود برنامهنويس جاوا در نهايت از آموختن اين زبان احساس رضايت داشته باشد. بدون آنكه بخواهيم بيش از حد به حاشيه برويم فقط اشاره ميكنيم كه مطلب فوق در موارد حرفهايتر بسيار چشمگيرتر است. مثلاً در كاربردهايي كه در ساختار آنها بهنوعي از بانكهاي اطلاعاتي استفاده شده است، امكانات و ابزارهاي پيشبيني شده در محيطهاي جاوا بهگونهاي هستند كه يك برنامهنويس اولاً تفاوتهاي سطوح نرمافزارها و برنامهنويسي معمولي را نسبت به موارد به اصطلاح سازماني يا Enterprise را دقيقاً لمس خواهد كرد و ثانياً مشاهده خواهد كرد كه نوشتن برنامههايي در سطوح بالا براي او كاملاً سهلتر از محيطهاي غيرجاوايي است. البته بايد يادآوري كنيم كه چنين قياسي فقط زماني ميتواند دقيق باشد كه تنها به ابزارهاي منفرد توجه كنيم. مسلماً در دنياي حرفهاي، ابزارهاي موسوم به third party براي هر يك از محيطهاي برنامهنويسي چنين ضعفهايي را پوشش خواهند داد و ديگر نميتوان بسادگي گذشته نتيجهگيري كرد. نخست آنكه در محيط جاوا يك رويداد، خود يك شي در نظر گرفته ميشود كه حاوي اطلاعاتي در مورد نوع رويداد و همچنين منبع آن است. به بخش a شكل شماره 1 نگاه كنيد. تفاوت ديگر مفهوم رويداد با تجسم ماهيت خبري آن در زبان جاوا آن است كه تمام رويدادها اصطلاحاً بهگوش همه اشيا نميرسد. در اين مورد همان مفهومي كه قبلاً به اختصار به آن اشاره شد، يعني موضوع register يا ثبت شدن هر كلاسListener بر روي شي يا اشياي خاص مجدداً مطرح ميشود. با نگاه به بخش b شكل 1 ميتوان اين موضوع بهصورت تصويري مشاهده كرد. همانطور كه در شكل b ديده ميشود، شي رويداد a فقط توسط كلاس Listener، به نام EventListener a، <شنيده> ميشود. به عبارت فني، كلاس Listener a بر روي رويداد a ثبت يا register شده است. خلاصه آنكه يك كلاس Listener ميتواند بر روي تعداد دلخواهي از منابع رويداد ثبت شود و بهطور معكوس نيز، منابع رويداد متعددي ميتوانند رويدادهاي خود را بسمت يك كلاس Listener هدايت كنند (شكل 1) Java Event Handler در اين مرحله ميخواهيم بدانيم كه آنچه تا كنون بيان كردهايم را چگونه ميتوان بهصورت كد پيادهسازي كرد. بهصورت كلي ميتوان چنين گفت كه در جاوا، هر Event Handler داراي سه بخش است: 1 - بخش declaration كلاس event handler كه در آن مشخص ميشود كه آيا اين كلاس قرار است تا اينترفيس يك listener را پيادهسازي كند و يا آنكه از راه توسعه (extending) يك كلاس ديگر كه در آن يك اينترفيس listener قبلاً پيادهسازي شده است، كار شود. مثلاً بهصورت زير: Public class MyClass implements ActionListener 2- بخش دوم، بخشي است كه وظيفه ثبت يا register كردن يك Instance از يك كلاس event handler را بر روي يك يا تعداد بيشتري از اشيا بر عهده دارد. اينكار بهصورت زير انجام ميشود: :(Somecomponent.addActionListener(instanceOfMyClas s 3- بخش آخر، قسمتي است كه كد واقعي آنچه كه قرار است در پاسخ به يك رويداد انجام شود در آن ثبت ميشود. به عنوان مثال: (Public void actionPerformed(ActionEvent e در عمل آنچه تا اين لحظه بيان شد، مطالبي بوده است كه بيشتر جنبه تئوري داشت. اما در عمل امروزه بيشتر برنامهنويسان جاوا در محيطهاي توسعه پيشرفتهاي كه براي اين منظور توليد شدهاند، كار ميكنند. در نتيجه بهتر خواهد بود تا از اينيجا به بعد با استفاده از محيطهاي توسعه جاوا به بحث خود ادامه دهيم. در ميان نرمافزارهاي شناخته شده و معروف توسعه پروژههاي جاوا، مانند Jbuilder ،Sun One Studio ،Visual Cafee و ديگر موارد، روش توليد سورس كد جاوا بسيار به يكديگر نزديك هستند. به همين دليل اگرچه در اين نوشته از نرمافزار JbuilderX استفاده شده است، اما نتيجه كار براي كاربران هر يك از نرمافزارهاي توسعه جاوا تقريباً تفاوتي نخواهد داشت. بهطور معمول براي نوشتن روتينهاي event handler جاوا، مرسوم است كه به يكي از دو روشي كه در ادامه به شرح آنها خواهيم پرداخت، عمل ميشود. قبلاً گفتيم كه در جاوا براي اتصال كد پاسخ رويداد به كنترلهاي مربوط به خود از كلاسهاي Listener استفاده ميشود كه در واژگان Jbuilder به آنها آداپتورهاي رويداد Event Adapter گفته ميشود. براي اين منظور ميتوان به دو روش عمل كرد. در روش نخست، از آداپتورهاي استاندارد استفاده ميشود و در روش دوم كلاسهاي دروني ناشناس آداپتور (anoymous inner class adapter) بهكار ميرود. يادآوري ميكنيم كه كلاسهاي ناشناس، به كلاسهايي گفته ميشوند كه بدون نام در درون كلاسهاي ديگر تعريف شدهاند. در روش استفاده از آداپتورهاي استاندارد، يك كلاس با نام توليد ميشود. مزيت عمده اين روش آن است كه چنين آداپتوري قابل استفاده مجدد خواهد بود. متقابلاً، در روش آداپتورهاي ناشناس كد <درجا> يا inline توليد ميشود. خاصيت اين روش آن است كه كدهاي توليد شده در برنامهها در اين روش خواناتر خواهند بود. زماني كه از آداپتور ناشناس استفاده ميكنيد، نرمافزارهاي توسعه برنامههاي جاوا تنها يك شي listenerو يك قالب آماده براي نوشتن كدهاي لازم براي پاسخدهي به رويداد توليد ميكنند. اما زماني كه از روش استاندارد استفاده ميكنيد، نرمافزارهاي توسعه مسئول توليد سه بخش زير خواهند بود: ● يك قالب يا stub براي نوشتن تابع event handling ● يك آداپتور رويداد event adapter ● يك event listener در موارد استفاده از روش استاندارد، نرمافزارهاي توسعه برنامههاي جاوا، بهطور معمول به ازاي هر جفت component و رويداد مرتبط به هم، يك نام تركيبي براي تابع event handler ميسازد. براي مشخصتر شدن موضوع بهتر است كه از يك مثال استفاده كنيم. در قطعه كد شماره 1، نرمافزار Jbuilder يك آداپتور رويداد بهنام ActionAdapter توليد كرده است. در مرحله بعد، نرمافزار توسعه جاوا در كد ديگري منبع رويداد ( كه در اينجا كليد JButton1 فرض شده است) را از طريق آداپتور بالا به تابع event handler برنامهنويس متصل ميسازد. اين كار توسط قطعه كد شماره 2 انجام ميشود. در كد شماره 2، تابع addActionListener نام آداپتور رويداد قبلي را به عنوان آرگومان دريافت ميكند. توجه داشته باشيد كه در اين مورد آداپتور رويداد بهصورت <درجا> ساخته ميشود و براي اينكار تابع سازنده (Constructor) از پارامتر this استفاده ميكند كه به فريم و شي رابط كاربر JButton1 اشاره ميكند. مقايسه كدهاي توليد شده در هر يك از اين روشها، ميتواند به روشنتر شدن مطلب كمك زيادي نمايد. به قطعه كد شماره 3 توجه كنيد. در اين قطعه كد (شماره 3) از روش آداپتور رويداد استاندارد استفاده شده است. در اينجا نرمافزار توسعه جاوا يك كلاس آداپتور ساخته است كه در آن اينترفيس ActionListener پيادهسازي ميشود. در مرحله بعد از اين كلاس يك Instance جديد ساخته ميشود و آنرا به عنوان يك Listener ثبت (Register) ميكند. مثلا در اينجا تابع ()addActionListener شي JButton1 با پارامتر ورودي آداپتور فراخواني ميشود. حالا بياييد كد فوق ( شماره 3) را با روش متناظر يعني استفاده از كلاسهاي دروني ناشناس مقايسه كنيم. در قطعه كد شماره 4 همان بخش از برنامه مجدداً بهكمك روش كلاسهاي ناشناس بازنويسي شده است. همانطور كه ديده ميشود، در اين نوع آداپتور رويداد، نيازي به ساختن يك آداپتور جداگانه نخواهد بو سایت ما را در گوگل محبوب کنید با کلیک روی دکمه ای که در سمت چپ این منو با عنوان +1 قرار داده شده شما به این سایت مهر تأیید میزنید و به دوستانتان در صفحه جستجوی گوگل دیدن این سایت را پیشنهاد میکنید که این امر خود باعث افزایش رتبه سایت در گوگل میشود
این صفحه را در گوگل محبوب کنید
[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 435]
-
گوناگون
پربازدیدترینها