جلسه ششم برنامه نویسی موبایل

در J2ME, Java, JAVA ME, MOBILE, جاوا, موبایل

جلسه ششم

خب جلسه قبل آخرش یه برنامه خیلی ساده نوشتیم که توش یه Gauge بود اونم به صورت غیر تعاملی که دو تا کامند داشت و با کامند ها می تونستیم مقدار Gauge رو تغییر بدیم و یه سری کارای دیگه

ولی مطمئنم که خیلی هاتون دوست داشتید که این برنامه رو با یه Gauge تعاملی (interactive)می نوشتیم که دیگه نیازی به اضافه کردن کامند نباشه ، اما چرا این کار رو نکردم؟؟؟ خب معلومه من کرمم زیاده خواستم یه کم سر کارتون بزارم :) معمولاً یه چیزی که برای مبتدی ها اتفاق می افته اینه که یه کد مثل زیر می نویسن و با مشکل مواجه می شن

 

  1. public void startApp() {
  2.  
  3. Form myForm=new Form("My Form");
  4. Gauge intGauge=new Gauge("G",true,9,2);
  5.  
  6. myForm.append(intGauge);
  7.  
  8. intGauge.setItemCommandListener(new ItemCommandListener() {
  9.  
  10. public void commandAction(Command c, Item item) {
  11. Gauge g=(Gauge)item;
  12. g.setLabel("AAAAAA");
  13. }
  14.  
  15. });
  16.  
  17. setCurrent(myForm);
  18.  
  19. }

خب اصلاً ببینیم که قراره این کد چی کار کنه (مثلاً )  و اینکه آیا واقعاً این کد اشکالی داره یا نه؟

تو خط چهار که یه Gauge ایجاد کردم ، این که هیچ ، چیزه مهمی نداره

خط ۶ هم اونو به فرم اضافه کردم که خب اینم مشکلی نداره

از خط ۸ به بعد مهمه ، اینجا یه ItemCommandListener به اون Gaugeای که داشتیم اضافه کردم که خیر سرم باهاش یه کاری بکنم

یعنی خیر سرمون خواستیم یه کد بزنیم که اگه مقدار Gauge عوض شد اونوقت عنوان Gauge که ابتدای برنامه Gهست به AAAAAA  تغییر کنه

جون خودتون یه بار دیگه به کد نگاه کنید تا قضیه بیاد دستتون

اینم خروجی برنامه

حالا هر چه قدر که دوست دارید با این Gauge سر و کله بزنید و باهاش ور برید عمراً اگه عنوانش عوض بشه یعنی هیچ جوره عنوانش نمیشه AAAAAA

چرا اونوقت؟

خب تا حدودی معلومه جواب ،ما که به Gauge امون Command اضافه نکردیم که بخواهیم بهش ItemCommandListener اضافه کنیم ، یعنی از اسم متد هم میشه فهمید که کار عبث کردیم ،ولی خب چی کار کنیم؟ خیر سرمون Gauge رو به صورت تعاملی (interactive) تعریف کردیم که دیگه کامند مامند اضافه نکنیم ، اگه قرار باشه بدون کامند هم کار نکنه که خیی ضایع است :)

در حقیقت اون چیزی که تغییر می کنه حالت (state) مربوط به Gaugeهست ، ولی هر چی تو متد های Gauge بگردید عمراً چیزه مفیدی پیدا کنید :دی :دی

پس چه کنیم؟

جواب اینه که باید دست به دامن فرم بشیم ، همون فرمی که Gauge رو بهش اضافه کردیم

Form یه متد به نام setItemStateListener داره که ازش برای این استفاده می کنیم که تغییرات state های Item هایی که به فرممون اضافه شده رو مدیریت کنیم ، خب Gauge هم یه Item هست که به فرم اضافه میشه دیگه

پس کد بالا رو باید به صورت زیر تغییر بدیم

