جلسه هفتم برنامه نویسی موبایل

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

جلسه هفتم

باز سلام

جلسه قبل یه نموره پیچوندم ،الآن می خوام جبران کنم :) ، چیه مگه؟

خب برای شروع یه متد از اون متد های StringItem رو که پیچوندم توضیح می دم

 

  1. public void setFont(Font font)

از این متد برای تنظیم فونت اضافه می کنیم ،ولی خب قبلش باید یه فونت ایجاد کنیم ، برای ایجاد فوت به صورت زیر عمل می کنیم

 

Font myFont=Font.getFont(face,style,size);

faceو style و size هر سه تا از نوع int  هستن

face می تونه یکی از موارد زیر باشه

 

  1. Font.FACE_SYSTEM
  2. Font.FACE_MONOSPACE
  3. Font.FACE_PROPORTIONAL

حالا faceچی هست؟ خب face شبیه همون اسامی ای هست که تو برنامه های واژه پرداز انتخاب می کنید ، اونجا کلی اسم هست که می تونید انتخاب کنید (اسم فونت) ولی اینجا محدودید به همین سه تا انتخاب ،ولی این سه تا چی هستن؟

FACE_SYSTEM یعنی بزارید که فونت رو بر اون دستگاه موبایلی که براش برنامه می نویسید انتخاب کنه ، به عبارتی همون فونت سیستم هست دیگه

FACE_MONOSPACE‌ فونتی هست که عرض همه حروف توش برابره

FACE_PROPRTIONAL‌هم فونتیه که عرض حروف متناسب با شکلشونه ُ مثلاً عرض W از عرض A بیشتره و عرض A از عرض I بیشتره

style هم می تونه یکی از موارد زیر باشه ، یا ترکیبی از موارد زیر ، برای ترکیب کردن می تونیم از OR(|)استفاده  کنیم

 

  1. Font.STYLE_PLAIN
  2. Font.STYLE_BOLD
  3. Font.STYLE_ITALIC
  4. Font.STYLE_UNDERLINED

دیگه اینا که از اسمشون معلومه چی هستن :)

size هم می تونه یکی از موارد زیر باشه

 

  1. Font.SIZE_SMALL
  2. Font.SIZE_MEDIUM
  3. Font.SIZE_LARGE

اصلاً مثال می زنیم ، چه کاریه؟ ،والا، با مثال که خیلی بهتره

 

  1. public void startApp() {
  2.  
  3. Form myForm=new Form("MY FORM");
  4.  
  5. Font f1=Font.getFont(Font.FACE_MONOSPACE,
  6. Font.STYLE_PLAIN,
  7. Font.SIZE_LARGE);
  8.  
  9. Font f2=Font.getFont(Font.FACE_PROPORTIONAL,
  10. Font.STYLE_PLAIN,
  11. Font.SIZE_LARGE);
  12.  
  13. Font f3=Font.getFont(Font.FACE_PROPORTIONAL,
  14. Font.STYLE_UNDERLINED,
  15. Font.SIZE_LARGE);
  16.  
  17. Font f4=Font.getFont(Font.FACE_PROPORTIONAL,
  18. Font.STYLE_BOLD | Font.STYLE_ITALIC,
  19. Font.SIZE_MEDIUM);
  20.  
  21.  
  22. StringItem si1=new StringItem("si1:","WAITING FOR...");
  23. si1.setFont(f1);
  24.  
  25. StringItem si2=new StringItem("si2:","WAITING FOR...");
  26. si2.setFont(f2);
  27.  
  28. StringItem si3=new StringItem("si3:","WAITING FOR...");
  29. si3.setFont(f3);
  30.  
  31. StringItem si4=new StringItem("si4:","WAITING FOR...");
  32. si4.setFont(f4);
  33.  
  34.  
  35.  
  36. myForm.append(si1);
  37. myForm.append(si2);
  38. myForm.append(si3);
  39. myForm.append(si4);
  40.  
  41. setCurrent(myForm);
  42.  
  43. }

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

اینم خروجیش

Layout بندی

یکی از چیزایی که گاهی واسه آدم مهه اینه که آیتم هایی که به یه فرم اضافه می کنه درست درمون چیده شن ، برای اینکار باید Layout‌بندی کنیم ،البته اینجا خیلی نمیشه انتظار چیزه خارق العاده ای داشت ولی خب  باز یه کارایی میشه کرد

برای تنظیم Layout باید از متد setLayout استفاده کنیم ، این متد مال Item هست و زیر کلاس هاش این متد رو به ارث می برن

چون تا اینجا آیتم های چندانی رو باهاشون آشنا نشدیم ،من فقط از StringItem برای معرفی این متد استفاده می کنم ولی توجه کنید که بقیه آیتم ها هم این متد رو دارن

