الأحد، 11 أبريل 2010

الاستجابة للأحداث

ادارة ال Commands في النوافذ:
في موضوع اليوم سوف نتعرف على كيفية الاستجابة للأحداث باستخدام ال commands. تتم اضافة ال commands الى اي Displayable Class عن طريق الأمر التالي:

public void addCommand(Command cmd)
ويمكن حذفها باستخدام الأمر المضاد وهو:

public void removeCommand(Command cmd)
تعريف ال Commands:

Command c = new Command("OK", Command.OK, 0);
Command c = new Command(
"Run", // short label
"Run simulation", // long label
Command.SCREEN, // command type
0); // priority

يعتمد مكان ظهور ال Command في النافذة على ال نوع ال Command وعلى أولويتة وطبعا هي تختلف من من هاتف الى أخر. فعلى سبيل المثال في أجهزه ال Nokia جميع الأوامر السلبيه مثل Back, Exit, Cancel توضع على يمين الشاشة اما الأوامر الايجابيه Ok, Options تكون على يسار الشاشة والعكس تماما يحدث عند تشغيل البرنامج على هاتف Sony Ericsson. اذا كل ما علي فعله هو تحديد نوع ال Command وأهميته وسف يتولى الهاتف مهمه وضعه في المكان المناسب الذي اعتاده مستخدم الهاتف دون كتابه الكود بشكل مختلف لكل هاتف.

أنواع ال Commands:

Okلتأكيد الااختيار
Cancelالغاء عمليه معينه
Backالرجوع الى الشاشه السابقة
Stopايقاف العمليه الحاليه
Helpاظهار شاشة المساعدة
Screenأمر عام يستخدم لباقي الأومر

الاستجابة للأوامر:
أولا يحب اضاف المتنصت على النافذة المراد معالجة الأوامر عليها باستخدام الأمر التالي:

public void setListener(CommandListener l)
بعدها يجب كتابة ال commandAction() method التابعة للمتنصت.

مثال:

public class Commander extends MIDlet
implements CommandListener {
public void startApp() {
Displayable d = new TextBox(
"TextBox",
"Commander",
20,
TextField.ANY);

Command c =
new Command("Exit", Command.EXIT, 0);
d.addCommand(c);
d.setCommandListener( this );
Display.getDisplay(this).setCurrent(d);
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}

public void commandAction(Command c, Displayable d) {
destroyApp( true );
notifyDestroyed();
}

}
في السطور من 4-14 قمنا بتعريف نافذة واحدة وهي مربع نصي، ثم عرفنا Command واحد نوعة EXIT ثم اضفناة ال ى هذه النافذة. بعدها جعلنا ال Commander Class هو المتنصت على الأحداث. ثم عرضنا النفذة على شاشة الهاتف.

في السطور 24-25 استجبنا للأمر Exit الذي سوف يقوم باستدعاء commandAction عندما يقوم المستخدم بالضغط عليه وبالتالي الخروج من البرنامج عن طريق notifyDestroyed.

الان ماذا لو كان هناك أكثر من أمر فكيف لي أن أحدد الأمر الذي تم طلبه من المستخدم. ماذا لو تمت اضافه نفس الامر لأكثر من نافذة يشتركون في نفس المتنصت فكيف لي أن أعرف النافذة التي وقع فيها الحدث. يمكن حل الاشكالين السابقين باستخدام المتغيرات المرسلة لل commandAction() حيث أن الأول يمثل الأمر الذي طلبه المستخدم تحديدا والثاني يمثل النافذة التي وقع عليه الحدث فلة كان عندي نافذه بها مجموعه من الأوامر يمكنني حل المشكله كالتالي:
public void commandAction(Command c, Displayable d) {
if( c == cmdExit ) {
destroyApp(true);
notifyDestroyed();

} else if( c == cmd1 ) {
// do action1

} else if( c == cmd2 ) {
// do action2

} else if( c == cmd3 ) {
// do action3

}
}

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

إرسال تعليق