این بار از سر لج می خوام عنوان رو بکنم BBBB

 

  1. public void startApp() {
  2.  
  3. Form myForm=new Form("My Form");
  4. Gauge intGauge=new Gauge("G",true,9,2);
  5.  
  6. myForm.append(intGauge);
  7.  
  8. myForm.setItemStateListener(new ItemStateListener() {
  9.  
  10. public void itemStateChanged(Item item) {
  11. Gauge g=(Gauge)item;
  12. g.setLabel("BBBB");
  13. }
  14. });
  15.  
  16. setCurrent(myForm);
  17.  
  18. }

حالا این دفعه این برنامه خوبه رو اجرا کنید

این خروجی اولیه اش

حالا یه کوچولو مقدار Gauge رو تغییر بدید تا مشاهده کنید که عنوانش عوض می شه

عنوانش عوض میشه :))) چه حالی

عکسش رو هم تمام صفحه گذاشتم که ببینید هیچ کامندی (Command) اضافه نشده ، برید حالش رو ببرید

خب حالا بریم اون برنامه آخریه که جلسه قبل نوشته بودیم رو با این روش بنویسیم که دیگه کامند هم نداشته باشه

 

  1. public void startApp() {
  2.  
  3. Form myForm=new Form("First Form");
  4. Gauge intGauge=new Gauge("Weak",true,9,2);
  5.  
  6. myForm.append(intGauge);
  7.  
  8.  
  9. myForm.setItemStateListener(new ItemStateListener() {
  10.  
  11. public void itemStateChanged(Item item) {
  12. Gauge g=(Gauge)item;
  13.  
  14. if(g.getValue()<4)
  15. g.setLabel("Weak");
  16. else if(g.getValue()<7){
  17. g.setLabel("Strong");
  18. }else{
  19. g.setLabel("Very Strong!");
  20. }
  21. }
  22.  
  23. });
  24.  
  25. setCurrent(myForm);
  26.  
  27. }

دیگه این که همون برنامه قبلی است با این تفاوت که به سبک درس امروز نوشتیمش ، پس نه خروجی می دم براش نه توضیح :دی

خب بریم که یه چیزای جدید معرفی کنم

StringItem

اینم یکی دیگه از زیر کلاسای Item   که میشه یه جورایی اونو مثله Label تو J2SE دونست

چیزه خاصی نداره فقط دو جور سازنده داریم براش

 

  1. public StringItem(String label, String text)
  2. public StringItem(String label, String text, int appearanceMode)

سازنده اولیه فقط دو تا رشته می گیره یکی واسه عنوان و یکی هم واسه متن

سازنده دومیه هم مثله سازنده اولیه است با این تفاوت که یه پارامتر اضافه می گیره که نحوه نمایش StringItem  رو مشخص می کنه که می تونه یکی از سه حالت زیر باشه

 

  1. Item.PLAIN
  2. Item.HYPERLINK
  3. Item.BUTTON

حالا مثال می زنیم بیشتر میاد دستمون ، البته چیزه خاصی نیست که بخواد بیاد دستمون :))

 

 

  1. public void startApp() {
  2.  
  3. Form myForm=new Form("MY FORM");
  4.  
  5. StringItem si=new StringItem("lbl","TXT");
  6.  
  7. myForm.append(si);
  8.  
  9. setCurrent(myForm);
  10.  
  11. }

اینم خروجیش ، البته این یه مورد از یه گوشی به یه گوشی دیگه زمین تا آسمون فرق داره

از اون سازنده دیگریه هم مثال می زنم ولی حتماً رو موبایل آزمایش کنید

 

  1. public void startApp() {
  2.  
  3. Form myForm=new Form("MY FORM");
  4.  
  5. StringItem si_pln=new StringItem("pln","Palin",Item.PLAIN);
  6. StringItem si_hypr=new StringItem("hypr","HyperLink",Item.HYPERLINK);
  7. StringItem si_btn=new StringItem("btn","Button",Item.BUTTON);
  8.  
  9.  
  10. myForm.append(si_pln);
  11. myForm.append(si_hypr);
  12. myForm.append(si_btn);
  13.  
  14.  
  15. setCurrent(myForm);
  16.  
  17. }