Layout  می تونه یکی از موارد زیر یا ترکیبی از اونا باشه

 

 

 

  1. Item.LAYOUT_BOTTOM
  2. Item.LAYOUT_CENTER
  3. Item.LAYOUT_DEFAULT
  4. Item.LAYOUT_EXPAND
  5. Item.LAYOUT_LEFT
  6. Item.LAYOUT_NEWLINE_AFTER
  7. Item.LAYOUT_NEWLINE_BEFORE
  8. Item.LAYOUT_RIGHT
  9. Item.LAYOUT_SHRINK
  10. Item.LAYOUT_TOP
  11. Item.LAYOUT_VCENTER
  12. Item.LAYOUT_VEXPAND
  13. Item.LAYOUT_VSHRINK

می بینید که الکی الکی هم این موارد زیاد هستن و آخرش هم انعطاف پذیری آنچنانی به ارمغان نمیارن

همشون رو هم نمی گم چون خیلی زیادن و از اسمشون هم خیلی چیزا میشه فهمید و نکته مهم این که وقتی می خواهید Layout‌بندی کنید باید خیلی با اینا ور برید تا اون چیزی که تو ذهنتون هست در بیاد

ولی یه چند تا رو توضیح می دم

مثلاً LAYOUT_CENTER کاری می کنه که آیتم مورد نظر بیفته وسط صفحه ،می گم وسط صفحه یعنی به صورت افقی در وسط قرار بگیره ، اونایی که یه دونه حرف Vاضافه دارن کاری می کنن که آیتم به صورت عمودی وسط قرار بگیره که معمولاً هم به کار نمیان

LAYOUT_LEFT آیتم رو به زور میزاره سمت چپ

LAYOUT_NEWLINE_AFTER آیتم رو بعد از آخرین ایتمی که قبل از این آیتم فعلی اضافه شده بود قرار میده و اگر آیتم بعدی ای در کار باشه ،اون آیتم بعدی تو خط بعد قرار می گیره

LAYOUT_EXPAND هم باعث میشه آیتم کش بیاد

و ...

هیچی مثال نمیشه

پس دست به دامن مثال میشیم

چیدمان بدون Layout بندی

 

  1. public void startApp() {
  2.  
  3. Form myForm=new Form("MY FORM");
  4.  
  5.  
  6. StringItem si1=new StringItem("si1:","A");
  7.  
  8. StringItem si2=new StringItem("si2:","B");
  9.  
  10. StringItem si3=new StringItem("si3:","C");
  11.  
  12. StringItem si4=new StringItem("si4:","D");
  13.  
  14.  
  15.  
  16. myForm.append(si1);
  17. myForm.append(si2);
  18. myForm.append(si3);
  19. myForm.append(si4);
  20.  
  21. setCurrent(myForm);
  22.  
  23. }

خروجی

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

 

 

  1. public void startApp() {
  2.  
  3. Form myForm=new Form("MY FORM");
  4.  
  5.  
  6. StringItem si1=new StringItem("","A");
  7. si1.setLayout(Item.LAYOUT_EXPAND);
  8.  
  9. StringItem si2=new StringItem("","B");
  10. si2.setLayout(Item.LAYOUT_CENTER);
  11.  
  12. StringItem si3=new StringItem("","C");
  13. si3.setLayout(Item.LAYOUT_LEFT);
  14.  
  15. StringItem si4=new StringItem("","");
  16. si4.setLayout(Item.LAYOUT_EXPAND);
  17.  
  18. StringItem si5=new StringItem("","D");
  19.  
  20. StringItem si6=new StringItem("","E");
  21.  
  22. StringItem si7=new StringItem("","F");
  23. si7.setLayout(Item.LAYOUT_RIGHT);
  24.  
  25.  
  26.  
  27.  
  28.  
  29. myForm.append(si1);
  30. myForm.append(si2);
  31. myForm.append(si3);
  32. myForm.append(si4);
  33. myForm.append(si5);
  34. myForm.append(si6);
  35. myForm.append(si7);
  36.  
  37. setCurrent(myForm);
  38.  
  39. }

خروجیش رو ببینیم بعد من توضیح بدم

قاطی پاتی توضیح بدم بهتر معلوم میشه چی کار کردیم

اولیش که si1هست و عنوانش A هست کش اومده چون از LAYOUT_EXPAND استفاده کردیم

دومیش چون از LAYOUT_CENTER استفاده کردیم رفت وسط ، در ضمن هر بار که یه LAYOUTاستفاده می کنیم آیتم مورد نظر میره خط بعد

مثلاُ si7 که عنوانش F هست رو با LAYOUT_RIGHT تنظیم کردیم ، علاوه بر اینکه این آیتم رفت سمت راست به خط جدید هم رفت

خب حالا اگه بخواهیم یه آیتم رو ببریم سمت راست ولی نره خط جدید چی کار کنیم؟

اینجاست که باید کلک زد ، مثلاً به D  و E نگاه کنید ، اینا آیتم های si5  و si6‌هستن که اصلاً براشون Layout‌تنظیم نکردیم

پس اینا به طور پیش فرض می رن پشت سره Cکه si3 هست ، ولی اینا رفتن سمت راست، چی جوری؟ خب معلومه یه دونه آیتم ایجاد کردم همون si4 و اون رو با LAYOUT_EXPAND تنظیم کردم ، گرفتید چی شد؟ببینید اصلاً si4 هیچی نداره ها ، نه text و نه label

و اما یه نکته فنی: اگه توجه کرده باشید آرگومان اول همه StringItem ها رو خالی گذاشتم ، چرا؟ خب این دیگه با خودتون ، مثلاً تو این مثال برای آرگومان اول StringItem‌ها یه چیزی بنویسید یا تو مثال قبلی همه آرگومان های اول رو خالی بزارید تا ببینید چه می شود

بسه ، دیگه بریم که با یه سری آیتم جدید آشنا شیم

TextField

TextBox رو که یادتونه ، قبلاً توضیح دادم ، این هم مثل اونه با این تفاوت که اون تمام صفحه بود و زیر کلاس Screenاین یکی زیر کلاسه Item هست و به فرم اضافه میشه ، همه متد هاش هم شبیه همون TextBox هست که قبلاً گفتم برای همین دیگه متد هاش رو توضیح نمی دم

فقط سازنده اش رو بدونید که به صورت زیره

 

public TextField(String label,String text,int maxSize, int constraints)

می بینید که پارامتر اول اینجا بهش می گیم label تو TextBox بهش می گفتیم title

مثال

 

  1. public void startApp() {
  2.  
  3. Form myForm=new Form("MY FORM");
  4.  
  5.  
  6.  
  7. TextField txtUser=new TextField("user name:","",20,TextField.ANY);
  8. txtUser.setLayout(Item.LAYOUT_EXPAND);
  9.  
  10. TextField txtPass=new TextField("password :","", 20,TextField.PASSWORD);
  11. txtPass.setLayout(Item.LAYOUT_EXPAND);
  12.  
  13.  
  14. myForm.append(txtUser);
  15. myForm.append(txtPass);
  16.  
  17. setCurrent(myForm);
  18.  
  19. }

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

ChoiceGroup

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

دو تا سازنده داره این کلاس که به صورت زیر هستن

 

 

 

  1. public ChoiceGroup(String label, int choiceType)
  2. public ChoiceGroup(String label, int choiceType,
  3. String[] stringElements, Image[] imageElements)

a

با سازنده اولیه ، اول ChoiceGroup رو ایجاد می کنیم بعداً عناصرش رو بهش اضافه می کنیم

با سازنده دومیه همون اول همه عناصرش رو به صورت آرایه به سازنده اش ارسال می کنیم ، هیچ فرقی هم نمی کنه در عمل از کدوم سازنده استفاده کنیم چون در عمل هر وقت که خواستیم می تونیم به ChoiceGroup‌عنصر اضافه کنیم یا ازش عنصر حذف کنیم

پارامتر دوم که نوع لیست انتخاب رو تعیین می کنه می تونه یکی از موارد زیر باشه

  1. Choice.EXCLUSIVE
  2. Choice.MULTIPLE
  3. Choice.POPUP

حواستون باشه که اینجا نمیشه از Choice.IMPLICIT استفاده کرد ، فحش می ده!

 

متد هاش اینان

 

  1. public int append(String stringElement,Image imageElement);

این متد یه عنصر جدید به لیست انتخاب اضافه می کنه ، برای این عنصر جدید علاوه بر اسمش می تونیم یه عکس هم تعیین کنیم که فعلاً این کار رو نمی کنیم و کار با عکس باشه بعداً

 

  1. public void delete( int index);

index امین عنصر لیست انتخاب رو حذف می کنه

 

  1. public Image getImage( int i);

چی بگم ؟ :)

 

  1. public int getSelectedFlags(boolean[] flagsArr);

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

 

  1. public int getSelectedIndex()

وقتی لیست انتخاب از نوع EXCLUSIVE یا POPUPباشه چون فقط یه عنصر میشه انتخاب کرد می تونیم از این متد برای تعیین عنصر انتخاب شده استفاده کنیم اگه هیچ عنصری انتخاب نشده باشه یا لیست انتخاب از نوع MULTIPLE باشه اون وقت این متد منفی یک بر می گردونه