اینم خروجی غیر منتظره اش

می بینید که این سه تا هیچ فرقی با هم ندارن ، ولی خب این مشکل نیست ، حل میشه ،چون کامند ندارن اینجوریه ، اگه بهشون کامند (Command) اضافه کنیم درست می شن ،آدم میشن :))

پس بیایین بهشون کامند اضافه کنیم

 

  1. public void startApp() {
  2.  
  3. Form myForm=new Form("MY FORM");
  4.  
  5. StringItem si_pln=new StringItem("pln","Palin",Item.PLAIN);
  6. StringItem si_hypr=new StringItem("hypr","HyperLink",Item.HYPERLINK);
  7. StringItem si_btn=new StringItem("btn","Button",Item.BUTTON);
  8.  
  9. Command cmd_pln=new Command("P",Command.OK,0);
  10. Command cmd_hypr=new Command("H",Command.OK,0);
  11. Command cmd_btn=new Command("B",Command.OK,0);
  12.  
  13. si_pln.setDefaultCommand(cmd_pln);
  14. si_hypr.setDefaultCommand(cmd_hypr);
  15. si_btn.setDefaultCommand(cmd_btn);
  16.  
  17. myForm.append(si_pln);
  18. myForm.append(si_hypr);
  19. myForm.append(si_btn);
  20.  
  21.  
  22. setCurrent(myForm);
  23.  
  24. }

اینم خروجی آدمی زادیش

مثل همیشه یه جای کار می لنگه ، این دفعه اون StringItem که PLAIN بود با اون دیگریه که HYPERLINK بود فرقی نداره

چرا؟ خب اینجوریه دیگه ، منطقیش اینه که وقتی می گیم PAIN دیگه دنبال کامند و مامند و عملیاتی کردنش نباشیم مگرنه کرم داشتیم نوعش رو گذاشتیم PLAIN؟

پس اگه تو کد قبلی کامند رو بی خیال بشیم یعنی دو خطی که تو کد زیر هم مشخص شده گل بگیریم درست میشه ظاهرش

 

  1. public void startApp() {
  2.  
  3. Form myForm=new Form("MY FORM");
  4.  
  5. StringItem si_pln=new StringItem("pln","Palin",Item.PLAIN);
  6. StringItem si_hypr=new StringItem("hypr","HyperLink",Item.HYPERLINK);
  7. StringItem si_btn=new StringItem("btn","Button",Item.BUTTON);
  8.  
  9. //Command cmd_pln=new Command("P",Command.OK,0);
  10. Command cmd_hypr=new Command("H",Command.OK,0);
  11. Command cmd_btn=new Command("B",Command.OK,0);
  12.  
  13. //si_pln.setDefaultCommand(cmd_pln);
  14. si_hypr.setDefaultCommand(cmd_hypr);
  15. si_btn.setDefaultCommand(cmd_btn);
  16.  
  17.  
  18.  
  19. myForm.append(si_pln);
  20. myForm.append(si_hypr);
  21. myForm.append(si_btn);
  22.  
  23.  
  24. setCurrent(myForm);
  25.  
  26. }

اینم خروجیش

و اما متد های مثلاً مهم StringItem که توضیح نمی دم ،چون معلومه دیگه

 

  1. public String getText();
  2. public void setText(String txt);
  3. public String getLabel();
  4. public void setLabel(String lbl);

البته یه سری متد های دیگه هم هست ها ، باشه بعداً توضیح می دم

با اینکه این جلسه حرف خاصی نزدم ولی واقعاً الآن حسش نیست چیزه دیگه ای بنویسم ، اینه که ختم جلسه رو اعلام می کنم