بقیه متد ها رو هم توضیح نمی دم ،معلومن قشنگ ، به جان خودم :))

 

  1. public String getString( int i);
  2. public void insert(int index, String stringElement,Image imageElement);
  3. public boolean isSelected( int index);
  4. public void set(int index, String stringElement,Image imageElement);
  5. public void setSelectedFlags(boolean[] selectedArray);
  6. public void setSelectedIndex(int index, boolean selected);
  7. public int size();

 

حالا وقته مثاله

مثال

 

 

  1. public void startApp() {
  2.  
  3. Form myForm=new Form("MY FORM");
  4.  
  5. ChoiceGroup cg=new ChoiceGroup("CG !",Choice.EXCLUSIVE);
  6.  
  7. cg.append("A", null);
  8. cg.append("B", null);
  9. cg.append("C", null);
  10. cg.append("D", null);
  11.  
  12. myForm.append(cg);
  13.  
  14. setCurrent(myForm);
  15.  
  16. }

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

باز هم مثال

 

  1. public void startApp() {
  2.  
  3. Form myForm=new Form("MY FORM");
  4.  
  5. ChoiceGroup cg=new ChoiceGroup("CG !",Choice.MULTIPLE);
  6.  
  7. cg.append("A", null);
  8. cg.append("B", null);
  9. cg.append("C", null);
  10. cg.append("D", null);
  11.  
  12. myForm.append(cg);
  13.  
  14. setCurrent(myForm);
  15.  
  16. }

و یه مثال هم از حالتی که POPUP باشه

 

  1. public void startApp() {
  2.  
  3. Form myForm=new Form("MY FORM");
  4.  
  5. ChoiceGroup cg=new ChoiceGroup("CG !",Choice.POPUP);
  6.  
  7. cg.append("A", null);
  8. cg.append("B", null);
  9. cg.append("C", null);
  10. cg.append("D", null);
  11.  
  12. myForm.append(cg);
  13.  
  14. setCurrent(myForm);
  15.  
  16. }

 

وقتی حالت لیست انتخاب رو می زاریم رو POPUP اونوقت به صورت یه منوی شناور نشون داده میشه

این خروجیش

حالا اگه منو رو بزنید خروجی اینجوری میشه

می بینید که یه کامند Cancel هم به صورت خودکار ظاهر میشه تا اگه نخواستیم گزینه ای رو انتخاب کنیم ازش استفاده کنیم

اگه یادتون باشه قبلاً List رو گفته بودم که شبیه همین ChoiceGroupبود با این تفاوت که List زیر کلاس Screen هست و تمام صفحه یعنی کل صفحه رو پر می کنه ولی ChoiceGroup زیر کلاس Item هست و به فرم اضافه میشه و می تونه کنار عناصر دیگری باشه

مثال

 

  1. public void startApp() {
  2.  
  3. Form myForm=new Form("MY FORM");
  4.  
  5.  
  6.  
  7. TextField txtUser=new TextField("user name:","",20,TextField.ANY);
  8. txtUser.setLayout(Item.LAYOUT_EXPAND);
  9.  
  10. TextField txtPass=new TextField("password :","", 20,TextField.PASSWORD);
  11. txtPass.setLayout(Item.LAYOUT_EXPAND);
  12.  
  13.  
  14. ChoiceGroup cg=new ChoiceGroup("",Choice.EXCLUSIVE);
  15.  
  16. cg.append("male", null);
  17. cg.append("female", null);
  18. cg.append("unknown", null);
  19.  
  20. Command cmdSave=new Command("SAVE",Command.OK,0);
  21.  
  22.  
  23. myForm.append(txtUser);
  24. myForm.append(txtPass);
  25. myForm.append(cg);
  26. myForm.addCommand(cmdSave);
  27.  
  28. setCurrent(myForm);
  29.  
  30. }

خروجی

خب برای این جلسه هم کافیه ، خسته نباشید :)))

 

نظرات

5 ماه از فروردین گذشته چرا

5 ماه از فروردین گذشته چرا دیگه مطلب نمیزارید !!! حیفش بود :(

داداش دمت گرم باشه خیلی خوب

داداش دمت گرم باشه خیلی خوب بود ، ادامه نمیدی دیگه ؟ اگه امکان داره منابع رو هم بگید ممنون میشم.

 

سلام ادامه که حتماً می دم چون

سلام

ادامه که حتماً می دم چون مباحث مهمی مثل ای پی آی های سطح پایین و بازی سازی و ... مونده که هنوز نگفتم منتهی چون مدتیه  خوردم به بی برنامگی یه نموره سرعت مطلب گذاشتنم کند شده (البته از یه نموره بیشتر:دی) حتماً از آر اس اس سایت استفاده کنید ،منبع هم بهترین منبع مستندات خود جاواست به علاوه اینترنت ولی خب دو تا کتاب زیر هم خوبن

J2ME IN NUTSHELL-Kim Topley

J2ME and Gaming-Jason Lam